Unify mdoc_deroff() and man_deroff() into a common function deroff().
authorschwarze <schwarze@openbsd.org>
Thu, 23 Apr 2015 16:17:04 +0000 (16:17 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 23 Apr 2015 16:17:04 +0000 (16:17 +0000)
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.

usr.bin/mandoc/man.c
usr.bin/mandoc/man.h
usr.bin/mandoc/mandocdb.c
usr.bin/mandoc/mdoc.c
usr.bin/mandoc/mdoc.h
usr.bin/mandoc/mdoc_validate.c
usr.bin/mandoc/roff.c
usr.bin/mandoc/roff.h

index 3d20cd9..90916a4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man.c,v 1.110 2015/04/23 15:35:39 schwarze Exp $ */
+/*     $OpenBSD: man.c,v 1.111 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -316,49 +316,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;
-}
index 9ce7170..cbd15b0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man.h,v 1.54 2015/04/18 17:50:02 schwarze Exp $ */
+/*     $OpenBSD: man.h,v 1.55 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -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
index 01dc61f..b51886a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mandocdb.c,v 1.146 2015/04/18 17:50:02 schwarze Exp $ */
+/*     $OpenBSD: mandocdb.c,v 1.147 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1458,7 +1458,7 @@ parse_man(struct mpage *mpage, const struct roff_meta *meta,
                         */
 
                        title = NULL;
-                       man_deroff(&title, body);
+                       deroff(&title, body);
                        if (NULL == title)
                                return;
 
@@ -1702,7 +1702,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);
 }
 
index 6dc9d7d..05952a2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc.c,v 1.140 2015/04/23 15:35:39 schwarze Exp $ */
+/*     $OpenBSD: mdoc.c,v 1.141 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -505,42 +505,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;
-}
index 5f77345..28669f4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc.h,v 1.66 2015/04/18 17:50:02 schwarze Exp $ */
+/*     $OpenBSD: mdoc.h,v 1.67 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -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
index 0063abd..0c664f6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_validate.c,v 1.206 2015/04/20 09:48:19 schwarze Exp $ */
+/*     $OpenBSD: mdoc_validate.c,v 1.207 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -960,7 +960,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,
@@ -1874,7 +1874,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. */
@@ -2123,7 +2123,7 @@ post_dd(POST_ARGS)
        }
 
        datestr = NULL;
-       mdoc_deroff(&datestr, n);
+       deroff(&datestr, n);
        if (mdoc->quick)
                mdoc->meta.date = datestr;
        else {
@@ -2258,7 +2258,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;
 
index 2397834..d82eb79 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.c,v 1.140 2015/04/19 14:57:16 schwarze Exp $ */
+/*     $OpenBSD: roff.c,v 1.141 2015/04/23 16:17:04 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1228,6 +1228,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 ---------------------------------- */
 
 /*
index 50ae42a..478c835 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.h,v 1.15 2015/04/19 13:59:37 schwarze Exp $      */
+/*     $OpenBSD: roff.h,v 1.16 2015/04/23 16:17:04 schwarze Exp $      */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -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