=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_macro.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -r1.49 -r1.50 --- src/usr.bin/mandoc/man_macro.c 2014/08/08 15:32:17 1.49 +++ src/usr.bin/mandoc/man_macro.c 2014/08/08 15:35:31 1.50 @@ -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 * Copyright (c) 2012, 2013 Ingo Schwarze @@ -100,13 +100,35 @@ 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.