From: SourceForge.net <no...@so...> - 2006-06-14 20:59:46
|
Feature Requests item #1446696, was opened at 2006-03-09 11:29 Message generated for change (Comment added) made by nobody You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=360894&aid=1446696&group_id=10894 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: 44. Parsing and Eval Group: None Status: Open Resolution: None Priority: 5 Submitted By: Sam Bromley (sbromle) Assigned to: Donal K. Fellows (dkf) Summary: Tcl_ParseArgv as a useful non-Tk version of Tk_ParseArgv Initial Comment: In porting an existing package based on C to one that uses Tcl as the glue, I've had the desire to have the Tk_ParseArgv functionality without Tk. This lead me to find the following old conversation regarding this: http://www.google.com/url?sa=D&q=http://groups.google.ca/group/comp.lang.tcl/browse_thread/thread/c4fea8f0346cf8ae/036961bf476a3b99%3Flnk%3Dst%26q%3DTcl_ParseArgv%26rnum%3D1%23036961bf476a3b99 The arguments against Tcl_ParseArgv is that if you are using tcl, then just use it as the main loop, and call out to special function C codes as necessary. By doing so, you can use one of the many Tcl Command line parsing tools listed at http://wiki.tcl.tk/1730. Now while the arguments against this functionality are valid within the context of the process' main loop, it breaks down when you want to parse options in stand-alone commands. At least this is how I see it. To be more precise, I have a C library to which I want to provide a Tcl interface. So for each of the functions in the library, I need to write a wrapper in C, to provide that command to Tcl. If I want these commands to have libpopt or Tk-like command options I either have to 1) Parse the command arguments myself (on the C side); or 2) Write additional wrappers to the commands in Tcl, to pre-parse the options. So in the case of (2), I'm making work for myself, when all I really want to be able to do is call Tcl_ParseArgv and be done with it in the original C command wrapper. NEWays, to get things working quickly, I wrote a Tcl_ParseArgv routine, based (of course) heavily on the tkArgv.c source (which implements Tk_ParseArgv), but with all the Tk specific bits taken out. So now my wrappers can be ported very quickly from their current libpopt handled options, to the Tcl_ParseArgv. Summary: 1) Provide a Tcl_ParseArgv routine that can parse a standard argc,argv[] pair. 2) Useful when functions other than main() wish to parse arguments in argc, argv[] format. 3) Useful when one wishes to have libpopt style command line arguments to functions. 3a) Build argc,argv from objc,objv. 3b) Parse using Tcl_ParseArgv. 3c) Parse remaining arguments in familiar C fashion. 4) Makes re-writing of C-based wrappers written using libpopt trivial. Code (which can be used as a shared library), is attached. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2006-06-14 13:59 Message: Logged In: NO Please take a look at this version, which does use GetIndexFromObject, parses args as well options, and uses callbacks for type checking: http://naviserver.cvs.sourceforge.net/naviserver/naviserver/nsd/tclobjv.c?view=markup There's lots of examples of it being used, e.g. here: http://naviserver.cvs.sourceforge.net/naviserver/naviserver/nsd/tclrequest.c?revision=1.14&view=markup ---------------------------------------------------------------------- Comment By: Sam Bromley (sbromle) Date: 2006-06-13 19:21 Message: Logged In: YES user_id=1472195 The version I wrote using Tcl_GetIndexFromObj was causing a crash. I've reverted to my original version in the latest version (20060613), and it is this version that I am currently using in production. I've included an example code that compiles a Tcl extension that you can load using "load", and it provides the "parseme" example command. In addition to the coded options, you also have automatic help via "-help". I will be happy to assist in any way you see fit. ---------------------------------------------------------------------- Comment By: Don Porter (dgp) Date: 2006-06-12 13:34 Message: Logged In: YES user_id=80530 I want to make a real patch file for this. Which of the attached files are the right one(s) to use? ---------------------------------------------------------------------- Comment By: Sam Bromley (sbromle) Date: 2006-04-03 12:04 Message: Logged In: YES user_id=1472195 W.r.t. the use of Tcl_GetIndexFromObj(), I did consider it, and originally decided that it was not the way to go. If I wished to implement a single command, I would surely have used it, however, the benifit of the tclArgv approach, is that the writer of the C implemented command can quite cleanly package everything up into a single array of Tcl_ArgInfo structures, and specify type checking and conversion all in one neat place. So,I originally opted for the simplicity of the current code. I have however now rewritten it to use Tcl_GetIndexFromObjStruct, to remove the parsing bit, as per your suggestion. I hope this is less bizarre. :) ---------------------------------------------------------------------- Comment By: Don Porter (dgp) Date: 2006-04-03 10:02 Message: Logged In: YES user_id=80530 Took a quick glance at the submitted code and I see no use of Tcl_GetIndexFromObj(). Seems very bizarre to me, as I'd expect any command line parsing to be a thin wrapper around it. ---------------------------------------------------------------------- Comment By: Donal K. Fellows (dkf) Date: 2006-04-03 02:29 Message: Logged In: YES user_id=79902 Requires a TIP. Email me for details on the process. ---------------------------------------------------------------------- Comment By: Sam Bromley (sbromle) Date: 2006-03-10 14:47 Message: Logged In: YES user_id=1472195 I've added a routine "Tcl_ParseArgsObj" that provides libpopt or Tk_ParseArgv type parsing, but for Tcl_Obj *objv[] array passed to C implemented Tcl commands. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=360894&aid=1446696&group_id=10894 |