]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
Fix formatting of empty .Bl -inset item heads.
[mandoc.git] / mdoc_validate.c
index 32f141de8c943a8b05aaf74cb030853d34a4b0fb..7eb6ef1725cb773e8a30201c0201e5c16e08f2a7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.217 2014/07/01 22:37:15 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.224 2014/07/03 23:24:56 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -98,6 +98,8 @@ static        int      post_bx(POST_ARGS);
 static int      post_defaults(POST_ARGS);
 static int      post_dd(POST_ARGS);
 static int      post_dt(POST_ARGS);
+static int      post_en(POST_ARGS);
+static int      post_es(POST_ARGS);
 static int      post_eoln(POST_ARGS);
 static int      post_hyph(POST_ARGS);
 static int      post_ignpar(POST_ARGS);
@@ -125,6 +127,7 @@ static      int      pre_display(PRE_ARGS);
 static int      pre_dt(PRE_ARGS);
 static int      pre_it(PRE_ARGS);
 static int      pre_literal(PRE_ARGS);
+static int      pre_obsolete(PRE_ARGS);
 static int      pre_os(PRE_ARGS);
 static int      pre_par(PRE_ARGS);
 static int      pre_sh(PRE_ARGS);
@@ -145,6 +148,8 @@ static      v_post   posts_d1[] = { bwarn_ge1, post_hyph, NULL };
 static v_post   posts_dd[] = { post_dd, post_prol, NULL };
 static v_post   posts_dl[] = { post_literal, bwarn_ge1, NULL };
 static v_post   posts_dt[] = { post_dt, post_prol, NULL };
+static v_post   posts_en[] = { post_en, NULL };
+static v_post   posts_es[] = { post_es, NULL };
 static v_post   posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL };
 static v_post   posts_hyph[] = { post_hyph, NULL };
 static v_post   posts_hyphtext[] = { ewarn_ge1, post_hyph, NULL };
@@ -173,6 +178,7 @@ static      v_pre    pres_dl[] = { pre_literal, pre_display, NULL };
 static v_pre    pres_dd[] = { pre_dd, NULL };
 static v_pre    pres_dt[] = { pre_dt, NULL };
 static v_pre    pres_it[] = { pre_it, pre_par, NULL };
+static v_pre    pres_obsolete[] = { pre_obsolete, NULL };
 static v_pre    pres_os[] = { pre_os, NULL };
 static v_pre    pres_pp[] = { pre_par, NULL };
 static v_pre    pres_sh[] = { pre_sh, NULL };
@@ -214,7 +220,7 @@ static      const struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, posts_nd },                     /* Nd */
        { NULL, posts_nm },                     /* Nm */
        { NULL, NULL },                         /* Op */
-       { NULL, NULL },                         /* Ot */
+       { pres_obsolete, NULL },                /* Ot */
        { NULL, posts_defaults },               /* Pa */
        { pres_std, posts_std },                /* Rv */
        { NULL, posts_st },                     /* St */
@@ -284,7 +290,7 @@ static      const struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Ek */
        { NULL, posts_eoln },                   /* Bt */
        { NULL, NULL },                         /* Hf */
-       { NULL, NULL },                         /* Fr */
+       { pres_obsolete, NULL },                /* Fr */
        { NULL, posts_eoln },                   /* Ud */
        { NULL, posts_lb },                     /* Lb */
        { pres_pp, posts_pp },                  /* Lp */
@@ -294,8 +300,8 @@ static      const struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Bro */
        { NULL, NULL },                         /* Brc */
        { NULL, posts_text },                   /* %C */
-       { NULL, NULL },                         /* Es */
-       { NULL, NULL },                         /* En */
+       { pres_obsolete, posts_es },            /* Es */
+       { pres_obsolete, posts_en },            /* En */
        { NULL, NULL },                         /* Dx */
        { NULL, posts_text },                   /* %Q */
        { NULL, posts_pp },                     /* br */
@@ -585,7 +591,9 @@ pre_display(PRE_ARGS)
                                break;
 
        if (node)
-               mdoc_nmsg(mdoc, n, MANDOCERR_NESTEDDISP);
+               mandoc_vmsg(MANDOCERR_BD_NEST,
+                   mdoc->parse, n->line, n->pos,
+                   "%s in Bd", mdoc_macronames[n->tok]);
 
        return(1);
 }
@@ -930,6 +938,16 @@ pre_std(PRE_ARGS)
        return(1);
 }
 
+static int
+pre_obsolete(PRE_ARGS)
+{
+
+       if (MDOC_ELEM == n->type || MDOC_BLOCK == n->type)
+               mandoc_msg(MANDOCERR_MACRO_OBS, mdoc->parse,
+                   n->line, n->pos, mdoc_macronames[n->tok]);
+       return(1);
+}
+
 static int
 pre_dt(PRE_ARGS)
 {
@@ -1099,7 +1117,8 @@ post_vt(POST_ARGS)
 
        for (n = mdoc->last->child; n; n = n->next)
                if (MDOC_TEXT != n->type)
-                       mdoc_nmsg(mdoc, n, MANDOCERR_CHILD);
+                       mandoc_msg(MANDOCERR_VT_CHILD, mdoc->parse,
+                           n->line, n->pos, mdoc_macronames[n->tok]);
 
        return(1);
 }
