diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2015-02-06 11:54:36 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2015-02-06 11:54:36 +0000 |
commit | daf2e16fdc43b128212a4ed878eda6db14c08074 (patch) | |
tree | 226a418cbf3ee1510fde9bad6d26f52b7dabeb9b | |
parent | a2da7908b98806106e371a1ff27e835194407859 (diff) | |
download | mandoc-daf2e16fdc43b128212a4ed878eda6db14c08074.tar.gz |
better error reporting regarding .OP .RS .UR .TH arguments
-rw-r--r-- | man_macro.c | 26 | ||||
-rw-r--r-- | man_validate.c | 43 | ||||
-rw-r--r-- | mandoc.1 | 57 | ||||
-rw-r--r-- | mandoc.h | 2 | ||||
-rw-r--r-- | read.c | 2 |
5 files changed, 76 insertions, 54 deletions
diff --git a/man_macro.c b/man_macro.c index 88f1f431..dcfd2dc3 100644 --- a/man_macro.c +++ b/man_macro.c @@ -337,31 +337,25 @@ blk_close(MACRO_PROT_ARGS) void blk_exp(MACRO_PROT_ARGS) { - struct man_node *n; - int la; + struct man_node *head; char *p; + int la; rew_scope(MAN_BLOCK, man, tok); man_block_alloc(man, line, ppos, tok); man_head_alloc(man, line, ppos, tok); + head = man->last; - for (;;) { - la = *pos; - if ( ! man_args(man, line, pos, buf, &p)) - break; + la = *pos; + if (man_args(man, line, pos, buf, &p)) man_word_alloc(man, line, la, p); - } - - assert(man); - assert(tok != MAN_MAX); - for (n = man->last; n; n = n->parent) - if (n->tok == tok) { - assert(n->type == MAN_HEAD); - man_unscope(man, n); - break; - } + if (buf[*pos] != '\0') + mandoc_vmsg(MANDOCERR_ARG_EXCESS, + man->parse, line, *pos, "%s ... %s", + man_macronames[tok], buf + *pos); + man_unscope(man, head); man_body_alloc(man, line, ppos, tok); } diff --git a/man_validate.c b/man_validate.c index 4a4c3560..93ee9b3f 100644 --- a/man_validate.c +++ b/man_validate.c @@ -1,7 +1,7 @@ /* $OpenBSD$ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -38,8 +38,6 @@ typedef void (*v_check)(CHKARGS); -static void check_eq2(CHKARGS); -static void check_le5(CHKARGS); static void check_par(CHKARGS); static void check_part(CHKARGS); static void check_root(CHKARGS); @@ -51,6 +49,7 @@ static void post_vs(CHKARGS); static void post_fi(CHKARGS); static void post_ft(CHKARGS); static void post_nf(CHKARGS); +static void post_OP(CHKARGS); static void post_TH(CHKARGS); static void post_UC(CHKARGS); static void post_UR(CHKARGS); @@ -88,7 +87,7 @@ static v_check man_valids[MAN_MAX] = { post_AT, /* AT */ NULL, /* in */ post_ft, /* ft */ - check_eq2, /* OP */ + post_OP, /* OP */ post_nf, /* EX */ post_fi, /* EE */ post_UR, /* UR */ @@ -169,27 +168,27 @@ check_text(CHKARGS) n->line, n->pos + (p - cp), NULL); } -#define INEQ_DEFINE(x, ineq, name) \ -static void \ -check_##name(CHKARGS) \ -{ \ - if (n->nchild ineq (x)) \ - return; \ - mandoc_vmsg(MANDOCERR_ARGCOUNT, man->parse, n->line, n->pos, \ - "line arguments %s %d (have %d)", \ - #ineq, (x), n->nchild); \ -} +static void +post_OP(CHKARGS) +{ -INEQ_DEFINE(2, ==, eq2) -INEQ_DEFINE(5, <=, le5) + if (n->nchild == 0) + mandoc_msg(MANDOCERR_OP_EMPTY, man->parse, + n->line, n->pos, "OP"); + else if (n->nchild > 2) { + n = n->child->next->next; + mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, + n->line, n->pos, "OP ... %s", n->string); + } +} static void post_UR(CHKARGS) { - if (MAN_HEAD == n->type && 1 != n->nchild) - mandoc_vmsg(MANDOCERR_ARGCOUNT, man->parse, n->line, - n->pos, "line arguments eq 1 (have %d)", n->nchild); + if (n->type == MAN_HEAD && n->child == NULL) + mandoc_vmsg(MANDOCERR_UR_NOHEAD, man->parse, + n->line, n->pos, "UR"); check_part(man, n); } @@ -303,8 +302,6 @@ post_TH(CHKARGS) struct man_node *nb; const char *p; - check_le5(man, n); - free(man->meta.title); free(man->meta.vol); free(man->meta.source); @@ -382,6 +379,10 @@ post_TH(CHKARGS) (NULL != (p = mandoc_a2msec(man->meta.msec)))) man->meta.vol = mandoc_strdup(p); + if (n != NULL && (n = n->next) != NULL) + mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, + n->line, n->pos, "TH ... %s", n->string); + /* * Remove the `TH' node after we've processed it for our * meta-data. @@ -1125,6 +1125,18 @@ The utility assumes .Fl std even when it is not specified, but other implementations may not. +.It Sy "missing option string, using \(dq\(dq" +.Pq man +The +.Ic \&OP +macro is invoked without any argument. +An empty pair of square brackets is shown. +.It Sy "missing resource identifier, using \(dq\(dq" +.Pq man +The +.Ic \&UR +macro is invoked without any argument. +An empty pair of angle brackets is shown. .It Sy "missing eqn box, using \(dq\(dq" .Pq eqn A diacritic mark or a binary operator is found, @@ -1645,30 +1657,41 @@ block closing request is invoked with at least one argument. All arguments are ignored. .It Sy "skipping excess arguments" .Pq mdoc , man , roff -The +A macro or request is invoked with too many arguments: +.Bl -dash -offset 2n -width 2n -compact +.It +.Ic \&Fo , +.Ic \&PD , +.Ic \&RS , +.Ic \&UR , +.Ic \&ft , +or +.Ic \&sp +with more than one argument +.It .Ic \&An -macro is invoked with another argument after +with another argument after .Fl split or -.Fl nosplit , -.Ic \&Fo -is invoked with more than one argument, +.Fl nosplit +.It +.Ic \&RE +with more than one argument or with a non-integer argument +.It +.Ic \&OP +or a request of the +.Ic \&de +family with more than two arguments +.It +.Ic \&TH +with more than five arguments +.It .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, the -.Ic \&PD -macro or the -.Ic \&ft -or -.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. +with invalid arguments +.El The excess arguments are ignored. .El .Ss Unsupported features @@ -106,6 +106,8 @@ enum mandocerr { MANDOCERR_PF_SKIP, /* nothing follows prefix: Pf arg */ MANDOCERR_RS_EMPTY, /* empty reference block: Rs */ MANDOCERR_ARG_STD, /* missing -std argument, adding it: macro */ + MANDOCERR_OP_EMPTY, /* missing option string, using "": OP */ + MANDOCERR_UR_NOHEAD, /* missing resource identifier, using "": UR */ MANDOCERR_EQN_NOBOX, /* missing eqn box, using "": op */ /* related to bad arguments */ @@ -150,6 +150,8 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "nothing follows prefix", "empty reference block", "missing -std argument, adding it", + "missing option string, using \"\"", + "missing resource identifier, using \"\"", "missing eqn box, using \"\"", /* related to bad macro arguments */ |