]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
The sh(1) "test" builtin on Solaris 10 doesn't have -e,
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index c91b258d8ea46623e629f803bd61c29ff215a617..4ee44f157e7d99d9aa16e16dc56bfaa15563f9d4 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.277 2015/10/06 18:32:20 schwarze Exp $ */
+/*     $Id: roff.c,v 1.283 2015/10/22 21:54:23 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -33,9 +33,6 @@
 #include "roff_int.h"
 #include "libroff.h"
 
-/* Maximum number of nested if-else conditionals. */
-#define        RSTACK_MAX      128
-
 /* Maximum number of string expansions per line, to break infinite loops. */
 #define        EXPAND_LIMIT    1000
 
@@ -316,7 +313,6 @@ struct      roffreg {
 
 struct roff {
        struct mparse   *parse; /* parse point */
-       const struct mchars *mchars; /* character table */
        struct roffnode *last; /* leaf of stack */
        int             *rstack; /* stack of inverted `ie' values */
        struct roffreg  *regtab; /* number registers */
@@ -901,13 +897,12 @@ roff_free(struct roff *r)
 }
 
 struct roff *
-roff_alloc(struct mparse *parse, const struct mchars *mchars, int options)
+roff_alloc(struct mparse *parse, int options)
 {
        struct roff     *r;
 
        r = mandoc_calloc(1, sizeof(struct roff));
        r->parse = parse;
-       r->mchars = mchars;
        r->options = options;
        r->format = options & (MPARSE_MDOC | MPARSE_MAN);
        r->rstackpos = -1;
@@ -1012,6 +1007,11 @@ roff_node_append(struct roff_man *man, struct roff_node *n)
 
        switch (man->next) {
        case ROFF_NEXT_SIBLING:
+               if (man->last->next != NULL) {
+                       n->next = man->last->next;
+                       man->last->next->prev = n;
+               } else
+                       man->last->parent->last = n;
                man->last->next = n;
                n->prev = man->last;
                n->parent = man->last->parent;
@@ -1019,54 +1019,37 @@ roff_node_append(struct roff_man *man, struct roff_node *n)
        case ROFF_NEXT_CHILD:
                man->last->child = n;
                n->parent = man->last;
+               n->parent->last = n;
                break;
        default:
                abort();
        }
        n->parent->nchild++;
-       n->parent->last = n;
-
-       /*
-        * Copy over the normalised-data pointer of our parent.  Not
-        * everybody has one, but copying a null pointer is fine.
-        */
-
-       switch (n->type) {
-       case ROFFT_BODY:
-               if (n->end != ENDBODY_NOT)
-                       break;
-               /* FALLTHROUGH */
-       case ROFFT_TAIL:
-               /* FALLTHROUGH */
-       case ROFFT_HEAD:
-               n->norm = n->parent->norm;
-               break;
-       default:
-               break;
-       }
-
-       if (man->macroset == MACROSET_MDOC)
-               mdoc_valid_pre(man, n);
+       man->last = n;
 
        switch (n->type) {
        case ROFFT_HEAD:
-               assert(n->parent->type == ROFFT_BLOCK);
                n->parent->head = n;
                break;
        case ROFFT_BODY:
-               if (n->end)
-                       break;
-               assert(n->parent->type == ROFFT_BLOCK);
+               if (n->end != ENDBODY_NOT)
+                       return;
                n->parent->body = n;
                break;
        case ROFFT_TAIL:
-               assert(n->parent->type == ROFFT_BLOCK);
                n->parent->tail = n;
                break;
        default:
-               break;
+               return;
        }
-       man->last = n;
+
+       /*
+        * Copy over the normalised-data pointer of our parent.  Not
+        * everybody has one, but copying a null pointer is fine.
+        */
+
+       n->norm = n->parent->norm;
+       assert(n->parent->type == ROFFT_BLOCK);
 }
 
 void
@@ -1078,9 +1061,9 @@ roff_word_alloc(struct roff_man *man, int line, int pos, const char *word)
        n->string = roff_strdup(man->roff, word);
        roff_node_append(man, n);
        if (man->macroset == MACROSET_MDOC)
-               mdoc_valid_post(man);
+               n->flags |= MDOC_VALID | MDOC_ENDED;
        else
-               man_valid_post(man);
+               n->flags |= MAN_VALID;
        man->next = ROFF_NEXT_SIBLING;
 }
 
