=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -r1.86 -r1.87 --- src/usr.bin/mandoc/roff.c 2014/06/29 22:38:41 1.86 +++ src/usr.bin/mandoc/roff.c 2014/06/29 23:23:16 1.87 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.86 2014/06/29 22:38:41 schwarze Exp $ */ +/* $Id: roff.c,v 1.87 2014/06/29 23:23:16 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -196,7 +196,8 @@ 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); @@ -760,7 +761,7 @@ * 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); @@ -793,29 +794,27 @@ * 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]) + cp = buf + *pos; + + if ('\0' == *cp || '"' == *cp || '\t' == *cp || ' ' == *cp) return(ROFF_MAX); - /* We stop the macro parse at an escape, tab, space, or nil. */ + mac = cp; + maclen = roff_getname(r, &cp, ln, ppos); - mac = buf + *pos; - maclen = strcspn(mac, " \\\t\0"); - t = (r->current_string = roff_getstrn(r, mac, maclen)) ? ROFF_USERDEF : roffhash_find(mac, maclen); - *pos += (int)maclen; + if (ROFF_MAX != t) + *pos = cp - buf; - while (buf[*pos] && ' ' == buf[*pos]) - (*pos)++; - return(t); } @@ -992,7 +991,7 @@ 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); } @@ -1003,7 +1002,7 @@ * 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 @@ -1038,7 +1037,7 @@ 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