diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2015-04-23 16:17:44 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2015-04-23 16:17:44 +0000 |
commit | 16ee2910b2d5d0fad6b303e92efff26c0543db03 (patch) | |
tree | 83bd6cef6324bc9f9a440072d5a4d594703e057a | |
parent | 48b896d8e54fb00900d8be7283d92985cdcdb0f5 (diff) | |
download | mandoc-16ee2910b2d5d0fad6b303e92efff26c0543db03.tar.gz |
Unify mdoc_deroff() and man_deroff() into a common function deroff().
No functional change except that for mdoc(7), it now skips leading
escape sequences just like it already did for man(7).
Escape sequences rarely occur in mdoc(7) code and if they do,
skipping them is an improvement in this context.
Minus 30 lines of code.
-rw-r--r-- | man.c | 46 | ||||
-rw-r--r-- | man.h | 1 | ||||
-rw-r--r-- | mandocdb.c | 4 | ||||
-rw-r--r-- | mdoc.c | 39 | ||||
-rw-r--r-- | mdoc.h | 8 | ||||
-rw-r--r-- | mdoc_validate.c | 8 | ||||
-rw-r--r-- | roff.c | 46 | ||||
-rw-r--r-- | roff.h | 6 |
8 files changed, 58 insertions, 100 deletions
@@ -318,49 +318,3 @@ man_mparse(const struct roff_man *man) assert(man && man->parse); return(man->parse); } - -void -man_deroff(char **dest, const struct roff_node *n) -{ - char *cp; - size_t sz; - - if (n->type != ROFFT_TEXT) { - for (n = n->child; n; n = n->next) - man_deroff(dest, n); - return; - } - - /* Skip leading whitespace and escape sequences. */ - - cp = n->string; - while ('\0' != *cp) { - if ('\\' == *cp) { - cp++; - mandoc_escape((const char **)&cp, NULL, NULL); - } else if (isspace((unsigned char)*cp)) - cp++; - else - break; - } - - /* Skip trailing whitespace. */ - - for (sz = strlen(cp); sz; sz--) - if (0 == isspace((unsigned char)cp[sz-1])) - break; - - /* Skip empty strings. */ - - if (0 == sz) - return; - - if (NULL == *dest) { - *dest = mandoc_strndup(cp, sz); - return; - } - - mandoc_asprintf(&cp, "%s %*s", *dest, (int)sz, cp); - free(*dest); - *dest = cp; -} @@ -64,6 +64,5 @@ __BEGIN_DECLS struct roff_man; const struct mparse *man_mparse(const struct roff_man *); -void man_deroff(char **, const struct roff_node *); __END_DECLS @@ -1476,7 +1476,7 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta, */ title = NULL; - man_deroff(&title, body); + deroff(&title, body); if (NULL == title) return; @@ -1720,7 +1720,7 @@ parse_mdoc_Nd(struct mpage *mpage, const struct roff_meta *meta, { if (n->type == ROFFT_BODY) - mdoc_deroff(&mpage->desc, n); + deroff(&mpage->desc, n); return(0); } @@ -507,42 +507,3 @@ mdoc_isdelim(const char *p) return(DELIM_NONE); } - -void -mdoc_deroff(char **dest, const struct roff_node *n) -{ - char *cp; - size_t sz; - - if (n->type != ROFFT_TEXT) { - for (n = n->child; n; n = n->next) - mdoc_deroff(dest, n); - return; - } - - /* Skip leading whitespace. */ - - for (cp = n->string; '\0' != *cp; cp++) - if (0 == isspace((unsigned char)*cp)) - break; - - /* Skip trailing whitespace. */ - - for (sz = strlen(cp); sz; sz--) - if (0 == isspace((unsigned char)cp[sz-1])) - break; - - /* Skip empty strings. */ - - if (0 == sz) - return; - - if (NULL == *dest) { - *dest = mandoc_strndup(cp, sz); - return; - } - - mandoc_asprintf(&cp, "%s %*s", *dest, (int)sz, cp); - free(*dest); - *dest = cp; -} @@ -279,11 +279,3 @@ extern const char *const *mdoc_macronames; /* Names of macro args. Index is enum mdocargt. */ extern const char *const *mdoc_argnames; - -__BEGIN_DECLS - -struct roff_man; - -void mdoc_deroff(char **, const struct roff_node *); - -__END_DECLS diff --git a/mdoc_validate.c b/mdoc_validate.c index 616e9b10..6c9fff89 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -969,7 +969,7 @@ post_nm(POST_ARGS) if (NULL != mdoc->meta.name) return; - mdoc_deroff(&mdoc->meta.name, n); + deroff(&mdoc->meta.name, n); if (NULL == mdoc->meta.name) mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, @@ -1883,7 +1883,7 @@ post_sh_head(POST_ARGS) secname = NULL; sec = SEC_CUSTOM; - mdoc_deroff(&secname, mdoc->last); + deroff(&secname, mdoc->last); sec = NULL == secname ? SEC_CUSTOM : a2sec(secname); /* The NAME should be first. */ @@ -2132,7 +2132,7 @@ post_dd(POST_ARGS) } datestr = NULL; - mdoc_deroff(&datestr, n); + deroff(&datestr, n); if (mdoc->quick) mdoc->meta.date = datestr; else { @@ -2267,7 +2267,7 @@ post_os(POST_ARGS) free(mdoc->meta.os); mdoc->meta.os = NULL; - mdoc_deroff(&mdoc->meta.os, n); + deroff(&mdoc->meta.os, n); if (mdoc->meta.os) goto out; @@ -1230,6 +1230,52 @@ roff_node_delete(struct roff_man *man, struct roff_node *n) roff_node_free(n); } +void +deroff(char **dest, const struct roff_node *n) +{ + char *cp; + size_t sz; + + if (n->type != ROFFT_TEXT) { + for (n = n->child; n != NULL; n = n->next) + deroff(dest, n); + return; + } + + /* Skip leading whitespace and escape sequences. */ + + cp = n->string; + while (*cp != '\0') { + if ('\\' == *cp) { + cp++; + mandoc_escape((const char **)&cp, NULL, NULL); + } else if (isspace((unsigned char)*cp)) + cp++; + else + break; + } + + /* Skip trailing whitespace. */ + + for (sz = strlen(cp); sz; sz--) + if ( ! isspace((unsigned char)cp[sz-1])) + break; + + /* Skip empty strings. */ + + if (sz == 0) + return; + + if (*dest == NULL) { + *dest = mandoc_strndup(cp, sz); + return; + } + + mandoc_asprintf(&cp, "%s %*s", *dest, (int)sz, cp); + free(*dest); + *dest = cp; +} + /* --- main functions of the roff parser ---------------------------------- */ /* @@ -157,3 +157,9 @@ struct roff_man { enum roff_sec lastnamed; /* Last standard section seen. */ enum roff_next next; /* Where to put the next node. */ }; + +__BEGIN_DECLS + +void deroff(char **, const struct roff_node *); + +__END_DECLS |