]> git.cameronkatri.com Git - mandoc.git/commitdiff
Cleanup with respect to bad macro arguments.
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 5 Jul 2014 12:34:17 +0000 (12:34 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 5 Jul 2014 12:34:17 +0000 (12:34 +0000)
* Fix .Sm with invalid arg: move arg out and toggle mode.
* Promote "unknown standard" from WARNING to ERROR, it loses information.
* Delete MANDOCERR_BADWIDTH, it would only indicate a mandoc(1) bug.
* Do not report MANDOCERR_BL_LATETYPE when there is no type at all.
* Mention macro names, arguments and fallbacks.

man_validate.c
mandoc.h
mdoc_validate.c
read.c

index f4dcda156f3bb037822a1e722e48d6a15dc38ac4..670acc8dfc6110dd7f07a5c46d8f749d3e48e8f6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.97 2014/07/04 16:12:08 schwarze Exp $ */
+/*     $Id: man_validate.c,v 1.98 2014/07/05 12:34:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -303,8 +303,8 @@ post_ft(CHKARGS)
        }
 
        if (0 == ok) {
-               mandoc_vmsg(MANDOCERR_BADFONT, man->parse, n->line,
-                   n->pos, "%s", cp);
+               mandoc_vmsg(MANDOCERR_FT_BAD, man->parse,
+                   n->line, n->pos, "ft %s", cp);
                *cp = '\0';
        }
 
index 6ddb6b7fb15723a08f0be53f131a2d179b2bf40c..cd182d254785a08c15f3e6c731f932a92bb08fde 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.135 2014/07/05 01:12:20 schwarze Exp $ */
+/*     $Id: mandoc.h,v 1.136 2014/07/05 12:34:17 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -91,23 +91,21 @@ enum        mandocerr {
        MANDOCERR_ARGCWARN, /* argument count wrong */
        MANDOCERR_BD_NOTYPE, /* missing display type, using -ragged */
        MANDOCERR_BL_LATETYPE, /* list type is not the first argument: arg */
-       MANDOCERR_BL_WIDTH, /* missing -width in -tag list, using 8n */
+       MANDOCERR_BL_NOWIDTH, /* missing -width in -tag list, using 8n */
        MANDOCERR_IT_NOHEAD, /* empty head in list item: type */
        MANDOCERR_IT_NOBODY, /* empty list item: type */
        MANDOCERR_BF_NOFONT, /* missing font type, using \fR */
-       MANDOCERR_BF_BADFONT, /* unknown font type, using \fR: Bf font */
+       MANDOCERR_BF_BADFONT, /* unknown font type, using \fR: macro font */
        MANDOCERR_ARG_STD, /* missing -std argument, adding it: macro */
 
        /* related to bad macro arguments */
        MANDOCERR_IGNARGV, /* skipping argument */
        MANDOCERR_ARG_REP, /* duplicate argument: macro arg */
-       MANDOCERR_DISPREP, /* duplicate display type */
-       MANDOCERR_LISTREP, /* duplicate list type */
-       MANDOCERR_BADATT, /* unknown AT&T UNIX version */
-       MANDOCERR_BADBOOL, /* bad Boolean value */
-       MANDOCERR_BADFONT, /* unknown font */
-       MANDOCERR_BADSTANDARD, /* unknown standard specifier */
-       MANDOCERR_BADWIDTH, /* bad width argument */
+       MANDOCERR_BD_REP, /* skipping duplicate display type: type */
+       MANDOCERR_BL_REP, /* skipping duplicate list type: type */
+       MANDOCERR_AT_BAD, /* unknown AT&T UNIX version: version */
+       MANDOCERR_SM_BAD, /* invalid Boolean argument: macro arg */
+       MANDOCERR_FT_BAD, /* unknown font, skipping request: request font */
 
        /* related to plain text */
        MANDOCERR_NOBLANKLN, /* blank line in non-literal context */
@@ -145,6 +143,7 @@ enum        mandocerr {
        MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */
        MANDOCERR_ARGCOUNT, /* argument count wrong */
        MANDOCERR_RS_SKIP, /* skipping invalid content in .Rs block: macro */
+       MANDOCERR_ST_BAD, /* unknown standard specifier: standard */
        MANDOCERR_STRAYTA, /* skipping column outside column list */
        MANDOCERR_NOSCOPE, /* skipping end of block that is not open */
        MANDOCERR_SCOPEBROKEN, /* missing end of block */
index 29cd96b05a63861a9195a1afbb6016cfb94cc9a3..afcd5170ee6658d801027dae2aaa9a0f39636753 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.227 2014/07/05 01:12:20 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.228 2014/07/05 12:34:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -696,35 +696,32 @@ pre_bl(PRE_ARGS)
                default:
                        continue;
                }
+               if (LIST__NONE == lt)
+                       continue;
 
                /* Check: multiple list types. */
 
-               if (LIST__NONE != lt && n->norm->Bl.type != LIST__NONE)
-                       mdoc_nmsg(mdoc, n, MANDOCERR_LISTREP);
-
-               /* Assign list type. */
-
-               if (LIST__NONE != lt && n->norm->Bl.type == LIST__NONE) {
-                       n->norm->Bl.type = lt;
-                       /* Set column information, too. */
-                       if (LIST_column == lt) {
-                               n->norm->Bl.ncols =
-                                   n->args->argv[i].sz;
-                               n->norm->Bl.cols = (void *)
-                                   n->args->argv[i].value;
-                       }
+               if (LIST__NONE != n->norm->Bl.type) {
+                       mandoc_msg(MANDOCERR_BL_REP,
+                           mdoc->parse, n->line, n->pos,
+                           mdoc_argnames[argv->arg]);
+                       continue;
                }
 
                /* The list type should come first. */
 
-               if (n->norm->Bl.type == LIST__NONE)
-                       if (n->norm->Bl.width ||
-                           n->norm->Bl.offs ||
-                           n->norm->Bl.comp)
-                               mandoc_msg(MANDOCERR_BL_LATETYPE,
-                                   mdoc->parse, n->line, n->pos,
-                                   mdoc_argnames[n->args->argv[0].arg]);
-               continue;
+               if (n->norm->Bl.width ||
+                   n->norm->Bl.offs ||
+                   n->norm->Bl.comp)
+                       mandoc_msg(MANDOCERR_BL_LATETYPE,
+                           mdoc->parse, n->line, n->pos,
+                           mdoc_argnames[n->args->argv[0].arg]);
+
+               n->norm->Bl.type = lt;
+               if (LIST_column == lt) {
+                       n->norm->Bl.ncols = argv->sz;
+                       n->norm->Bl.cols = (void *)argv->value;
+               }
        }
 
        /* Allow lists to default to LIST_item. */
@@ -744,7 +741,7 @@ pre_bl(PRE_ARGS)
        switch (n->norm->Bl.type) {
        case LIST_tag:
                if (NULL == n->norm->Bl.width)
-                       mdoc_nmsg(mdoc, n, MANDOCERR_BL_WIDTH);
+                       mdoc_nmsg(mdoc, n, MANDOCERR_BL_NOWIDTH);
                break;
        case LIST_column:
                /* FALLTHROUGH */
@@ -846,16 +843,15 @@ pre_bd(PRE_ARGS)
                        abort();
                        /* NOTREACHED */
                }
+               if (DISP__NONE == dt)
+                       continue;
 
-               /* Check whether a type has already been assigned. */
-
-               if (DISP__NONE != dt && n->norm->Bd.type != DISP__NONE)
-                       mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP);
-
-               /* Make our type assignment. */
-
-               if (DISP__NONE != dt && n->norm->Bd.type == DISP__NONE)
+               if (DISP__NONE == n->norm->Bd.type)
                        n->norm->Bd.type = dt;
