diff options
-rw-r--r-- | mandoc.1 | 17 | ||||
-rw-r--r-- | mdoc_macro.c | 8 | ||||
-rw-r--r-- | mdoc_validate.c | 71 |
3 files changed, 53 insertions, 43 deletions
@@ -994,7 +994,8 @@ except that it may control a following clause. .It Sy "skipping empty macro" .Pq mdoc -The indicated macro has no arguments and hence no effect. +The indicated macro has no arguments or no body content +and hence no effect. .It Sy "empty argument, using 0n" .Pq mdoc The required width is missing after @@ -1636,14 +1637,16 @@ macro is invoked with another argument after .Fl split or .Fl nosplit , -the -.Ic \&Bf -macro or the -.Ic \&sp -request is invoked with more than one argument, the +.Ic \&Bd , +.Ic \&Bk , +or +.Ic \&Bl +are invoked with invalid arguments, the .Ic \&RE macro is invoked with more than one argument -or with a non-integer argument, or a request of the +or with a non-integer argument, the +.Ic \&sp +request is invoked with more than one argument, or a request of the .Ic \&de family is invoked with more than two arguments. The excess arguments are ignored. diff --git a/mdoc_macro.c b/mdoc_macro.c index 14a2ef27..5a8fd3f2 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -1042,6 +1042,12 @@ blk_full(MACRO_PROT_ARGS) body = mdoc_body_alloc(mdoc, line, ppos, tok); break; } + if (tok == MDOC_Bd || tok == MDOC_Bk) { + mandoc_vmsg(MANDOCERR_ARG_EXCESS, + mdoc->parse, line, la, "%s ... %s", + mdoc_macronames[tok], buf + la); + break; + } if (tok == MDOC_Rs) { mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, line, la, "Rs %s", buf + la); @@ -1105,7 +1111,7 @@ blk_full(MACRO_PROT_ARGS) return; if (head == NULL) head = mdoc_head_alloc(mdoc, line, ppos, tok); - if (nl && tok != MDOC_Rs) + if (nl && tok != MDOC_Bd && tok != MDOC_Bl && tok != MDOC_Rs) append_delims(mdoc, line, pos, buf); if (body != NULL) goto out; diff --git a/mdoc_validate.c b/mdoc_validate.c index f7d0538c..c246385e 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -70,7 +70,6 @@ static void rewrite_macro2len(char **); static void bwarn_ge1(POST_ARGS); static void ewarn_eq1(POST_ARGS); static void ewarn_ge1(POST_ARGS); -static void hwarn_eq0(POST_ARGS); static void post_an(POST_ARGS); static void post_at(POST_ARGS); @@ -421,12 +420,6 @@ ewarn_ge1(POST_ARGS) } static void -hwarn_eq0(POST_ARGS) -{ - check_count(mdoc, MDOC_HEAD, CHECK_EQ, 0); -} - -static void check_args(struct mdoc *mdoc, struct mdoc_node *n) { int i; @@ -1088,8 +1081,6 @@ static void post_literal(POST_ARGS) { - if (mdoc->last->tok == MDOC_Bd) - hwarn_eq0(mdoc); bwarn_ge1(mdoc); /* @@ -1415,13 +1406,21 @@ post_bl_block_tag(POST_ARGS) static void post_bl_head(POST_ARGS) { - struct mdoc_node *np, *nn, *nnp; + struct mdoc_node *nbl, *nh, *nch, *nnext; struct mdoc_argv *argv; int i, j; - if (LIST_column != mdoc->last->norm->Bl.type) { - /* FIXME: this should be ERROR class... */ - hwarn_eq0(mdoc); + nh = mdoc->last; + + if (nh->norm->Bl.type != LIST_column) { + if ((nch = nh->child) == NULL) + return; + mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse, + nch->line, nch->pos, "Bl ... %s", nch->string); + while (nch != NULL) { + mdoc_node_delete(mdoc, nch); + nch = nh->child; + } return; } @@ -1431,17 +1430,15 @@ post_bl_head(POST_ARGS) * lists where they're argument values following -column. */ - if (mdoc->last->child == NULL) + if (nh->child == NULL) return; - np = mdoc->last->parent; - assert(np->args); - - for (j = 0; j < (int)np->args->argc; j++) - if (MDOC_Column == np->args->argv[j].arg) + nbl = nh->parent; + for (j = 0; j < (int)nbl->args->argc; j++) + if (nbl->args->argv[j].arg == MDOC_Column) break; - assert(j < (int)np->args->argc); + assert(j < (int)nbl->args->argc); /* * Accommodate for new-style groff column syntax. Shuffle the @@ -1449,25 +1446,23 @@ post_bl_head(POST_ARGS) * column field. Then, delete the head children. */ - argv = np->args->argv + j; + argv = nbl->args->argv + j; i = argv->sz; - argv->sz += mdoc->last->nchild; + argv->sz += nh->nchild; argv->value = mandoc_reallocarray(argv->value, argv->sz, sizeof(char *)); - mdoc->last->norm->Bl.ncols = argv->sz; - mdoc->last->norm->Bl.cols = (void *)argv->value; + nh->norm->Bl.ncols = argv->sz; + nh->norm->Bl.cols = (void *)argv->value; - for (nn = mdoc->last->child; nn; i++) { - argv->value[i] = nn->string; - nn->string = NULL; - nnp = nn; - nn = nn->next; - mdoc_node_delete(NULL, nnp); + for (nch = nh->child; nch != NULL; nch = nnext) { + argv->value[i++] = nch->string; + nch->string = NULL; + nnext = nch->next; + mdoc_node_delete(NULL, nch); } - - mdoc->last->nchild = 0; - mdoc->last->child = NULL; + nh->nchild = 0; + nh->child = NULL; } static void @@ -1553,9 +1548,15 @@ post_bl(POST_ARGS) static void post_bk(POST_ARGS) { + struct mdoc_node *n; - hwarn_eq0(mdoc); - bwarn_ge1(mdoc); + n = mdoc->last; + + if (n->type == MDOC_BLOCK && n->body->child == NULL) { + mandoc_msg(MANDOCERR_MACRO_EMPTY, + mdoc->parse, n->line, n->pos, "Bk"); + mdoc_node_delete(mdoc, n); + } } static void |