summaryrefslogtreecommitdiffstats
path: root/man_macro.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-07-30 23:01:39 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-07-30 23:01:39 +0000
commitd04c6341b9459e49c141ef24f7c7b8956dd53c31 (patch)
tree9728c344e195419857d3926f0bab8f20cbe89bae /man_macro.c
parentb9959419144200aae35b8cb648937b9bd18a5716 (diff)
downloadmandoc-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.c36
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.