summaryrefslogtreecommitdiffstats
path: root/mdoc.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-10-20 02:01:31 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-10-20 02:01:31 +0000
commit3c4f3fa3497c0d1eb3f741840af466708d1a4c86 (patch)
tree3851ef70f1a96463dca2fe04f0774966761b0db3 /mdoc.c
parent566f2881c4b58622697653e52c07c10d8346ddd4 (diff)
downloadmandoc-3c4f3fa3497c0d1eb3f741840af466708d1a4c86.tar.gz
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 'mdoc.c')
-rw-r--r--mdoc.c29
1 files changed, 10 insertions, 19 deletions
diff --git a/mdoc.c b/mdoc.c
index 32530b26..28f94d0b 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -121,24 +121,6 @@ mdoc_macro(MACRO_PROT_ARGS)
{
assert(tok > TOKEN_NONE && tok < MDOC_MAX);
- if (mdoc->flags & MDOC_PBODY) {
- if (tok == MDOC_Dt) {
- mandoc_vmsg(MANDOCERR_DT_LATE,
- mdoc->parse, line, ppos,
- "Dt %s", buf + *pos);
- return;
- }
- } else if ( ! (mdoc_macros[tok].flags & MDOC_PROLOGUE)) {
- if (mdoc->meta.title == NULL) {
- mandoc_vmsg(MANDOCERR_DT_NOTITLE,
- mdoc->parse, line, ppos, "%s %s",
- mdoc_macronames[tok], buf + *pos);
- mdoc->meta.title = mandoc_strdup("UNTITLED");
- }
- if (NULL == mdoc->meta.vol)
- mdoc->meta.vol = mandoc_strdup("LOCAL");
- mdoc->flags |= MDOC_PBODY;
- }
(*mdoc_macros[tok].fp)(mdoc, tok, line, ppos, pos, buf);
}
@@ -319,8 +301,8 @@ mdoc_ptext(struct roff_man *mdoc, int line, char *buf, int offs)
* behaviour that we want to work around it.
*/
roff_elem_alloc(mdoc, line, offs, MDOC_sp);
+ mdoc->last->flags |= MDOC_VALID | MDOC_ENDED;
mdoc->next = ROFF_NEXT_SIBLING;
- mdoc_valid_post(mdoc);
return 1;
}
@@ -495,3 +477,12 @@ mdoc_isdelim(const char *p)
return DELIM_NONE;
}
+
+void
+mdoc_validate(struct roff_man *mdoc)
+{
+
+ mdoc->last = mdoc->first;
+ mdoc_node_validate(mdoc);
+ mdoc_state_reset(mdoc);
+}