=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.198 retrieving revision 1.199 diff -c -r1.198 -r1.199 *** src/usr.bin/mandoc/roff.c 2018/04/09 22:26:25 1.198 --- src/usr.bin/mandoc/roff.c 2018/04/10 00:52:21 1.199 *************** *** 1,4 **** ! /* $OpenBSD: roff.c,v 1.198 2018/04/09 22:26:25 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: roff.c,v 1.199 2018/04/10 00:52:21 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze *************** *** 71,76 **** --- 71,77 ---- struct roffreg { struct roffstr key; int val; + int step; struct roffreg *next; }; *************** *** 180,186 **** static size_t roff_getname(struct roff *, char **, int, int); static int roff_getnum(const char *, int *, int *, int); static int roff_getop(const char *, int *, char *); ! static int roff_getregn(struct roff *, const char *, size_t); static int roff_getregro(const struct roff *, const char *name); static const char *roff_getstrn(struct roff *, --- 181,188 ---- static size_t roff_getname(struct roff *, char **, int, int); static int roff_getnum(const char *, int *, int *, int); static int roff_getop(const char *, int *, char *); ! static int roff_getregn(struct roff *, ! const char *, size_t, char); static int roff_getregro(const struct roff *, const char *name); static const char *roff_getstrn(struct roff *, *************** *** 205,211 **** static enum rofferr roff_rn(ROFF_ARGS); static enum rofferr roff_rr(ROFF_ARGS); static void roff_setregn(struct roff *, const char *, ! size_t, int, char); static void roff_setstr(struct roff *, const char *, const char *, int); static void roff_setstrn(struct roffkv **, const char *, --- 207,213 ---- static enum rofferr roff_rn(ROFF_ARGS); static enum rofferr roff_rr(ROFF_ARGS); static void roff_setregn(struct roff *, const char *, ! size_t, int, char, int); static void roff_setstr(struct roff *, const char *, const char *, int); static void roff_setstrn(struct roffkv **, const char *, *************** *** 1134,1139 **** --- 1136,1142 ---- int done; /* no more input available */ int deftype; /* type of definition to paste */ int rcsid; /* kind of RCS id seen */ + char sign; /* increment number register */ char term; /* character terminating the escape */ /* Search forward for comments. */ *************** *** 1244,1249 **** --- 1247,1255 ---- term = cp[1]; /* FALLTHROUGH */ case 'n': + sign = cp[1]; + if (sign == '+' || sign == '-') + cp++; res = ubuf; break; default: *************** *** 1348,1354 **** case 'n': if (arg_complete) (void)snprintf(ubuf, sizeof(ubuf), "%d", ! roff_getregn(r, stnam, naml)); else ubuf[0] = '\0'; break; --- 1354,1360 ---- case 'n': if (arg_complete) (void)snprintf(ubuf, sizeof(ubuf), "%d", ! roff_getregn(r, stnam, naml, sign)); else ubuf[0] = '\0'; break; *************** *** 2520,2531 **** void roff_setreg(struct roff *r, const char *name, int val, char sign) { ! roff_setregn(r, name, strlen(name), val, sign); } static void roff_setregn(struct roff *r, const char *name, size_t len, ! int val, char sign) { struct roffreg *reg; --- 2526,2537 ---- void roff_setreg(struct roff *r, const char *name, int val, char sign) { ! roff_setregn(r, name, strlen(name), val, sign, INT_MIN); } static void roff_setregn(struct roff *r, const char *name, size_t len, ! int val, char sign, int step) { struct roffreg *reg; *************** *** 2542,2547 **** --- 2548,2554 ---- reg->key.p = mandoc_strndup(name, len); reg->key.sz = len; reg->val = 0; + reg->step = 0; reg->next = r->regtab; r->regtab = reg; } *************** *** 2552,2557 **** --- 2559,2566 ---- reg->val -= val; else reg->val = val; + if (step != INT_MIN) + reg->step = step; } /* *************** *** 2587,2597 **** int roff_getreg(struct roff *r, const char *name) { ! return roff_getregn(r, name, strlen(name)); } static int ! roff_getregn(struct roff *r, const char *name, size_t len) { struct roffreg *reg; int val; --- 2596,2606 ---- int roff_getreg(struct roff *r, const char *name) { ! return roff_getregn(r, name, strlen(name), '\0'); } static int ! roff_getregn(struct roff *r, const char *name, size_t len, char sign) { struct roffreg *reg; int val; *************** *** 2602,2613 **** return val; } ! for (reg = r->regtab; reg; reg = reg->next) if (len == reg->key.sz && ! 0 == strncmp(name, reg->key.p, len)) return reg->val; ! roff_setregn(r, name, len, 0, '\0'); return 0; } --- 2611,2634 ---- return val; } ! for (reg = r->regtab; reg; reg = reg->next) { if (len == reg->key.sz && ! 0 == strncmp(name, reg->key.p, len)) { ! switch (sign) { ! case '+': ! reg->val += reg->step; ! break; ! case '-': ! reg->val -= reg->step; ! break; ! default: ! break; ! } return reg->val; + } + } ! roff_setregn(r, name, len, 0, '\0', INT_MIN); return 0; } *************** *** 2647,2655 **** static enum rofferr roff_nr(ROFF_ARGS) { ! char *key, *val; size_t keysz; ! int iv; char sign; key = val = buf->buf + pos; --- 2668,2676 ---- static enum rofferr roff_nr(ROFF_ARGS) { ! char *key, *val, *step; size_t keysz; ! int iv, is, len; char sign; key = val = buf->buf + pos; *************** *** 2664,2672 **** if (sign == '+' || sign == '-') val++; ! if (roff_evalnum(r, ln, val, NULL, &iv, ROFFNUM_SCALE)) ! roff_setregn(r, key, keysz, iv, sign); return ROFF_IGN; } --- 2685,2701 ---- if (sign == '+' || sign == '-') val++; ! len = 0; ! if (roff_evalnum(r, ln, val, &len, &iv, ROFFNUM_SCALE) == 0) ! return ROFF_IGN; + step = val + len; + while (isspace((unsigned char)*step)) + step++; + if (roff_evalnum(r, ln, step, NULL, &is, 0) == 0) + is = INT_MIN; + + roff_setregn(r, key, keysz, iv, sign, is); return ROFF_IGN; }