@@ -1229,32 +1248,46 @@ post_an(POST_ARGS)
        return(1);
 }
 
+static int
+post_en(POST_ARGS)
+{
+
+       if (MDOC_BLOCK == mdoc->last->type)
+               mdoc->last->norm->Es = mdoc->last_es;
+       return(1);
+}
+
+static int
+post_es(POST_ARGS)
+{
+
+       mdoc->last_es = mdoc->last;
+       return(1);
+}
+
 static int
 post_it(POST_ARGS)
 {
        int               i, cols;
        enum mdoc_list    lt;
-       struct mdoc_node *n, *c;
+       struct mdoc_node *nbl, *nit, *nch;
        enum mandocerr    er;
 
-       if (MDOC_BLOCK != mdoc->last->type)
+       nit = mdoc->last;
+       if (MDOC_BLOCK != nit->type)
                return(1);
 
-       n = mdoc->last->parent->parent;
-       lt = n->norm->Bl.type;
+       nbl = nit->parent->parent;
+       lt = nbl->norm->Bl.type;
 
        if (LIST__NONE == lt) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE);
+               mdoc_nmsg(mdoc, nit, MANDOCERR_LISTTYPE);
                return(1);
        }
 
        switch (lt) {
        case LIST_tag:
-               if (mdoc->last->head->child)
-                       break;
-               /* FIXME: give this a dummy value. */
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS);
-               break;
+               /* FALLTHROUGH */
        case LIST_hang:
                /* FALLTHROUGH */
        case LIST_ohang:
@@ -1262,8 +1295,10 @@ post_it(POST_ARGS)
        case LIST_inset:
                /* FALLTHROUGH */
        case LIST_diag:
-               if (NULL == mdoc->last->head->child)
-                       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS);
+               if (NULL == nit->head->child)
+                       mandoc_msg(MANDOCERR_IT_NOHEAD,
+                           mdoc->parse, nit->line, nit->pos,
+                           mdoc_argnames[nbl->args->argv[0].arg]);
                break;
        case LIST_bullet:
                /* FALLTHROUGH */
@@ -1272,23 +1307,23 @@ post_it(POST_ARGS)
        case LIST_enum:
                /* FALLTHROUGH */
        case LIST_hyphen:
-               if (NULL == mdoc->last->body->child)
-                       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY);
+               if (NULL == nit->body->child)
+                       mdoc_nmsg(mdoc, nit, MANDOCERR_NOBODY);
                /* FALLTHROUGH */
        case LIST_item:
-               if (mdoc->last->head->child)
-                       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST);
+               if (NULL != nit->head->child)
+                       mdoc_nmsg(mdoc, nit, MANDOCERR_ARGSLOST);
                break;
        case LIST_column:
-               cols = (int)n->norm->Bl.ncols;
+               cols = (int)nbl->norm->Bl.ncols;
 
-               assert(NULL == mdoc->last->head->child);
+               assert(NULL == nit->head->child);
 
-               if (NULL == mdoc->last->body->child)
-                       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY);
+               if (NULL == nit->body->child)
+                       mdoc_nmsg(mdoc, nit, MANDOCERR_NOBODY);
 
-               for (i = 0, c = mdoc->last->child; c; c = c->next)
-                       if (MDOC_BODY == c->type)
+               for (i = 0, nch = nit->child; nch; nch = nch->next)
+                       if (MDOC_BODY == nch->type)
                                i++;
 
                if (i < cols)
@@ -1298,8 +1333,7 @@ post_it(POST_ARGS)
                else
                        er = MANDOCERR_SYNTARGCOUNT;
 
-               mandoc_vmsg(er, mdoc->parse,
-                   mdoc->last->line, mdoc->last->pos,
+               mandoc_vmsg(er, mdoc->parse, nit->line, nit->pos,
                    "columns == %d (have %d)", cols, i);
                return(MANDOCERR_ARGCOUNT == er);
        default:
@@ -1352,12 +1386,17 @@ post_bl_block(POST_ARGS)
                                continue;
                        }
                        if (NULL == ni->next) {
-                               mdoc_nmsg(mdoc, nc, MANDOCERR_MOVEPAR);
+                               mandoc_msg(MANDOCERR_PAR_MOVE,
+                                   mdoc->parse, nc->line, nc->pos,
+                                   mdoc_macronames[nc->tok]);
                                if ( ! mdoc_node_relink(mdoc, nc))
                                        return(0);
                        } else if (0 == n->norm->Bl.comp &&
                            LIST_column != n->norm->Bl.type) {
-                               mdoc_nmsg(mdoc, nc, MANDOCERR_IGNPAR);
+                               mandoc_vmsg(MANDOCERR_PAR_SKIP,
+                                   mdoc->parse, nc->line, nc->pos,
+                                   "%s before It",
+                                   mdoc_macronames[nc->tok]);
                                mdoc_node_delete(mdoc, nc);
                        } else
                                break;
