=================================================================== RCS file: /cvs/mandoc/mdoc_validate.c,v retrieving revision 1.236 retrieving revision 1.240 diff -u -p -r1.236 -r1.240 --- mandoc/mdoc_validate.c 2014/07/30 23:38:52 1.236 +++ mandoc/mdoc_validate.c 2014/08/01 17:40:34 1.240 @@ -1,4 +1,4 @@ -/* $Id: mdoc_validate.c,v 1.236 2014/07/30 23:38:52 schwarze Exp $ */ +/* $Id: mdoc_validate.c,v 1.240 2014/08/01 17:40:34 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -568,8 +568,9 @@ static int pre_bl(PRE_ARGS) { struct mdoc_node *np; - struct mdoc_argv *argv; + struct mdoc_argv *argv, *wa; int i; + enum mdocargt mdoclt; enum mdoc_list lt; if (MDOC_BLOCK != n->type) { @@ -591,6 +592,8 @@ pre_bl(PRE_ARGS) * ones. If we find no list type, we default to LIST_item. */ + wa = n->args->argv; + mdoclt = MDOC_ARG_MAX; for (i = 0; n->args && i < (int)n->args->argc; i++) { argv = n->args->argv + i; lt = LIST__NONE; @@ -638,6 +641,7 @@ pre_bl(PRE_ARGS) n->norm->Bl.comp = 1; break; case MDOC_Width: + wa = argv; if (0 == argv->sz) { mandoc_msg(MANDOCERR_ARG_EMPTY, mdoc->parse, argv->line, @@ -671,13 +675,14 @@ pre_bl(PRE_ARGS) } if (LIST__NONE == lt) continue; + mdoclt = argv->arg; /* Check: multiple list types. */ if (LIST__NONE != n->norm->Bl.type) { - mandoc_msg(MANDOCERR_BL_REP, + mandoc_vmsg(MANDOCERR_BL_REP, mdoc->parse, n->line, n->pos, - mdoc_argnames[argv->arg]); + "Bl -%s", mdoc_argnames[argv->arg]); continue; } @@ -686,8 +691,8 @@ pre_bl(PRE_ARGS) if (n->norm->Bl.width || n->norm->Bl.offs || n->norm->Bl.comp) - mandoc_msg(MANDOCERR_BL_LATETYPE, - mdoc->parse, n->line, n->pos, + mandoc_vmsg(MANDOCERR_BL_LATETYPE, + mdoc->parse, n->line, n->pos, "Bl -%s", mdoc_argnames[n->args->argv[0].arg]); n->norm->Bl.type = lt; @@ -700,7 +705,8 @@ pre_bl(PRE_ARGS) /* Allow lists to default to LIST_item. */ if (LIST__NONE == n->norm->Bl.type) { - mdoc_nmsg(mdoc, n, MANDOCERR_BL_NOTYPE); + mandoc_msg(MANDOCERR_BL_NOTYPE, mdoc->parse, + n->line, n->pos, "Bl"); n->norm->Bl.type = LIST_item; } @@ -714,7 +720,8 @@ pre_bl(PRE_ARGS) switch (n->norm->Bl.type) { case LIST_tag: if (NULL == n->norm->Bl.width) - mdoc_nmsg(mdoc, n, MANDOCERR_BL_NOWIDTH); + mandoc_msg(MANDOCERR_BL_NOWIDTH, mdoc->parse, + n->line, n->pos, "Bl -tag"); break; case LIST_column: /* FALLTHROUGH */ @@ -726,7 +733,9 @@ pre_bl(PRE_ARGS) /* FALLTHROUGH */ case LIST_item: if (n->norm->Bl.width) - mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV); + mandoc_vmsg(MANDOCERR_BL_SKIPW, mdoc->parse, + wa->line, wa->pos, "Bl -%s", + mdoc_argnames[mdoclt]); break; case LIST_bullet: /* FALLTHROUGH */ @@ -789,7 +798,8 @@ pre_bd(PRE_ARGS) dt = DISP_literal; break; case MDOC_File: - mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP); + mandoc_msg(MANDOCERR_BD_FILE, mdoc->parse, + n->line, n->pos, NULL); return(0); case MDOC_Offset: if (0 == argv->sz) { @@ -822,13 +832,14 @@ pre_bd(PRE_ARGS) if (DISP__NONE == n->norm->Bd.type) n->norm->Bd.type = dt; else - mandoc_msg(MANDOCERR_BD_REP, + mandoc_vmsg(MANDOCERR_BD_REP, mdoc->parse, n->line, n->pos, - mdoc_argnames[argv->arg]); + "Bd -%s", mdoc_argnames[argv->arg]); } if (DISP__NONE == n->norm->Bd.type) { - mdoc_nmsg(mdoc, n, MANDOCERR_BD_NOTYPE); + mandoc_msg(MANDOCERR_BD_NOTYPE, mdoc->parse, + n->line, n->pos, "Bd"); n->norm->Bd.type = DISP_ragged; } @@ -838,18 +849,23 @@ pre_bd(PRE_ARGS) static int pre_an(PRE_ARGS) { - int i; + struct mdoc_argv *argv; + size_t i; - if (NULL == n->args) + if (n->args == NULL) return(1); - for (i = 1; i < (int)n->args->argc; i++) - mdoc_pmsg(mdoc, n->args->argv[i].line, - n->args->argv[i].pos, MANDOCERR_IGNARGV); + for (i = 1; i < n->args->argc; i++) { + argv = n->args->argv + i; + mandoc_vmsg(MANDOCERR_AN_REP, + mdoc->parse, argv->line, argv->pos, + "An -%s", mdoc_argnames[argv->arg]); + } - if (MDOC_Split == n->args->argv[0].arg) + argv = n->args->argv; + if (argv->arg == MDOC_Split) n->norm->An.auth = AUTH_split; - else if (MDOC_Nosplit == n->args->argv[0].arg) + else if (argv->arg == MDOC_Nosplit) n->norm->An.auth = AUTH_nosplit; else abort(); @@ -960,7 +976,8 @@ post_bf(POST_ARGS) nch = np->child; if (NULL == np->parent->args) { if (NULL == nch) { - mdoc_nmsg(mdoc, np, MANDOCERR_BF_NOFONT); + mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse, + np->line, np->pos, "Bf"); return(1); } nch = nch->next; @@ -1073,7 +1090,8 @@ post_nm(POST_ARGS) mdoc_deroff(&mdoc->meta.name, mdoc->last); if (NULL == mdoc->meta.name) - mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NM_NONAME); + mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, + mdoc->last->line, mdoc->last->pos, "Nm"); return(1); } @@ -1161,8 +1179,8 @@ post_at(POST_ARGS) assert(MDOC_TEXT == n->type); if (NULL == (std_att = mdoc_a2att(n->string))) { - mandoc_msg(MANDOCERR_AT_BAD, mdoc->parse, - n->line, n->pos, n->string); + mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse, + n->line, n->pos, "At %s", n->string); mandoc_asprintf(&att, "AT&T UNIX %s", n->string); } else att = mandoc_strdup(std_att); @@ -1229,8 +1247,9 @@ post_it(POST_ARGS) /* FALLTHROUGH */ case LIST_diag: if (NULL == nit->head->child) - mandoc_msg(MANDOCERR_IT_NOHEAD, + mandoc_vmsg(MANDOCERR_IT_NOHEAD, mdoc->parse, nit->line, nit->pos, + "Bl -%s It", mdoc_argnames[nbl->args->argv[0].arg]); break; case LIST_bullet: @@ -1241,8 +1260,9 @@ post_it(POST_ARGS) /* FALLTHROUGH */ case LIST_hyphen: if (NULL == nit->body->child) - mandoc_msg(MANDOCERR_IT_NOBODY, + mandoc_vmsg(MANDOCERR_IT_NOBODY, mdoc->parse, nit->line, nit->pos, + "Bl -%s It", mdoc_argnames[nbl->args->argv[0].arg]); /* FALLTHROUGH */ case LIST_item: @@ -1451,6 +1471,7 @@ static int post_bl_head(POST_ARGS) { struct mdoc_node *np, *nn, *nnp; + struct mdoc_argv *argv; int i, j; if (LIST_column != mdoc->last->norm->Bl.type) @@ -1458,22 +1479,12 @@ post_bl_head(POST_ARGS) return(hwarn_eq0(mdoc)); /* - * Convert old-style lists, where the column width specifiers + * Append old-style lists, where the column width specifiers * trail as macro parameters, to the new-style ("normal-form") * lists where they're argument values following -column. */ - /* First, disallow both types and allow normal-form. */ - - /* - * TODO: technically, we can accept both and just merge the two - * lists, but I'll leave that for another day. - */ - - if (mdoc->last->norm->Bl.ncols && mdoc->last->nchild) { - mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_COLUMNS); - return(0); - } else if (NULL == mdoc->last->child) + if (mdoc->last->child == NULL) return(1); np = mdoc->last->parent; @@ -1484,7 +1495,6 @@ post_bl_head(POST_ARGS) break; assert(j < (int)np->args->argc); - assert(0 == np->args->argv[j].sz); /* * Accommodate for new-style groff column syntax. Shuffle the @@ -1492,15 +1502,17 @@ post_bl_head(POST_ARGS) * column field. Then, delete the head children. */ - np->args->argv[j].sz = (size_t)mdoc->last->nchild; - np->args->argv[j].value = mandoc_reallocarray(NULL, - (size_t)mdoc->last->nchild, sizeof(char *)); + argv = np->args->argv + j; + i = argv->sz; + argv->sz += mdoc->last->nchild; + argv->value = mandoc_reallocarray(argv->value, + argv->sz, sizeof(char *)); - mdoc->last->norm->Bl.ncols = np->args->argv[j].sz; - mdoc->last->norm->Bl.cols = (void *)np->args->argv[j].value; + mdoc->last->norm->Bl.ncols = argv->sz; + mdoc->last->norm->Bl.cols = (void *)argv->value; - for (i = 0, nn = mdoc->last->child; nn; i++) { - np->args->argv[j].value[i] = nn->string; + for (nn = mdoc->last->child; nn; i++) { + argv->value[i] = nn->string; nn->string = NULL; nnp = nn; nn = nn->next; @@ -1653,7 +1665,8 @@ post_root(POST_ARGS) /* Check that we begin with a proper `Sh'. */ if (NULL == n->child) - mdoc_nmsg(mdoc, n, MANDOCERR_DOC_EMPTY); + mandoc_msg(MANDOCERR_DOC_EMPTY, mdoc->parse, + n->line, n->pos, NULL); else if (MDOC_Sh != n->child->tok) mandoc_msg(MANDOCERR_SEC_BEFORE, mdoc->parse, n->child->line, n->child->pos, @@ -1681,8 +1694,8 @@ post_st(POST_ARGS) assert(MDOC_TEXT == nch->type); if (NULL == (p = mdoc_a2st(nch->string))) { - mandoc_msg(MANDOCERR_ST_BAD, mdoc->parse, - nch->line, nch->pos, nch->string); + mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, + nch->line, nch->pos, "St %s", nch->string); mdoc_node_delete(mdoc, n); } else { free(nch->string); @@ -1832,7 +1845,8 @@ post_ns(POST_ARGS) { if (MDOC_LINE & mdoc->last->flags) - mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NS_SKIP); + mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse, + mdoc->last->line, mdoc->last->pos, NULL); return(1); } @@ -1909,8 +1923,9 @@ post_sh_head(POST_ARGS) /* The NAME should be first. */ if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) - mandoc_msg(MANDOCERR_NAMESEC_FIRST, mdoc->parse, - mdoc->last->line, mdoc->last->pos, secname); + mandoc_vmsg(MANDOCERR_NAMESEC_FIRST, mdoc->parse, + mdoc->last->line, mdoc->last->pos, + "Sh %s", secname); /* The SYNOPSIS gets special attention in other areas. */ @@ -1953,12 +1968,14 @@ post_sh_head(POST_ARGS) */ if (sec == mdoc->lastnamed) - mandoc_msg(MANDOCERR_SEC_REP, mdoc->parse, - mdoc->last->line, mdoc->last->pos, secname); + mandoc_vmsg(MANDOCERR_SEC_REP, mdoc->parse, + mdoc->last->line, mdoc->last->pos, + "Sh %s", secname); if (sec < mdoc->lastnamed) - mandoc_msg(MANDOCERR_SEC_ORDER, mdoc->parse, - mdoc->last->line, mdoc->last->pos, secname); + mandoc_vmsg(MANDOCERR_SEC_ORDER, mdoc->parse, + mdoc->last->line, mdoc->last->pos, + "Sh %s", secname); /* Mark the last named section. */ @@ -1992,7 +2009,7 @@ post_sh_head(POST_ARGS) goodsec = "9"; mandoc_vmsg(MANDOCERR_SEC_MSEC, mdoc->parse, mdoc->last->line, mdoc->last->pos, - "%s for %s only", secname, goodsec); + "Sh %s for %s only", secname, goodsec); break; default: break; @@ -2174,10 +2191,10 @@ post_dt(POST_ARGS) for (p = nn->string; *p; p++) { if (toupper((unsigned char)*p) == *p) continue; - mandoc_msg(MANDOCERR_TITLE_CASE, + mandoc_vmsg(MANDOCERR_TITLE_CASE, mdoc->parse, nn->line, nn->pos + (p - nn->string), - nn->string); + "Dt %s", nn->string); break; } @@ -2221,8 +2238,8 @@ post_dt(POST_ARGS) mdoc->meta.vol = mandoc_strdup(cp); mdoc->meta.msec = mandoc_strdup(nn->string); } else { - mandoc_msg(MANDOCERR_MSEC_BAD, mdoc->parse, - nn->line, nn->pos, nn->string); + mandoc_vmsg(MANDOCERR_MSEC_BAD, mdoc->parse, + nn->line, nn->pos, "Dt ... %s", nn->string); mdoc->meta.vol = mandoc_strdup(nn->string); mdoc->meta.msec = mandoc_strdup(nn->string); } @@ -2244,8 +2261,8 @@ post_dt(POST_ARGS) } else { cp = mdoc_a2arch(nn->string); if (NULL == cp) { - mandoc_msg(MANDOCERR_ARCH_BAD, mdoc->parse, - nn->line, nn->pos, nn->string); + mandoc_vmsg(MANDOCERR_ARCH_BAD, mdoc->parse, + nn->line, nn->pos, "Dt ... %s", nn->string); free(mdoc->meta.vol); mdoc->meta.vol = mandoc_strdup(nn->string); } else @@ -2355,7 +2372,8 @@ post_ex(POST_ARGS) return(1); if (mdoc->meta.name == NULL) { - mdoc_nmsg(mdoc, n, MANDOCERR_EX_NONAME); + mandoc_msg(MANDOCERR_EX_NONAME, mdoc->parse, + n->line, n->pos, "Ex"); return(1); }