]> git.cameronkatri.com Git - mandoc.git/commitdiff
Use the freshly improved roff_getname() function
authorIngo Schwarze <schwarze@openbsd.org>
Sun, 29 Jun 2014 22:38:47 +0000 (22:38 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sun, 29 Jun 2014 22:38:47 +0000 (22:38 +0000)
for the .de parsing routine, roff_block(),
to correctly handle names terminated by escape sequences.
Besides, this saves us 20 lines of code.

roff.c

diff --git a/roff.c b/roff.c
index 2b01f5936ffd25b784b0967724251a4b23deff56..91448da3bfc53af8fed6103baea0e0729439c15f 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.212 2014/06/29 22:14:10 schwarze Exp $ */
+/*     $Id: roff.c,v 1.213 2014/06/29 22:38:47 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -910,14 +910,14 @@ roff_ccond(struct roff *r, int ln, int ppos)
 static enum rofferr
 roff_block(ROFF_ARGS)
 {
 static enum rofferr
 roff_block(ROFF_ARGS)
 {
-       int             sv;
-       size_t          sz;
-       char            *name;
+       char            *name, *cp;
+       size_t           namesz;
 
 
-       name = NULL;
+       name = cp = *bufp + pos;
+       namesz = 0;
 
        if (ROFF_ig != tok) {
 
        if (ROFF_ig != tok) {
-               if ('\0' == (*bufp)[pos]) {
+               if ('\0' == *cp) {
                        mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL);
                        return(ROFF_IGN);
                }
                        mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL);
                        return(ROFF_IGN);
                }
@@ -929,18 +929,14 @@ roff_block(ROFF_ARGS)
 
                if (ROFF_de1 == tok)
                        tok = ROFF_de;
 
                if (ROFF_de1 == tok)
                        tok = ROFF_de;
-               if (ROFF_de == tok)
-                       name = *bufp + pos;
-               else
+               else if (ROFF_de != tok)
                        mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos,
                            roffs[tok].name);
 
                        mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos,
                            roffs[tok].name);
 
-               while ((*bufp)[pos] && ! isspace((unsigned char)(*bufp)[pos]))
-                       pos++;
-
-               while (isspace((unsigned char)(*bufp)[pos]))
-                       (*bufp)[pos++] = '\0';
-       }
+               namesz = roff_getname(r, &cp, ln, ppos);
+               name[namesz] = '\0';
+       } else
+               name = NULL;
 
        roffnode_push(r, tok, name, ln, ppos);
 
 
        roffnode_push(r, tok, name, ln, ppos);
 
@@ -950,36 +946,20 @@ roff_block(ROFF_ARGS)
         * appended from roff_block_text() in multiline mode.
         */
 
         * appended from roff_block_text() in multiline mode.
         */
 
-       if (ROFF_de == tok)
-               roff_setstr(r, name, "", 0);
+       if (namesz && ROFF_de == tok)
+               roff_setstrn(&r->strtab, name, namesz, "", 0, 0);
 
 
-       if ('\0' == (*bufp)[pos])
+       if ('\0' == *cp)
                return(ROFF_IGN);
 
        /* If present, process the custom end-of-line marker. */
 
                return(ROFF_IGN);
 
        /* If present, process the custom end-of-line marker. */
 
-       sv = pos;
-       while ((*bufp)[pos] && ! isspace((unsigned char)(*bufp)[pos]))
-               pos++;
+       name = cp;
+       namesz = roff_getname(r, &cp, ln, ppos);
+       if (namesz)
+               r->last->end = mandoc_strndup(name, namesz);
 
 
-       /*
-        * Note: groff does NOT like escape characters in the input.
-        * Instead of detecting this, we're just going to let it fly and
-        * to hell with it.
-        */
-
-       assert(pos > sv);
-       sz = (size_t)(pos - sv);
-
-       if (1 == sz && '.' == (*bufp)[sv])
-               return(ROFF_IGN);
-
-       r->last->end = mandoc_malloc(sz + 1);
-
-       memcpy(r->last->end, *bufp + sv, sz);
-       r->last->end[(int)sz] = '\0';
-
-       if ((*bufp)[pos])
+       if ('\0' != *cp)
                mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);
 
        return(ROFF_IGN);
                mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);
 
        return(ROFF_IGN);