=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.186 retrieving revision 1.190 diff -u -p -r1.186 -r1.190 --- mandoc/roff.c 2013/10/22 20:38:00 1.186 +++ mandoc/roff.c 2014/01/06 21:34:31 1.190 @@ -1,7 +1,7 @@ -/* $Id: roff.c,v 1.186 2013/10/22 20:38:00 schwarze Exp $ */ +/* $Id: roff.c,v 1.190 2014/01/06 21:34:31 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons - * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze + * Copyright (c) 2010-2014 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -109,6 +109,7 @@ struct roffreg { struct roff { enum mparset parsetype; /* requested parse type */ struct mparse *parse; /* parse point */ + int quick; /* skip standard macro deletion */ struct roffnode *last; /* leaf of stack */ enum roffrule rstack[RSTACK_MAX]; /* stack of !`ie' rules */ char control; /* control character */ @@ -468,7 +469,7 @@ roff_free(struct roff *r) struct roff * -roff_alloc(enum mparset type, struct mparse *parse) +roff_alloc(enum mparset type, struct mparse *parse, int quick) { struct roff *r; int i; @@ -476,6 +477,7 @@ roff_alloc(enum mparset type, struct mparse *parse) r = mandoc_calloc(1, sizeof(struct roff)); r->parsetype = type; r->parse = parse; + r->quick = quick; r->rstackpos = -1; roffhash_init(); @@ -646,8 +648,7 @@ roff_parsetext(char **bufp, size_t *szp, int pos, int if ('\\' == *p) { /* Skip over escapes. */ p++; - esc = mandoc_escape - ((const char const **)&p, NULL, NULL); + esc = mandoc_escape((const char **)&p, NULL, NULL); if (ESCAPE_ERROR == esc) break; continue; @@ -1360,7 +1361,7 @@ roff_ds(ROFF_ARGS) } void -roff_setreg(struct roff *r, const char *name, int val) +roff_setreg(struct roff *r, const char *name, int val, char sign) { struct roffreg *reg; @@ -1375,11 +1376,17 @@ roff_setreg(struct roff *r, const char *name, int val) reg = mandoc_malloc(sizeof(struct roffreg)); reg->key.p = mandoc_strdup(name); reg->key.sz = strlen(name); + reg->val = 0; reg->next = r->regtab; r->regtab = reg; } - reg->val = val; + if ('+' == sign) + reg->val += val; + else if ('-' == sign) + reg->val -= val; + else + reg->val = val; } int @@ -1426,15 +1433,22 @@ roff_nr(ROFF_ARGS) { const char *key; char *val; + size_t sz; int iv; + char sign; val = *bufp + pos; key = roff_getname(r, &val, ln, pos); - iv = mandoc_strntoi(val, strlen(val), 10); + sign = *val; + if ('+' == sign || '-' == sign) + val++; - roff_setreg(r, key, iv); + sz = strspn(val, "0123456789"); + iv = sz ? mandoc_strntoi(val, sz, 10) : 0; + roff_setreg(r, key, iv, sign); + return(ROFF_IGN); } @@ -1485,7 +1499,7 @@ roff_Dd(ROFF_ARGS) { const char *const *cp; - if (MPARSE_MDOC != r->parsetype) + if (0 == r->quick && MPARSE_MDOC != r->parsetype) for (cp = __mdoc_reserved; *cp; cp++) roff_setstr(r, *cp, NULL, 0); @@ -1498,7 +1512,7 @@ roff_TH(ROFF_ARGS) { const char *const *cp; - if (MPARSE_MDOC != r->parsetype) + if (0 == r->quick && MPARSE_MDOC != r->parsetype) for (cp = __man_reserved; *cp; cp++) roff_setstr(r, *cp, NULL, 0); @@ -1720,7 +1734,7 @@ roff_userdef(ROFF_ARGS) /* * Collect pointers to macro argument strings - * and null-terminate them. + * and NUL-terminate them. */ cp = *bufp + pos; for (i = 0; i < 9; i++)