+               else
+                       mandoc_msg(MANDOCERR_BD_REP,
+                           mdoc->parse, n->line, n->pos,
+                           mdoc_argnames[argv->arg]);
        }
 
        if (DISP__NONE == n->norm->Bd.type) {
@@ -1222,7 +1218,8 @@ post_at(POST_ARGS)
 
        assert(MDOC_TEXT == n->type);
        if (NULL == (std_att = mdoc_a2att(n->string))) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT);
+               mandoc_msg(MANDOCERR_AT_BAD, mdoc->parse,
+                   n->line, n->pos, n->string);
                mandoc_asprintf(&att, "AT&T UNIX %s", n->string);
        } else
                att = mandoc_strdup(std_att);
@@ -1425,10 +1422,8 @@ post_bl_block_width(POST_ARGS)
                width = 6;
        else if (MDOC_MAX == (tok = mdoc_hash_find(n->norm->Bl.width)))
                return(1);
-       else if (0 == (width = macro2len(tok)))  {
-               mdoc_nmsg(mdoc, n, MANDOCERR_BADWIDTH);
-               return(1);
-       }
+       else
+               width = macro2len(tok);
 
        /* The value already exists: free and reallocate it. */
 
@@ -1659,30 +1654,37 @@ post_bl(POST_ARGS)
 static int
 ebool(struct mdoc *mdoc)
 {
+       struct mdoc_node        *nch;
+       enum mdoct               tok;
+
+       tok = mdoc->last->tok;
+       nch = mdoc->last->child;
 
-       if (NULL == mdoc->last->child) {
-               if (MDOC_Sm == mdoc->last->tok)
+       if (NULL == nch) {
+               if (MDOC_Sm == tok)
                        mdoc->flags ^= MDOC_SMOFF;
                return(1);
        }
 
        check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2);
 
-       assert(MDOC_TEXT == mdoc->last->child->type);
+       assert(MDOC_TEXT == nch->type);
 
-       if (0 == strcmp(mdoc->last->child->string, "on")) {
-               if (MDOC_Sm == mdoc->last->tok)
+       if (0 == strcmp(nch->string, "on")) {
+               if (MDOC_Sm == tok)
                        mdoc->flags &= ~MDOC_SMOFF;
                return(1);
        }
-       if (0 == strcmp(mdoc->last->child->string, "off")) {
-               if (MDOC_Sm == mdoc->last->tok)
+       if (0 == strcmp(nch->string, "off")) {
+               if (MDOC_Sm == tok)
                        mdoc->flags |= MDOC_SMOFF;
                return(1);
        }
 
-       mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADBOOL);
-       return(1);
+       mandoc_vmsg(MANDOCERR_SM_BAD,
+           mdoc->parse, nch->line, nch->pos,
+           "%s %s", mdoc_macronames[tok], nch->string);
+       return(mdoc_node_relink(mdoc, nch));
 }
 
 static int
@@ -1718,25 +1720,28 @@ post_root(POST_ARGS)
 static int
 post_st(POST_ARGS)
 {
-       struct mdoc_node         *ch;
+       struct mdoc_node         *n, *nch;
        const char               *p;
 
-       if (NULL == (ch = mdoc->last->child)) {
+       n = mdoc->last;
+       nch = n->child;
+
+       if (NULL == nch) {
                mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
-                   mdoc->last->line, mdoc->last->pos,
-                   mdoc_macronames[mdoc->last->tok]);
-               mdoc_node_delete(mdoc, mdoc->last);
+                   n->line, n->pos, mdoc_macronames[n->tok]);
+               mdoc_node_delete(mdoc, n);
                return(1);
        }
 
-       assert(MDOC_TEXT == ch->type);
+       assert(MDOC_TEXT == nch->type);
 
-       if (NULL == (p = mdoc_a2st(ch->string))) {
-               mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD);
-               mdoc_node_delete(mdoc, mdoc->last);
+       if (NULL == (p = mdoc_a2st(nch->string))) {
+               mandoc_msg(MANDOCERR_ST_BAD, mdoc->parse,
+                   nch->line, nch->pos, nch->string);
+               mdoc_node_delete(mdoc, n);
        } else {
-               free(ch->string);
-               ch->string = mandoc_strdup(p);
+               free(nch->string);
+               nch->string = mandoc_strdup(p);
        }
 
        return(1);
diff --git a/read.c b/read.c
index 5ad294f979a866621183489ed9468774c971fdf1..62894d2ee9c8a87e52b8853c1880e501f66adf89 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.62 2014/07/05 01:12:20 schwarze Exp $ */
+/*     $Id: read.c,v 1.63 2014/07/05 12:34:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -145,13 +145,11 @@ static    const char * const      mandocerrs[MANDOCERR_MAX] = {
        /* related to bad macro arguments */
        "skipping argument",
        "duplicate argument",
-       "duplicate display type",
-       "duplicate list type",
+       "skipping duplicate display type",
+       "skipping duplicate list type",
        "unknown AT&T UNIX version",
-       "bad Boolean value",
-       "unknown font",
-       "unknown standard specifier",
-       "bad width argument",
+       "invalid Boolean argument",
+       "unknown font, skipping request",
 
        /* related to plain text */
        "blank line in non-literal context",
@@ -189,6 +187,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "NOT IMPLEMENTED, please use groff: skipping request",
        "argument count wrong",
        "skipping invalid content in .Rs block",
+       "unknown standard specifier",
        "skipping column outside column list",
        "skipping end of block that is not open",
        "missing end of block",