summaryrefslogtreecommitdiffstats
path: root/usr.bin/mandoc/man_macro.c
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2014-08-08 15:35:31 +0000
committerschwarze <schwarze@openbsd.org>2014-08-08 15:35:31 +0000
commit4740028476b1b5c496d726c76b2a56c8bb3495f7 (patch)
tree7de0885603fe7f93f9b863095f3fb6f2846a02cf /usr.bin/mandoc/man_macro.c
parentSimplify: replace one global flag by one local variable (diff)
downloadwireguard-openbsd-4740028476b1b5c496d726c76b2a56c8bb3495f7.tar.xz
wireguard-openbsd-4740028476b1b5c496d726c76b2a56c8bb3495f7.zip
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 'usr.bin/mandoc/man_macro.c')
-rw-r--r--usr.bin/mandoc/man_macro.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/usr.bin/mandoc/man_macro.c b/usr.bin/mandoc/man_macro.c
index a183bc4bf91..737aa0d40b6 100644
--- a/usr.bin/mandoc/man_macro.c
+++ b/usr.bin/mandoc/man_macro.c
@@ -1,4 +1,4 @@
-/* $Id: man_macro.c,v 1.49 2014/08/08 15:32:17 schwarze Exp $ */
+/* $Id: man_macro.c,v 1.50 2014/08/08 15:35:31 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -100,13 +100,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.