From: Zoran V. <zv...@ar...> - 2006-04-04 10:17:38
|
Hi! It seems like Tcl is also going to do this. Stephen, you might eventually comment on that on tclcore list. Cheers Zoran Anfang der weitergeleiteten E-Mail: > Von: Sam Bromley <sa...@sa...> > Datum: 4. April 2006 11:47:44 MESZ > An: tcl...@li... > Kopie: Sam Bromley <sa...@sa...> > Betreff: [TCLCORE] TIP #265: A Convenient C-side Command Option > Parser for Tcl > Antwort an: tcl...@li... > > > TIP #265: A CONVENIENT C-SIDE COMMAND OPTION PARSER FOR TCL > ============================================================= > Version: $Revision: 1.2 $ > Author: Sam Bromley <sam_at_sambromley.com> > State: Draft > Type: Project > Tcl-Version: 8.5 > Vote: Pending > Created: Monday, 03 April 2006 > URL: http://purl.org/tcl/tip/265.html > WebEdit: http://purl.org/tcl/tip/edit/265 > Post-History: > > ---------------------------------------------------------------------- > --- > > ABSTRACT > ========== > > The Tk C library provides developers with a /Tk_ParseArgv/() function > that allows command line parsing of options of the "-option" form. > Archived discussions on <URL:news:comp.lang.tcl> and on the Wiki > indicate that a desire for similar functionality without Tk has > arisen > several times in the past. This TIP presents a Tk-free implementation > of /Tk_ParseArgv()/ named *Tcl_ParseArgv*, as well as a new function, > *Tcl_ParseArgvObj*, that developers can use to parse "-option" style > command options in C implementations of Tcl commands using the > Tcl_Obj > interface. > > RATIONALE > =========== > > While the parsing of command options can be readily accomplished > on the > Tcl side, a uniform method for parsing "-option" formed options does > not exist on the C side. Many developers are familiar with the > ease of > use of libpopt-style command line parsing, but a similarly clean > method > does not currently exist in Tcl. The common approach is to use > /Tcl_GetIndexFromObj/(), yet this method alone does not allow the > flexibilty and ease of use of libpopt-style parsing. > > One drawback of the classical /Tcl_GetIndexFromObj/()-only > approach is > the need to handle the specifies of your command option parsing for > each unique command. This leads to significant code duplication. A > libpopt-style approach is to bundle all of your parsing specifics > into > a single array of structures capturing the details, and then let a > specific parsing routine handle the parsing of every option for you. > The *Tcl_ParseArgvObj*() routine introduced in this TIP provides this > functionality, thereby allowing the removal of all parsing specifics > from the command implimentation other than that necessary to describe > each optional argument. > > Additionally, a function *Tcl_ParseArgv* is provided to provide the > functionality of /Tk_ParseArgs/() to those who desire it. A > discussion > in 2002 on <URL:news:comp.lang.tcl> > [<URL:http://groups.google.com/group/comp.lang.tcl/browse_thread/ > thread/c4fea8f0346cf8ae/036961bf476a3b99? > q=tcl_parseargv&rnum=2#036961bf476a3b99>] > indicated that this is a desired feature. Arguments against a > *Tcl_ParseArgv* implementation include that it is better to do all > command line parsing on the Tcl side. However, this implies > writing two > wrapper functions: (i) A C implementation of a Tcl command; and > (ii) A > Tcl wrapper that pre-parses the options before calling the C command. > This can lead to significant duplication of effort when porting a > large > project to a Tcl enabled version. This point is particularly relevent > in the context of *Tcl_ParseArgvObj*(), as then one is not assuming > that one can simply replace the main() routine with Tcl, but rather > that one is truly embedding the C side in a larger system. > > *Tcl_ParseArgvObj*() offers a clean method to enable flexible command > line parsing to C implementations of Tcl commands. > > SPECIFICATION > =============== > > This document proposes the following changes to Tcl core: > > 1. Add /generic/tclArgv.c/ and /generic/tclArgv.h/ which > provide the > new library functions /Tcl_ParseArgv()/ and /Tcl_ParseArgvObj > ()/. > > 2. Modify /tcl.h/ to declare object types and functions needed by > /tclArgv.c/. > > The function signatures of *Tcl_ParseArgv* and *Tcl_ParseArgsObjv* > shall be: > > int *Tcl_ParseArgv*(Tcl_Interp */interp/, int */argcPtr/, char > **/argv/, const Tcl_ArgvInfo */argTable/, int /flags/) > > int *Tcl_ParseArgsObjv*(Tcl_Interp */interp/, int */objcPtr/, > Tcl_Obj **/objv/, const Tcl_ArgvInfo */argTable/, int /flags/) > > *Note* that the count of arguments (referred to by /argcPtr/ or > /objcPtr/) will be modified, as will the arrays indicated by / > argv/ and > /objv/. In particular, the arrays of arguments /must not/ be those > passed into the calling command. > > REFERENCE IMPLEMENTATION > ========================== > > A working implementation has been submitted to the Feature Request > Tracker at SourceForge > [<URL:http://sf.net/tracker/? > func=detail&aid=1446696&group_id=10894&atid=360894>]. > > EXAMPLE OF USE > ================ > > #include <tcl.h> > #include <tclArgv.h> /* not needed if subsumed into core */ > > int g_test_cmd(ClientData clientData, Tcl_Interp *interp, > int objc, Tcl_Obj *CONST objv[]) > { > char *gname,*filename; > int i; > int numRepeat; > double scalar; > int doErase = 0; > size_t size; > > /* this table specifies the possible options, all in one place.*/ > Tcl_ArgvInfo argTable[] = { > {"-erase", TCL_ARGV_CONSTANT, (void *) 1, &doErase, > "erase image before plotting"}, > {"-numRepeat", TCL_ARGV_INT, NULL, &numRepeat, > "number of times to repeat test"}, > {"-scalar", TCL_ARGV_FLOAT, NULL, &scalar, > "scalar multiple to use for test"}, > {"-outfile", TCL_ARGV_STRING, NULL, &filename, > "name of file to which to dump result"}, > {NULL, TCL_ARGV_END, NULL, NULL, NULL} > }; > > /* need a local copy of Tcl_Obj array for manipulation */ > size = (unsigned) (objc+1) * sizeof(Tcl_Obj*); > Tcl_Obj **private_objv = (Tcl_Obj**) ckalloc(size); > memcpy(private_objv, objv, size); > > /* Call Tcl_ParseArgObjv to do all the parsing! */ > if (Tcl_ParseArgsObjv(interp,&objc,private_objv,argTable,0) != > TCL_OK) { > /* something went wrong. Error stored in interp's result */ > ckfree(private_objv); > return TCL_ERROR; > } > > /* at this point, any unhandled options are repacked in > private_objv */ > gname = Tcl_GetString(private_obj[1]); > > /* all done */ > ckfree(private_objv); > > /* rest of code continues here...*/ > > return TCL_OK; > } > > COPYRIGHT > =========== > > This document has been placed in the public domain. > > ---------------------------------------------------------------------- > --- > > TIP AutoGenerator - written by Donal K. Fellows > > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting > language > that extends applications into web and mobile media. Attend the > live webcast > and join the prime developer group breaking into this new coding > territory! > http://sel.as-us.falkag.net/sel? > cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ > Tcl-Core mailing list > Tcl...@li... > https://lists.sourceforge.net/lists/listinfo/tcl-core |
From: Stephen D. <sd...@gm...> - 2006-04-05 19:35:32
|
Thanks, I'll take a look. On 4/4/06, Zoran Vasiljevic <zv...@ar...> wrote: > Hi! > > It seems like Tcl is also going to do this. > Stephen, you might eventually comment on > that on tclcore list. > > Cheers > Zoran |