diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-05 12:34:17 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-05 12:34:17 +0000 |
commit | b532f1e85747156cbe418d1a7751c2eea65c390b (patch) | |
tree | 9a02c6e56d65f04f32fae7c82d4b4191cb5c411f | |
parent | 2b3a6826335208288b20ac657af3159eb354cd11 (diff) | |
download | mandoc-b532f1e85747156cbe418d1a7751c2eea65c390b.tar.gz |
Cleanup with respect to bad macro arguments.
* 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.
-rw-r--r-- | man_validate.c | 4 | ||||
-rw-r--r-- | mandoc.h | 17 | ||||
-rw-r--r-- | mdoc_validate.c | 117 | ||||
-rw-r--r-- | read.c | 11 |
4 files changed, 76 insertions, 73 deletions
diff --git a/man_validate.c b/man_validate.c index fd9c4fc8..4303ad33 100644 --- a/man_validate.c +++ b/man_validate.c @@ -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'; } @@ -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 */ diff --git a/mdoc_validate.c b/mdoc_validate.c index 6477cbcf..fb927fd2 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -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); @@ -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", |