-/* $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>
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.
-/* $Id: man_validate.c,v 1.72 2014/07/07 21:35:42 schwarze Exp $ */
+/* $Id: man_validate.c,v 1.73 2014/08/08 15:35:31 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
static int post_fi(CHKARGS);
static int post_ft(CHKARGS);
static int post_nf(CHKARGS);
-static int post_sec(CHKARGS);
static int post_TH(CHKARGS);
static int post_UC(CHKARGS);
static int pre_sec(CHKARGS);
static v_check posts_nf[] = { check_eq0, post_nf, NULL };
static v_check posts_par[] = { check_par, NULL };
static v_check posts_part[] = { check_part, NULL };
-static v_check posts_sec[] = { post_sec, NULL };
static v_check posts_sp[] = { post_vs, check_le1, NULL };
static v_check posts_th[] = { check_ge2, check_le5, post_TH, NULL };
static v_check posts_uc[] = { post_UC, NULL };
static const struct man_valid man_valids[MAN_MAX] = {
{ NULL, posts_br }, /* br */
{ NULL, posts_th }, /* TH */
- { pres_sec, posts_sec }, /* SH */
- { pres_sec, posts_sec }, /* SS */
+ { pres_sec, NULL }, /* SH */
+ { pres_sec, NULL }, /* SS */
{ NULL, NULL }, /* TP */
{ NULL, posts_par }, /* LP */
{ NULL, posts_par }, /* PP */
check_root(CHKARGS)
{
- if ((MAN_BLINE | MAN_ELINE) & man->flags)
- mandoc_msg(MANDOCERR_BLK_LINE, man->parse,
- 0, 0, "at end of file");
-
- man->flags &= ~MAN_BLINE;
- man->flags &= ~MAN_ELINE;
+ assert((man->flags & (MAN_BLINE | MAN_ELINE)) == 0);
if (NULL == man->first->child)
man_nmsg(man, n, MANDOCERR_DOC_EMPTY);
return(1);
}
-static int
-post_sec(CHKARGS)
-{
-
- if ( ! (MAN_HEAD == n->type && 0 == n->nchild))
- return(1);
-
- man_nmsg(man, n, MANDOCERR_SYNTARGCOUNT);
- return(0);
-}
-
static int
check_part(CHKARGS)
{