@@ -1166,9 +1149,9 @@ roff_addtbl(struct roff_man *man, const struct tbl_span *tbl)
        n->span = tbl;
        roff_node_append(man, n);
        if (man->macroset == MACROSET_MDOC)
-               mdoc_valid_post(man);
+               n->flags |= MDOC_VALID | MDOC_ENDED;
        else
-               man_valid_post(man);
+               n->flags |= MAN_VALID;
        man->next = ROFF_NEXT_SIBLING;
 }
 
@@ -1335,7 +1318,6 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
                        res = NULL;
                        break;
                case 'B':
-                       /* FALLTHROUGH */
                case 'w':
                        term = cp[1];
                        /* FALLTHROUGH */
@@ -1346,7 +1328,7 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
                        esc = mandoc_escape(&cp, &stnam, &inaml);
                        if (esc == ESCAPE_ERROR ||
                            (esc == ESCAPE_SPECIAL &&
-                            mchars_spec2cp(r->mchars, stnam, inaml) < 0))
+                            mchars_spec2cp(stnam, inaml) < 0))
                                mandoc_vmsg(MANDOCERR_ESC_BAD,
                                    r->parse, ln, (int)(stesc - buf->buf),
                                    "%.*s", (int)(cp - stesc), stesc);
@@ -1410,11 +1392,8 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
                        }
                        switch (mandoc_escape(&cp, NULL, NULL)) {
                        case ESCAPE_SPECIAL:
-                               /* FALLTHROUGH */
                        case ESCAPE_UNICODE:
-                               /* FALLTHROUGH */
                        case ESCAPE_NUMBERED:
-                               /* FALLTHROUGH */
                        case ESCAPE_OVERSTRIKE:
                                naml++;
                                break;
@@ -1721,14 +1700,10 @@ roff_cblock(ROFF_ARGS)
        switch (r->last->tok) {
        case ROFF_am:
                /* ROFF_am1 is remapped to ROFF_am in roff_block(). */
-               /* FALLTHROUGH */
        case ROFF_ami:
-               /* FALLTHROUGH */
        case ROFF_de:
                /* ROFF_de1 is remapped to ROFF_de in roff_block(). */
-               /* FALLTHROUGH */
        case ROFF_dei:
-               /* FALLTHROUGH */
        case ROFF_ig:
                break;
        default:
@@ -1770,9 +1745,7 @@ roff_ccond(struct roff *r, int ln, int ppos)
 
        switch (r->last->tok) {
        case ROFF_el:
-               /* FALLTHROUGH */
        case ROFF_ie:
-               /* FALLTHROUGH */
        case ROFF_if:
                break;
        default:
@@ -2059,12 +2032,10 @@ roff_getnum(const char *v, int *pos, int *res, int flags)
                scaled = *res * 240 / 2.54;
                break;
        case 'v':
-               /* FALLTHROUGH */
        case 'P':
                scaled = *res * 40;
                break;
        case 'm':
-               /* FALLTHROUGH */
        case 'n':
                scaled = *res * 24;
                break;
@@ -2153,18 +2124,13 @@ roff_evalcond(struct roff *r, int ln, char *v, int *pos)
        case '\0':
                return 0;
        case 'n':
-               /* FALLTHROUGH */
        case 'o':
                (*pos)++;
                return wanttrue;
        case 'c':
-               /* FALLTHROUGH */
        case 'd':
-               /* FALLTHROUGH */
        case 'e':
-               /* FALLTHROUGH */
        case 't':
-               /* FALLTHROUGH */
        case 'v':
                (*pos)++;
                return !wanttrue;
@@ -2340,17 +2306,11 @@ roff_getop(const char *v, int *pos, char *res)
 
        switch (*res) {
        case '+':
-               /* FALLTHROUGH */
        case '-':
-               /* FALLTHROUGH */
        case '*':
-               /* FALLTHROUGH */
        case '/':
-               /* FALLTHROUGH */
        case '%':
-               /* FALLTHROUGH */
        case '&':
-               /* FALLTHROUGH */
        case ':':
                break;
        case '<':