summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mandoc.117
-rw-r--r--mdoc_macro.c8
-rw-r--r--mdoc_validate.c71
3 files changed, 53 insertions, 43 deletions
diff --git a/mandoc.1 b/mandoc.1
index 5461300a..86170cb5 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -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