diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-30 23:01:39 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-30 23:01:39 +0000 |
commit | d04c6341b9459e49c141ef24f7c7b8956dd53c31 (patch) | |
tree | 9728c344e195419857d3926f0bab8f20cbe89bae /man_macro.c | |
parent | b9959419144200aae35b8cb648937b9bd18a5716 (diff) | |
download | mandoc-d04c6341b9459e49c141ef24f7c7b8956dd53c31.tar.gz |
Improve handling of next-line scope broken by end of file.
Detect the condition earlier, report in the error message
which block is broken, and delete the broken block.
Consequently, empty section headers can no longer happen.
Diffstat (limited to 'man_macro.c')
-rw-r--r-- | man_macro.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/man_macro.c b/man_macro.c index fa971403..638e614e 100644 --- a/man_macro.c +++ b/man_macro.c @@ -104,13 +104,35 @@ man_unscope(struct man *man, const struct man_node *to) to = to->parent; n = man->last; while (n != to) { - if (NULL == to && - MAN_BLOCK == n->type && - 0 == (MAN_VALID & n->flags) && - MAN_EXPLICIT & man_macros[n->tok].flags) - mandoc_msg(MANDOCERR_BLK_NOEND, - man->parse, n->line, n->pos, - man_macronames[n->tok]); + + /* Reached the end of the document? */ + + if (to == NULL && ! (n->flags & MAN_VALID)) { + if (man->flags & (MAN_BLINE | MAN_ELINE) && + man_macros[n->tok].flags & MAN_SCOPED) { + mandoc_vmsg(MANDOCERR_BLK_LINE, + man->parse, n->line, n->pos, + "EOF breaks %s", + man_macronames[n->tok]); + if (man->flags & MAN_ELINE) + man->flags &= ~MAN_ELINE; + else { + assert(n->type == MAN_HEAD); + n = n->parent; + man->flags &= ~MAN_BLINE; + } + man->last = n; + n = n->parent; + man_node_delete(man, man->last); + continue; + } + if (n->type == MAN_BLOCK && + man_macros[n->tok].flags & MAN_EXPLICIT) + mandoc_msg(MANDOCERR_BLK_NOEND, + man->parse, n->line, n->pos, + man_macronames[n->tok]); + } + /* * We might delete the man->last node * in the post-validation phase. |