]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
Add support for 1/2, 1/4, and 3/4 (needed by eqn).
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index 79d0897ef3a79b22efa07b5c2867d0875d8ee43c..66fab654b6b25df1b2e9671eb9d5d266945b57ba 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.144 2011/07/08 09:28:33 kristaps Exp $ */
+/*     $Id: roff.c,v 1.149 2011/07/21 15:21:13 kristaps Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -71,6 +71,16 @@ enum roffrule {
        ROFFRULE_DENY
 };
 
+/*
+ * A single register entity.  If "set" is zero, the value of the
+ * register should be the default one, which is per-register.
+ * Registers are assumed to be unsigned ints for now.
+ */
+struct reg {
+       int               set; /* whether set or not */
+       unsigned int      u; /* unsigned integer */
+};
+
 struct roffstr {
        char            *name; /* key of symbol */
        char            *string; /* current value */
@@ -82,7 +92,7 @@ struct        roff {
        struct roffnode *last; /* leaf of stack */
        enum roffrule    rstack[RSTACK_MAX]; /* stack of !`ie' rules */
        int              rstackpos; /* position in rstack */
-       struct regset   *regs; /* read/writable registers */
+       struct reg       regs[REG__MAX];
        struct roffstr  *first_string; /* user-defined strings & macros */
        const char      *current_string; /* value of last called user macro */
        struct tbl_node *first_tbl; /* first table parsed */
@@ -351,6 +361,8 @@ roff_reset(struct roff *r)
 
        roff_free1(r);
 
+       memset(&r->regs, 0, sizeof(struct reg) * REG__MAX);
+
        for (i = 0; i < PREDEFS_MAX; i++) 
                roff_setstr(r, predefs[i].name, predefs[i].str, 0);
 }
@@ -366,13 +378,12 @@ roff_free(struct roff *r)
 
 
 struct roff *
-roff_alloc(struct regset *regs, struct mparse *parse)
+roff_alloc(struct mparse *parse)
 {
        struct roff     *r;
        int              i;
 
        r = mandoc_calloc(1, sizeof(struct roff));
-       r->regs = regs;
        r->parse = parse;
        r->rstackpos = -1;
        
@@ -519,18 +530,18 @@ roff_parseln(struct roff *r, int ln, char **bufp,
                if (ROFF_CONT != e)
                        return(e);
                if (r->eqn)
-                       return(eqn_read(&r->eqn, ln, *bufp, pos));
+                       return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                if (r->tbl)
                        return(tbl_read(r->tbl, ln, *bufp, pos));
                return(ROFF_CONT);
        } else if ( ! ctl) {
                if (r->eqn)
-                       return(eqn_read(&r->eqn, ln, *bufp, pos));
+                       return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
                if (r->tbl)
                        return(tbl_read(r->tbl, ln, *bufp, pos));
                return(ROFF_CONT);
        } else if (r->eqn)
-               return(eqn_read(&r->eqn, ln, *bufp, ppos));
+               return(eqn_read(&r->eqn, ln, *bufp, ppos, offs));
 
        /*
         * If a scope is open, go to the child handler for that macro,
@@ -572,7 +583,7 @@ roff_endparse(struct roff *r)
 
        if (r->eqn) {
                mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, 
-                               r->eqn->eqn.line, r->eqn->eqn.pos, NULL);
+                               r->eqn->eqn.ln, r->eqn->eqn.pos, NULL);
                eqn_end(r->eqn);
                r->eqn = NULL;
        }
@@ -1104,6 +1115,26 @@ roff_ds(ROFF_ARGS)
        return(ROFF_IGN);
 }
 
+int
+roff_regisset(const struct roff *r, enum regs reg)
+{
+
+       return(r->regs[(int)reg].set);
+}
+
+unsigned int
+roff_regget(const struct roff *r, enum regs reg)
+{
+
+       return(r->regs[(int)reg].u);
+}
+
+void
+roff_regunset(struct roff *r, enum regs reg)
+{
+
+       r->regs[(int)reg].set = 0;
+}
 
 /* ARGSUSED */
 static enum rofferr
@@ -1112,18 +1143,16 @@ roff_nr(ROFF_ARGS)
        const char      *key;
        char            *val;
        int              iv;
-       struct reg      *rg;
 
        val = *bufp + pos;
        key = roff_getname(r, &val, ln, pos);
-       rg = r->regs->regs;
 
        if (0 == strcmp(key, "nS")) {
-               rg[(int)REG_nS].set = 1;
-               if ((iv = mandoc_strntou(val, strlen(val), 10)) >= 0)
-                       rg[REG_nS].v.u = (unsigned)iv;
+               r->regs[(int)REG_nS].set = 1;
+               if ((iv = mandoc_strntoi(val, strlen(val), 10)) >= 0)
+                       r->regs[(int)REG_nS].u = (unsigned)iv;
                else
-                       rg[(int)REG_nS].v.u = 0u;
+                       r->regs[(int)REG_nS].u = 0u;
        }
 
        return(ROFF_IGN);
@@ -1179,7 +1208,7 @@ roff_EQ(ROFF_ARGS)
        struct eqn_node *e;
 
        assert(NULL == r->eqn);
-       e = eqn_alloc(ppos, ln);
+       e = eqn_alloc(ppos, ln, r->parse);
 
        if (r->last_eqn)
                r->last_eqn->next = e;