]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
Split mlinks_undupe() out of mpages_merge()
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index b3be0fb4e9abd3d55cdd1cea79882864aa5c8d36..e33216c40970f719a4f18da04d9bbf9e5f091be2 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.184 2013/10/05 22:25:12 schwarze Exp $ */
+/*     $Id: roff.c,v 1.188 2013/12/25 00:50:05 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -46,6 +46,8 @@ enum  rofft {
        ROFF_de1,
        ROFF_ds,
        ROFF_el,
+       ROFF_fam,
+       ROFF_hw,
        ROFF_hy,
        ROFF_ie,
        ROFF_if,
@@ -235,6 +237,8 @@ static      struct roffmac   roffs[ROFF_MAX] = {
        { "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL },
        { "ds", roff_ds, NULL, NULL, 0, NULL },
        { "el", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL },
+       { "fam", roff_line_ignore, NULL, NULL, 0, NULL },
+       { "hw", roff_line_ignore, NULL, NULL, 0, NULL },
        { "hy", roff_line_ignore, NULL, NULL, 0, NULL },
        { "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL },
        { "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL },
@@ -1356,7 +1360,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;
 
@@ -1371,11 +1375,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
@@ -1422,14 +1432,21 @@ 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++;
+
+       sz = strspn(val, "0123456789");
+       iv = sz ? mandoc_strntoi(val, sz, 10) : 0;
 
-       roff_setreg(r, key, iv);
+       roff_setreg(r, key, iv, sign);
 
        return(ROFF_IGN);
 }
@@ -1716,7 +1733,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++)