]> git.cameronkatri.com Git - mandoc.git/commitdiff
Use the freshly improved roff_getname() function
authorIngo Schwarze <schwarze@openbsd.org>
Sun, 29 Jun 2014 23:26:00 +0000 (23:26 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sun, 29 Jun 2014 23:26:00 +0000 (23:26 +0000)
for the main roff request parsing routine, roff_parse().

In request or macro invocations, escape sequences now terminate the
request or macro name; what follows is treated as arguments.  Besides,
the names of user-defined macros can now contain backslashes (eek!).

roff.c

diff --git a/roff.c b/roff.c
index 91448da3bfc53af8fed6103baea0e0729439c15f..511a2cff793f5df85d7ee77652dcd4fe94fc133f 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.213 2014/06/29 22:38:47 schwarze Exp $ */
+/*     $Id: roff.c,v 1.214 2014/06/29 23:26:00 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -200,7 +200,8 @@ static      enum rofferr     roff_line_ignore(ROFF_ARGS);
 static enum rofferr     roff_nr(ROFF_ARGS);
 static void             roff_openeqn(struct roff *, const char *,
                                int, int, const char *);
-static enum rofft       roff_parse(struct roff *, const char *, int *);
+static enum rofft       roff_parse(struct roff *, char *, int *,
+                               int, int);
 static enum rofferr     roff_parsetext(char **, size_t *, int, int *);
 static enum rofferr     roff_res(struct roff *,
                                char **, size_t *, int, int);
@@ -764,7 +765,7 @@ roff_parseln(struct roff *r, int ln, char **bufp,
         * the compilers handle it.
         */
 
-       if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos)))
+       if (ROFF_MAX == (t = roff_parse(r, *bufp, &pos, ln, ppos)))
                return(ROFF_CONT);
 
        assert(roffs[t].proc);
@@ -797,28 +798,26 @@ roff_endparse(struct roff *r)
  * form of ".foo xxx" in the usual way.
  */
 static enum rofft
-roff_parse(struct roff *r, const char *buf, int *pos)
+roff_parse(struct roff *r, char *buf, int *pos, int ln, int ppos)
 {
+       char            *cp;
        const char      *mac;
        size_t           maclen;
        enum rofft       t;
 
-       if ('\0' == buf[*pos] || '"' == buf[*pos] ||
-           '\t' == buf[*pos] || ' ' == buf[*pos])
-               return(ROFF_MAX);
+       cp = buf + *pos;
 
-       /* We stop the macro parse at an escape, tab, space, or nil. */
+       if ('\0' == *cp || '"' == *cp || '\t' == *cp || ' ' == *cp)
+               return(ROFF_MAX);
 
-       mac = buf + *pos;
-       maclen = strcspn(mac, " \\\t\0");
+       mac = cp;
+       maclen = roff_getname(r, &cp, ln, ppos);
 
        t = (r->current_string = roff_getstrn(r, mac, maclen))
            ? ROFF_USERDEF : roffhash_find(mac, maclen);
 
-       *pos += (int)maclen;
-
-       while (buf[*pos] && ' ' == buf[*pos])
-               (*pos)++;
+       if (ROFF_MAX != t)
+               *pos = cp - buf;
 
        return(t);
 }
@@ -996,7 +995,7 @@ roff_block_sub(ROFF_ARGS)
                                i++;
 
                        pos = i;
-                       if (ROFF_MAX != roff_parse(r, *bufp, &pos))
+                       if (ROFF_MAX != roff_parse(r, *bufp, &pos, ln, ppos))
                                return(ROFF_RERUN);
                        return(ROFF_IGN);
                }
@@ -1007,7 +1006,7 @@ roff_block_sub(ROFF_ARGS)
         * pulling it out of the hashtable.
         */
 
-       t = roff_parse(r, *bufp, &pos);
+       t = roff_parse(r, *bufp, &pos, ln, ppos);
 
        /*
         * Macros other than block-end are only significant
@@ -1042,7 +1041,7 @@ roff_cond_sub(ROFF_ARGS)
 
        rr = r->last->rule;
        roffnode_cleanscope(r);
-       t = roff_parse(r, *bufp, &pos);
+       t = roff_parse(r, *bufp, &pos, ln, ppos);
 
        /*
         * Fully handle known macros when they are structurally