diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2015-10-20 02:01:31 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2015-10-20 02:01:31 +0000 |
commit | 8a6d6ac9ce00755e9537a67b9a9dd8f4c4e76d09 (patch) | |
tree | cfc8f856e7b5ebdcad65963f0d3ad74169858e29 /roff.c | |
parent | 128ee8c8e1032e5e05f88acbd4000c8166085b25 (diff) | |
download | mandoc-8a6d6ac9ce00755e9537a67b9a9dd8f4c4e76d09.tar.gz mandoc-8a6d6ac9ce00755e9537a67b9a9dd8f4c4e76d09.tar.zst mandoc-8a6d6ac9ce00755e9537a67b9a9dd8f4c4e76d09.zip |
In order to become able to generate syntax tree nodes on the roff(7)
level, validation must be separated from parsing and rewinding.
This first big step moves calling of the mdoc(7) post_*() functions
out of the parser loop into their own mdoc_validate() pass, while
using a new mdoc_state() module to make syntax tree state handling
available to both the parser loop and the validation pass.
Diffstat (limited to 'roff.c')
-rw-r--r-- | roff.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.280 2015/10/15 23:35:55 schwarze Exp $ */ +/* $Id: roff.c,v 1.281 2015/10/20 02:01:32 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org> @@ -1007,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; @@ -1014,12 +1019,12 @@ 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 @@ -1072,7 +1077,7 @@ 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); man->next = ROFF_NEXT_SIBLING; @@ -1160,7 +1165,7 @@ 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); man->next = ROFF_NEXT_SIBLING; |