From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mo-p00-ob.rzone.de (mo-p00-ob.rzone.de [81.169.146.161]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id p2GI54lp014218 for ; Wed, 16 Mar 2011 14:05:05 -0400 (EDT) X-RZG-AUTH: :JiIXek6mfvEEUpFQdo7Fj1/zg48CFjWjQv0cW+St/nW/YPAwti93leOoBiEJZ3s= X-RZG-CLASS-ID: mo00 Received: from britannica.bec.de (dslb-088-072-224-251.pools.arcor-ip.net [88.72.224.251]) by post.strato.de (mrclete mo6) (RZmta 25.8) with (DHE-RSA-AES128-SHA encrypted) ESMTPA id z004abn2GH4LnF for ; Wed, 16 Mar 2011 19:00:04 +0100 (MET) Received: by britannica.bec.de (sSMTP sendmail emulation); Wed, 16 Mar 2011 19:00:02 +0100 Date: Wed, 16 Mar 2011 19:00:02 +0100 From: Joerg Sonnenberger To: source@mdocml.bsd.lv Subject: Re: mdocml: Instead of a series of hard-coded strcmps, make argv_a2arg() Message-ID: <20110316180002.GA32271@britannica.bec.de> Mail-Followup-To: source@mdocml.bsd.lv References: <201103161755.p2GHtduY031393@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201103161755.p2GHtduY031393@krisdoz.my.domain> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Mar 16, 2011 at 01:55:39PM -0400, kristaps@mdocml.bsd.lv wrote: > +/* > + * Match up an argument string (e.g., `-foo bar' having "foo") with the > + * correrct identifier. It must apply to the given macro. If none was ^ typo > + * found (including bad matches), return MDOC_ARG_MAX. > + */ > static enum mdocargt > argv_a2arg(enum mdoct tok, const char *p) > { > + enum mdocargt args[MDOC_ARG_MAX]; > + int i, len; > > - /* > - * Parse an argument identifier from its text. XXX - this > - * should really be table-driven to clarify the code. > - * > - * If you add an argument to the list, make sure that you > - * register it here with its one or more macros! > - */ > + len = 0; > > switch (tok) { > case (MDOC_An): > - if (0 == strcmp(p, "split")) > - return(MDOC_Split); > - else if (0 == strcmp(p, "nosplit")) > - return(MDOC_Nosplit); > + args[len++] = MDOC_Split; > + args[len++] = MDOC_Nosplit; > break; > - > case (MDOC_Bd): > - if (0 == strcmp(p, "ragged")) > - return(MDOC_Ragged); > - else if (0 == strcmp(p, "unfilled")) > - return(MDOC_Unfilled); > - else if (0 == strcmp(p, "filled")) > - return(MDOC_Filled); > - else if (0 == strcmp(p, "literal")) > - return(MDOC_Literal); > - else if (0 == strcmp(p, "file")) > - return(MDOC_File); > - else if (0 == strcmp(p, "offset")) > - return(MDOC_Offset); > - else if (0 == strcmp(p, "compact")) > - return(MDOC_Compact); > - else if (0 == strcmp(p, "centered")) > - return(MDOC_Centred); > + args[len++] = MDOC_Ragged; > + args[len++] = MDOC_Unfilled; > + args[len++] = MDOC_Filled; > + args[len++] = MDOC_Literal; > + args[len++] = MDOC_File; > + args[len++] = MDOC_Offset; > + args[len++] = MDOC_Compact; > + args[len++] = MDOC_Centred; > break; > - > case (MDOC_Bf): > - if (0 == strcmp(p, "emphasis")) > - return(MDOC_Emphasis); > - else if (0 == strcmp(p, "literal")) > - return(MDOC_Literal); > - else if (0 == strcmp(p, "symbolic")) > - return(MDOC_Symbolic); > + args[len++] = MDOC_Emphasis; > + args[len++] = MDOC_Literal; > + args[len++] = MDOC_Symbolic; > break; > - > case (MDOC_Bk): > - if (0 == strcmp(p, "words")) > - return(MDOC_Words); > + args[len++] = MDOC_Words; > break; > - > case (MDOC_Bl): > - if (0 == strcmp(p, "bullet")) > - return(MDOC_Bullet); > - else if (0 == strcmp(p, "dash")) > - return(MDOC_Dash); > - else if (0 == strcmp(p, "hyphen")) > - return(MDOC_Hyphen); > - else if (0 == strcmp(p, "item")) > - return(MDOC_Item); > - else if (0 == strcmp(p, "enum")) > - return(MDOC_Enum); > - else if (0 == strcmp(p, "tag")) > - return(MDOC_Tag); > - else if (0 == strcmp(p, "diag")) > - return(MDOC_Diag); > - else if (0 == strcmp(p, "hang")) > - return(MDOC_Hang); > - else if (0 == strcmp(p, "ohang")) > - return(MDOC_Ohang); > - else if (0 == strcmp(p, "inset")) > - return(MDOC_Inset); > - else if (0 == strcmp(p, "column")) > - return(MDOC_Column); > - else if (0 == strcmp(p, "width")) > - return(MDOC_Width); > - else if (0 == strcmp(p, "offset")) > - return(MDOC_Offset); > - else if (0 == strcmp(p, "compact")) > - return(MDOC_Compact); > - else if (0 == strcmp(p, "nested")) > - return(MDOC_Nested); > + args[len++] = MDOC_Bullet; > + args[len++] = MDOC_Dash; > + args[len++] = MDOC_Hyphen; > + args[len++] = MDOC_Item; > + args[len++] = MDOC_Enum; > + args[len++] = MDOC_Tag; > + args[len++] = MDOC_Diag; > + args[len++] = MDOC_Hang; > + args[len++] = MDOC_Ohang; > + args[len++] = MDOC_Inset; > + args[len++] = MDOC_Column; > + args[len++] = MDOC_Width; > + args[len++] = MDOC_Offset; > + args[len++] = MDOC_Compact; > + args[len++] = MDOC_Nested; > break; Why are the tables not static const data? That's IMO more readable too. > - > case (MDOC_Rv): > /* FALLTHROUGH */ > case (MDOC_Ex): > - if (0 == strcmp(p, "std")) > - return(MDOC_Std); > + args[len++] = MDOC_Std; > break; > default: > break; > } > + > + for (i = 0; i < len; i++) > + if (0 == strcmp(p, mdoc_argnames[args[i]])) > + return(args[i]); > > return(MDOC_ARG_MAX); > } What about storing the size of the strings too and matching on that first? Might be helpful or not. Joerg -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv