From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp1.rz.uni-karlsruhe.de (Debian-exim@smtp1.rz.uni-karlsruhe.de [129.13.185.217]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id p0KKM8cK021498 for ; Thu, 20 Jan 2011 15:22:09 -0500 (EST) Received: from hekate.usta.de (asta-nat.asta.uni-karlsruhe.de [172.22.63.82]) by smtp1.rz.uni-karlsruhe.de with esmtp (Exim 4.63 #1) id 1Pg11C-0004wm-54; Thu, 20 Jan 2011 21:22:06 +0100 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.72) (envelope-from ) id 1Pg11C-00056M-3d for tech@mdocml.bsd.lv; Thu, 20 Jan 2011 21:22:06 +0100 Received: from iris.usta.de ([172.24.96.5] helo=usta.de) by donnerwolke.usta.de with esmtp (Exim 4.69) (envelope-from ) id 1Pg11C-00041j-2w for tech@mdocml.bsd.lv; Thu, 20 Jan 2011 21:22:06 +0100 Received: from schwarze by usta.de with local (Exim 4.72) (envelope-from ) id 1Pg11B-0006tC-RG for tech@mdocml.bsd.lv; Thu, 20 Jan 2011 21:22:05 +0100 Date: Thu, 20 Jan 2011 21:22:05 +0100 From: Ingo Schwarze To: tech@mdocml.bsd.lv Subject: [PATCH] remaining cleanup of mdoc(7) arg count validation Message-ID: <20110120202205.GA14941@iris.usta.de> References: <20110102211552.GB21085@iris.usta.de> <4D20EFA4.6090409@bsd.lv> <20110104000606.GC11029@iris.usta.de> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20110104000606.GC11029@iris.usta.de> User-Agent: Mutt/1.5.21 (2010-09-15) 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