@@ -1573,7 +1612,9 @@ post_bl(POST_ARGS)
                        continue;
                }
 
-               mdoc_nmsg(mdoc, nchild, MANDOCERR_CHILD);
+               mandoc_msg(MANDOCERR_BL_MOVE, mdoc->parse,
+                   nchild->line, nchild->pos,
+                   mdoc_macronames[nchild->tok]);
 
                /*
                 * Move the node out of the Bl block.
@@ -1625,11 +1666,12 @@ ebool(struct mdoc *mdoc)
 {
 
        if (NULL == mdoc->last->child) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY);
-               mdoc_node_delete(mdoc, mdoc->last);
+               if (MDOC_Sm == mdoc->last->tok)
+                       mdoc->flags ^= MDOC_SMOFF;
                return(1);
        }
-       check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 1);
+
+       check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2);
 
        assert(MDOC_TEXT == mdoc->last->child->type);
 
@@ -1685,7 +1727,9 @@ post_st(POST_ARGS)
        const char               *p;
 
        if (NULL == (ch = mdoc->last->child)) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_MACROEMPTY);
+               mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
+                   mdoc->last->line, mdoc->last->pos,
+                   mdoc_macronames[mdoc->last->tok]);
                mdoc_node_delete(mdoc, mdoc->last);
                return(1);
        }
@@ -1742,7 +1786,8 @@ post_rs(POST_ARGS)
                }
 
                next = nn->next;
-               mdoc_nmsg(mdoc, nn, MANDOCERR_CHILD);
+               mandoc_msg(MANDOCERR_RS_SKIP, mdoc->parse,
+                   nn->line, nn->pos, mdoc_macronames[nn->tok]);
                mdoc_node_delete(mdoc, nn);
        }
 
@@ -1865,7 +1910,7 @@ post_ns(POST_ARGS)
 {
 
        if (MDOC_LINE & mdoc->last->flags)
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_IGNNS);
+               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NS_SKIP);
        return(1);
 }
 
@@ -2045,13 +2090,19 @@ post_ignpar(POST_ARGS)
 
        if (NULL != (np = mdoc->last->child))
                if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) {
-                       mdoc_nmsg(mdoc, np, MANDOCERR_IGNPAR);
+                       mandoc_vmsg(MANDOCERR_PAR_SKIP,
+                           mdoc->parse, np->line, np->pos,
+                           "%s after %s", mdoc_macronames[np->tok],
+                           mdoc_macronames[mdoc->last->tok]);
                        mdoc_node_delete(mdoc, np);
                }
 
        if (NULL != (np = mdoc->last->last))
                if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) {
-                       mdoc_nmsg(mdoc, np, MANDOCERR_IGNPAR);
+                       mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
+                           np->line, np->pos, "%s at the end of %s",
+                           mdoc_macronames[np->tok],
+                           mdoc_macronames[mdoc->last->tok]);
                        mdoc_node_delete(mdoc, np);
                }
 
@@ -2083,7 +2134,10 @@ pre_par(PRE_ARGS)
        if (MDOC_It == n->tok && n->parent->norm->Bl.comp)
                return(1);
 
-       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_IGNPAR);
+       mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
+           mdoc->last->line, mdoc->last->pos,
+           "%s before %s", mdoc_macronames[mdoc->last->tok],
+           mdoc_macronames[n->tok]);
        mdoc_node_delete(mdoc, mdoc->last);
        return(1);
 }
@@ -2091,25 +2145,27 @@ pre_par(PRE_ARGS)
 static int
 post_par(POST_ARGS)
 {
+       struct mdoc_node *np;
 
        if (MDOC_ELEM != mdoc->last->type &&
            MDOC_BLOCK != mdoc->last->type)
                return(1);
 
-       if (NULL == mdoc->last->prev) {
-               if (MDOC_Sh != mdoc->last->parent->tok &&
-                   MDOC_Ss != mdoc->last->parent->tok)
+       if (NULL == (np = mdoc->last->prev)) {
+               np = mdoc->last->parent;
+               if (MDOC_Sh != np->tok && MDOC_Ss != np->tok)
                        return(1);
        } else {
-               if (MDOC_Pp != mdoc->last->prev->tok &&
-                   MDOC_Lp != mdoc->last->prev->tok &&
+               if (MDOC_Pp != np->tok && MDOC_Lp != np->tok &&
                    (MDOC_br != mdoc->last->tok ||
-                    (MDOC_sp != mdoc->last->prev->tok &&
-                     MDOC_br != mdoc->last->prev->tok)))
+                    (MDOC_sp != np->tok && MDOC_br != np->tok)))
                        return(1);
        }
 
-       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_IGNPAR);
+       mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
+           mdoc->last->line, mdoc->last->pos,
+           "%s after %s", mdoc_macronames[mdoc->last->tok],
+           mdoc_macronames[np->tok]);
        mdoc_node_delete(mdoc, mdoc->last);
        return(1);
 }