]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
No need to populate the TYPE_arch and TYPE_sec bits, the information
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index c08037728523433d144d4e4c19863568ce2ac64f..13b9439e4df92b49062efcfe1e636e6ea328521e 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.279 2015/10/13 22:59:54 schwarze Exp $ */
+/*     $Id: roff.c,v 1.284 2016/01/08 17:48:10 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
 
@@ -1010,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;
@@ -1017,53 +1019,36 @@ 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:
-       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
@@ -1075,9 +1060,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;
 }
 
@@ -1163,9 +1148,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;
 }
 
@@ -1183,7 +1168,6 @@ roff_node_unlink(struct roff_man *man, struct roff_node *n)
        /* Adjust parent. */
 
        if (n->parent != NULL) {
-               n->parent->nchild--;
                if (n->parent->child == n)
                        n->parent->child = n->next;
                if (n->parent->last == n)
@@ -1225,7 +1209,6 @@ roff_node_delete(struct roff_man *man, struct roff_node *n)
 
        while (n->child != NULL)
                roff_node_delete(man, n->child);
-       assert(n->nchild == 0);
        roff_node_unlink(man, n);
        roff_node_free(n);
 }