]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_validate.c
shut up about tabs in SYNOPSIS .Fd lines, there is no good way to avoid them
[mandoc.git] / mdoc_validate.c
index cd666b5a2879550b7f6730c78f5c0a1d3e4f1d3a..f37e4c3734fd63218497ed6cc738936f35c0989f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.274 2015/02/06 03:38:45 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.279 2015/02/14 13:23:57 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -56,8 +56,6 @@ struct        valids {
        v_post   post;
 };
 
-static void     check_count(struct mdoc *, enum mdoc_type,
-                       enum check_ineq, int);
 static void     check_text(struct mdoc *, int, int, char *);
 static void     check_argv(struct mdoc *,
                        struct mdoc_node *, struct mdoc_argv *);
@@ -67,9 +65,6 @@ static        enum mdoc_sec   a2sec(const char *);
 static size_t          macro2len(enum mdoct);
 static void     rewrite_macro2len(char **);
 
-static void     ewarn_eq1(POST_ARGS);
-static void     ewarn_ge1(POST_ARGS);
-
 static void     post_an(POST_ARGS);
 static void     post_at(POST_ARGS);
 static void     post_bf(POST_ARGS);
@@ -92,7 +87,6 @@ static        void     post_fn(POST_ARGS);
 static void     post_fname(POST_ARGS);
 static void     post_fo(POST_ARGS);
 static void     post_hyph(POST_ARGS);
-static void     post_hyphtext(POST_ARGS);
 static void     post_ignpar(POST_ARGS);
 static void     post_it(POST_ARGS);
 static void     post_lb(POST_ARGS);
@@ -167,17 +161,17 @@ static    const struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Va */
        { NULL, post_vt },                      /* Vt */
        { NULL, NULL },                         /* Xr */
-       { NULL, ewarn_ge1 },                    /* %A */
-       { NULL, post_hyphtext },                /* %B */ /* FIXME: can be used outside Rs/Re. */
-       { NULL, ewarn_ge1 },                    /* %D */
-       { NULL, ewarn_ge1 },                    /* %I */
-       { NULL, ewarn_ge1 },                    /* %J */
-       { NULL, post_hyphtext },                /* %N */
-       { NULL, post_hyphtext },                /* %O */
-       { NULL, ewarn_ge1 },                    /* %P */
-       { NULL, post_hyphtext },                /* %R */
-       { NULL, post_hyphtext },                /* %T */ /* FIXME: can be used outside Rs/Re. */
-       { NULL, ewarn_ge1 },                    /* %V */
+       { NULL, NULL },                         /* %A */
+       { NULL, post_hyph },                    /* %B */ /* FIXME: can be used outside Rs/Re. */
+       { NULL, NULL },                         /* %D */
+       { NULL, NULL },                         /* %I */
+       { NULL, NULL },                         /* %J */
+       { NULL, post_hyph },                    /* %N */
+       { NULL, post_hyph },                    /* %O */
+       { NULL, NULL },                         /* %P */
+       { NULL, post_hyph },                    /* %R */
+       { NULL, post_hyph },                    /* %T */ /* FIXME: can be used outside Rs/Re. */
+       { NULL, NULL },                         /* %V */
        { NULL, NULL },                         /* Ac */
        { NULL, NULL },                         /* Ao */
        { NULL, NULL },                         /* Aq */
@@ -239,14 +233,14 @@ static    const struct valids mdoc_valids[MDOC_MAX] = {
        { NULL, NULL },                         /* Brq */
        { NULL, NULL },                         /* Bro */
        { NULL, NULL },                         /* Brc */
-       { NULL, ewarn_ge1 },                    /* %C */
+       { NULL, NULL },                         /* %C */
        { pre_obsolete, post_es },              /* Es */
        { pre_obsolete, post_en },              /* En */
        { NULL, NULL },                         /* Dx */
-       { NULL, ewarn_ge1 },                    /* %Q */
+       { NULL, NULL },                         /* %Q */
        { NULL, post_par },                     /* br */
        { NULL, post_par },                     /* sp */
-       { NULL, ewarn_eq1 },                    /* %U */
+       { NULL, NULL },                         /* %U */
        { NULL, NULL },                         /* Ta */
        { NULL, NULL },                         /* ll */
 };
@@ -304,7 +298,8 @@ mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *n)
 
        switch (n->type) {
        case MDOC_TEXT:
-               check_text(mdoc, n->line, n->pos, n->string);
+               if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd)
+                       check_text(mdoc, n->line, n->pos, n->string);
                /* FALLTHROUGH */
        case MDOC_TBL:
                /* FALLTHROUGH */
@@ -331,7 +326,7 @@ mdoc_valid_post(struct mdoc *mdoc)
        n = mdoc->last;
        if (n->flags & MDOC_VALID)
                return;
-       n->flags |= MDOC_VALID;
+       n->flags |= MDOC_VALID | MDOC_ENDED;
 
        switch (n->type) {
        case MDOC_TEXT:
@@ -365,53 +360,6 @@ mdoc_valid_post(struct mdoc *mdoc)
        }
 }
 
