From: Ingo Schwarze <schwarze@usta.de>
To: tech@mdocml.bsd.lv
Subject: [PATCH] remaining cleanup of mdoc(7) arg count validation
Date: Thu, 20 Jan 2011 21:22:05 +0100 [thread overview]
Message-ID: <20110120202205.GA14941@iris.usta.de> (raw)
In-Reply-To: <20110104000606.GC11029@iris.usta.de>
Hi,
recently, we downgraded several argument count issues in mdoc(7)
from ERROR to WARNING. Not all cases could be handled in the first
batch. Now i had another look and cleaned up the rest, which turned
out to be a subset of all mdoc macros handled by the mdoc_macro.c
function in_line(), so i tested the argument count checking of all
in_line() macros.
The changes are:
* Most empty in_line() macros are already removed by the parser,
so there is no need to check again in mdoc_validate.c.
* posts_wtest[] can be consolidated into posts_text[].
* All uses of eerr_ge1() go away, so we can delete that function.
* For .An, handle both cases (-[no]split with more arguments
and no arguments at all) as argument count warnings.
This patch leaves on single argument count ERROR in mdoc(7):
.Nd without arguments. That issue causes output unusable by
makewhatis(8), so i feel calling that output "seriously garbled"
and throwing an ERROR is warranted.
OK?
Yours,
Ingo
Index: mdoc_validate.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/mdoc_validate.c,v
retrieving revision 1.84
diff -u -p -r1.84 mdoc_validate.c
--- mdoc_validate.c 4 Jan 2011 22:28:17 -0000 1.84
+++ mdoc_validate.c 20 Jan 2011 20:01:57 -0000
@@ -73,7 +73,6 @@ static int concat(struct mdoc *, char *
static int ebool(POST_ARGS);
static int berr_ge1(POST_ARGS);
static int bwarn_ge1(POST_ARGS);
-static int eerr_ge1(POST_ARGS);
static int ewarn_eq0(POST_ARGS);
static int ewarn_eq1(POST_ARGS);
static int ewarn_ge1(POST_ARGS);
@@ -149,11 +148,10 @@ static v_post posts_sp[] = { ewarn_le1,
static v_post posts_ss[] = { post_ignpar, hwarn_ge1, bwarn_ge1, NULL };
static v_post posts_st[] = { post_st, NULL };
static v_post posts_std[] = { post_std, NULL };
-static v_post posts_text[] = { eerr_ge1, NULL };
+static v_post posts_text[] = { ewarn_ge1, NULL };
static v_post posts_text1[] = { ewarn_eq1, NULL };
static v_post posts_vt[] = { post_vt, NULL };
static v_post posts_wline[] = { bwarn_ge1, NULL };
-static v_post posts_wtext[] = { ewarn_ge1, NULL };
static v_pre pres_an[] = { pre_an, NULL };
static v_pre pres_bd[] = { pre_display, pre_bd, pre_literal, pre_par, NULL };
static v_pre pres_bl[] = { pre_bl, pre_par, NULL };
@@ -185,21 +183,21 @@ const struct valids mdoc_valids[MDOC_MAX
{ pres_bl, posts_bl }, /* Bl */
{ NULL, NULL }, /* El */
{ pres_it, posts_it }, /* It */
- { NULL, posts_text }, /* Ad */
+ { NULL, NULL }, /* Ad */
{ pres_an, posts_an }, /* An */
{ NULL, posts_defaults }, /* Ar */
- { NULL, posts_text }, /* Cd */
+ { NULL, NULL }, /* Cd */
{ NULL, NULL }, /* Cm */
{ NULL, NULL }, /* Dv */
- { pres_er, posts_text }, /* Er */
+ { pres_er, NULL }, /* Er */
{ NULL, NULL }, /* Ev */
{ pres_std, posts_std }, /* Ex */
{ NULL, NULL }, /* Fa */
- { pres_fd, posts_wtext }, /* Fd */
+ { pres_fd, posts_text }, /* Fd */
{ NULL, NULL }, /* Fl */
- { NULL, posts_text }, /* Fn */
- { NULL, posts_wtext }, /* Ft */
- { NULL, posts_text }, /* Ic */
+ { NULL, NULL }, /* Fn */
+ { NULL, NULL }, /* Ft */
+ { NULL, NULL }, /* Ic */
{ NULL, posts_text1 }, /* In */
{ NULL, posts_defaults }, /* Li */
{ NULL, posts_nd }, /* Nd */
@@ -211,7 +209,7 @@ const struct valids mdoc_valids[MDOC_MAX
{ NULL, posts_st }, /* St */
{ NULL, NULL }, /* Va */
{ NULL, posts_vt }, /* Vt */
- { NULL, posts_wtext }, /* Xr */
+ { NULL, posts_text }, /* Xr */
{ NULL, posts_text }, /* %A */
{ NULL, posts_text }, /* %B */ /* FIXME: can be used outside Rs/Re. */
{ NULL, posts_text }, /* %D */ /* FIXME: check date with mandoc_a2time(). */
@@ -242,7 +240,7 @@ const struct valids mdoc_valids[MDOC_MAX
{ NULL, NULL }, /* Em */
{ NULL, NULL }, /* Eo */
{ NULL, NULL }, /* Fx */
- { NULL, posts_text }, /* Ms */
+ { NULL, NULL }, /* Ms */
{ NULL, posts_notext }, /* No */
{ NULL, posts_notext }, /* Ns */
{ NULL, NULL }, /* Nx */
@@ -261,9 +259,9 @@ const struct valids mdoc_valids[MDOC_MAX
{ NULL, NULL }, /* So */
{ NULL, NULL }, /* Sq */
{ NULL, posts_bool }, /* Sm */
- { NULL, posts_text }, /* Sx */
- { NULL, posts_text }, /* Sy */
- { NULL, posts_text }, /* Tn */
+ { NULL, NULL }, /* Sx */
+ { NULL, NULL }, /* Sy */
+ { NULL, NULL }, /* Tn */
{ NULL, NULL }, /* Ux */
{ NULL, NULL }, /* Xc */
{ NULL, NULL }, /* Xo */
@@ -279,7 +277,7 @@ const struct valids mdoc_valids[MDOC_MAX
{ NULL, posts_eoln }, /* Ud */
{ NULL, posts_lb }, /* Lb */
{ NULL, posts_notext }, /* Lp */
- { NULL, posts_text }, /* Lk */
+ { NULL, NULL }, /* Lk */
{ NULL, posts_defaults }, /* Mt */
{ NULL, NULL }, /* Brq */
{ NULL, NULL }, /* Bro */
@@ -429,12 +427,6 @@ bwarn_ge1(POST_ARGS)
}
static int
-eerr_ge1(POST_ARGS)
-{
- return(check_count(mdoc, MDOC_ELEM, CHECK_ERROR, CHECK_GT, 0));
-}
-
-static int
ewarn_eq0(POST_ARGS)
{
return(check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0));
@@ -1074,12 +1066,11 @@ post_vt(POST_ARGS)
/*
* The Vt macro comes in both ELEM and BLOCK form, both of which
* have different syntaxes (yet more context-sensitive
- * behaviour). ELEM types must have a child; BLOCK types,
+ * behaviour). ELEM types must have a child, which is already
+ * guaranteed by the in_line parsing routine; BLOCK types,
* specifically the BODY, should only have TEXT children.
*/
- if (MDOC_ELEM == mdoc->last->type)
- return(eerr_ge1(mdoc));
if (MDOC_BODY != mdoc->last->type)
return(1);
@@ -1223,19 +1214,12 @@ post_an(POST_ARGS)
struct mdoc_node *np;
np = mdoc->last;
- if (AUTH__NONE != np->norm->An.auth && np->child) {
+ if (AUTH__NONE == np->norm->An.auth) {
+ if (0 == np->child)
+ check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_GT, 0);
+ } else if (np->child)
check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_EQ, 0);
- return(1);
- }
-
- /*
- * FIXME: make this ewarn and make sure that the front-ends
- * don't print the arguments.
- */
- if (AUTH__NONE != np->norm->An.auth || np->child)
- return(1);
- mdoc_nmsg(mdoc, np, MANDOCERR_NOARGS);
return(1);
}
--
To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv
next prev parent reply other threads:[~2011-01-20 20:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-02 21:15 [PATCH] partial " Ingo Schwarze
2011-01-02 21:35 ` Kristaps Dzonsons
2011-01-04 0:06 ` Ingo Schwarze
2011-01-20 20:22 ` Ingo Schwarze [this message]
2011-01-21 18:31 ` [PATCH] remaining " Kristaps Dzonsons
2011-01-22 16:08 ` better explain roff(7) macro argument quoting Ingo Schwarze
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110120202205.GA14941@iris.usta.de \
--to=schwarze@usta.de \
--cc=tech@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).