From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]); by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id c25c7f27; for ; Fri, 6 Feb 2015 06:55:07 -0500 (EST) Date: Fri, 6 Feb 2015 06:55:07 -0500 (EST) Message-Id: <4201095191360000558.enqueue@fantadrom.bsd.lv> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: better error reporting regarding .OP .RS .UR .TH arguments X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- better error reporting regarding .OP .RS .UR .TH arguments Modified Files: -------------- mdocml: man_macro.c man_validate.c mandoc.1 mandoc.h read.c Revision Data ------------- Index: mandoc.1 =================================================================== RCS file: /home/cvs/mdocml/mdocml/mandoc.1,v retrieving revision 1.149 retrieving revision 1.150 diff -Lmandoc.1 -Lmandoc.1 -u -p -r1.149 -r1.150 --- mandoc.1 +++ mandoc.1 @@ -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 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 Index: man_validate.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/man_validate.c,v retrieving revision 1.112 retrieving revision 1.113 diff -Lman_validate.c -Lman_validate.c -u -p -r1.112 -r1.113 --- man_validate.c +++ man_validate.c @@ -1,7 +1,7 @@ /* $OpenBSD$ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze + * Copyright (c) 2010, 2012-2015 Ingo Schwarze * * 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); @@ -381,6 +378,10 @@ post_TH(CHKARGS) else if ('\0' != man->meta.msec[0] && (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 Index: mandoc.h =================================================================== RCS file: /home/cvs/mdocml/mdocml/mandoc.h,v retrieving revision 1.198 retrieving revision 1.199 diff -Lmandoc.h -Lmandoc.h -u -p -r1.198 -r1.199 --- mandoc.h +++ mandoc.h @@ -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 */ Index: man_macro.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/man_macro.c,v retrieving revision 1.97 retrieving revision 1.98 diff -Lman_macro.c -Lman_macro.c -u -p -r1.97 -r1.98 --- man_macro.c +++ 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); } Index: read.c =================================================================== RCS file: /home/cvs/mdocml/mdocml/read.c,v retrieving revision 1.124 retrieving revision 1.125 diff -Lread.c -Lread.c -u -p -r1.124 -r1.125 --- read.c +++ read.c @@ -150,6 +150,8 @@ static const char * const mandocerrs[MAN "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 */ -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv