summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-04-23 16:17:44 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-04-23 16:17:44 +0000
commit16ee2910b2d5d0fad6b303e92efff26c0543db03 (patch)
tree83bd6cef6324bc9f9a440072d5a4d594703e057a
parent48b896d8e54fb00900d8be7283d92985cdcdb0f5 (diff)
downloadmandoc-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.c46
-rw-r--r--man.h1
-rw-r--r--mandocdb.c4
-rw-r--r--mdoc.c39
-rw-r--r--mdoc.h8
-rw-r--r--mdoc_validate.c8
-rw-r--r--roff.c46
-rw-r--r--roff.h6
8 files changed, 58 insertions, 100 deletions
diff --git a/man.c b/man.c
index 5813ac92..c0d245da 100644
--- a/man.c
+++ b/man.c
@@ -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;
-}
diff --git a/man.h b/man.h
index 8e29f2f8..8d2fdea9 100644
--- a/man.h
+++ b/man.h
@@ -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
diff --git a/mandocdb.c b/mandocdb.c
index c367f443..e89dc164 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -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);
}
diff --git a/mdoc.c b/mdoc.c
index 25b6f0a5..3ecf1f89 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -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;
-}
diff --git a/mdoc.h b/mdoc.h
index b73b99a6..e1abc40f 100644
--- a/mdoc.h
+++ b/mdoc.h
@@ -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;
diff --git a/roff.c b/roff.c
index b3f5752a..ca0f85a4 100644
--- a/roff.c
+++ b/roff.c
@@ -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 ---------------------------------- */
/*
diff --git a/roff.h b/roff.h
index cf29d6d1..750ccbe2 100644
--- a/roff.h
+++ b/roff.h
@@ -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