-static void
-check_count(struct mdoc *mdoc, enum mdoc_type type,
-       enum check_ineq ineq, int val)
-{
-       const char      *p;
-
-       if (mdoc->last->type != type)
-               return;
-
-       switch (ineq) {
-       case CHECK_LT:
-               p = "less than ";
-               if (mdoc->last->nchild < val)
-                       return;
-               break;
-       case CHECK_GT:
-               p = "more than ";
-               if (mdoc->last->nchild > val)
-                       return;
-               break;
-       case CHECK_EQ:
-               p = "";
-               if (val == mdoc->last->nchild)
-                       return;
-               break;
-       default:
-               abort();
-               /* NOTREACHED */
-       }
-
-       mandoc_vmsg(MANDOCERR_ARGCWARN, mdoc->parse, mdoc->last->line,
-           mdoc->last->pos, "want %s%d children (have %d)",
-           p, val, mdoc->last->nchild);
-}
-
-static void
-ewarn_eq1(POST_ARGS)
-{
-       check_count(mdoc, MDOC_ELEM, CHECK_EQ, 1);
-}
-
-static void
-ewarn_ge1(POST_ARGS)
-{
-       check_count(mdoc, MDOC_ELEM, CHECK_GT, 0);
-}
-
 static void
 check_args(struct mdoc *mdoc, struct mdoc_node *n)
 {
@@ -469,24 +417,13 @@ pre_display(PRE_ARGS)
 static void
 pre_bl(PRE_ARGS)
 {
-       struct mdoc_node *np;
        struct mdoc_argv *argv, *wa;
        int               i;
        enum mdocargt     mdoclt;
        enum mdoc_list    lt;
 
-       if (MDOC_BLOCK != n->type) {
-               if (ENDBODY_NOT != n->end) {
-                       assert(n->pending);
-                       np = n->pending->parent;
-               } else
-                       np = n->parent;
-
-               assert(np);
-               assert(MDOC_BLOCK == np->type);
-               assert(MDOC_Bl == np->tok);
+       if (n->type != MDOC_BLOCK)
                return;
-       }
 
        /*
         * First figure out which kind of list to use: bind ourselves to
@@ -662,25 +599,14 @@ pre_bl(PRE_ARGS)
 static void
 pre_bd(PRE_ARGS)
 {
-       struct mdoc_node *np;
        struct mdoc_argv *argv;
        int               i;
        enum mdoc_disp    dt;
 
        pre_literal(mdoc, n);
 
-       if (MDOC_BLOCK != n->type) {
-               if (ENDBODY_NOT != n->end) {
-                       assert(n->pending);
-                       np = n->pending->parent;
-               } else
-                       np = n->parent;
-
-               assert(np);
-               assert(MDOC_BLOCK == np->type);
-               assert(MDOC_Bd == np->tok);
+       if (n->type != MDOC_BLOCK)
                return;
-       }
 
        for (i = 0; n->args && i < (int)n->args->argc; i++) {
                argv = n->args->argv + i;
@@ -850,22 +776,10 @@ post_bf(POST_ARGS)
         * element, which contains the goods.
         */
 
-       if (MDOC_HEAD != mdoc->last->type) {
-               if (ENDBODY_NOT != mdoc->last->end) {
-                       assert(mdoc->last->pending);
-                       np = mdoc->last->pending->parent->head;
-               } else if (MDOC_BLOCK != mdoc->last->type) {
-                       np = mdoc->last->parent->head;
-               } else
-                       np = mdoc->last->head;
-
-               assert(np);
-               assert(MDOC_HEAD == np->type);
-               assert(MDOC_Bf == np->tok);
+       np = mdoc->last;
+       if (MDOC_HEAD != np->type)
                return;
-       }
 
-       np = mdoc->last;
        assert(MDOC_BLOCK == np->parent->type);
        assert(MDOC_Bf == np->parent->tok);
 
@@ -920,7 +834,6 @@ post_lb(POST_ARGS)
        const char              *stdlibname;
        char                    *libname;
 
-       check_count(mdoc, MDOC_ELEM, CHECK_EQ, 1);
        n = mdoc->last->child;
        assert(MDOC_TEXT == n->type);
 
@@ -1089,7 +1002,7 @@ post_d1(POST_ARGS)
                return;
 
        if (n->child == NULL)
-               mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
+               mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse,
                    n->line, n->pos, "D1");
 
        post_hyph(mdoc);
@@ -1106,7 +1019,7 @@ post_literal(POST_ARGS)
                return;
 
        if (n->child == NULL)
-               mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
+               mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse,
                    n->line, n->pos, mdoc_macronames[n->tok]);
 
        if (n->tok == MDOC_Bd &&
@@ -1275,9 +1188,9 @@ post_it(POST_ARGS)
                                i++;
 
                if (i < cols || i > cols + 1)
-                       mandoc_vmsg(MANDOCERR_ARGCOUNT,
+                       mandoc_vmsg(MANDOCERR_BL_COL,
                            mdoc->parse, nit->line, nit->pos,
-                           "columns == %d (have %d)", cols, i);
+                           "%d columns, %d cells", cols, i);
                break;
        default:
                abort();
@@ -1513,7 +1426,7 @@ post_bl(POST_ARGS)
 
        nchild = nbody->child;
        if (nchild == NULL) {
-               mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
+               mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse,
                    nbody->line, nbody->pos, "Bl");
                return;
        }
@@ -1581,7 +1494,7 @@ post_bk(POST_ARGS)
        n = mdoc->last;
 
        if (n->type == MDOC_BLOCK && n->body->child == NULL) {
-               mandoc_msg(MANDOCERR_MACRO_EMPTY,
+               mandoc_msg(MANDOCERR_BLK_EMPTY,
                    mdoc->parse, n->line, n->pos, "Bk");
                mdoc_node_delete(mdoc, n);
        }
@@ -1792,14 +1705,6 @@ post_hyph(POST_ARGS)
        }
 }
 
-static void
-post_hyphtext(POST_ARGS)
-{
-
-       ewarn_ge1(mdoc);
-       post_hyph(mdoc);
-}
-
 static void
 post_ns(POST_ARGS)
 {
@@ -1877,7 +1782,7 @@ static void
 post_sh_see_also(POST_ARGS)
 {
        const struct mdoc_node  *n;
-       const char              *name, *sec;
+       const char              *name, *sec;
        const char              *lastname, *lastsec, *lastpunct;
        int                      cmp;