ParseArgv.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:14k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1990-1992 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: ParseArgv.3,v 1.3 2002/01/25 21:09:36 dgp Exp $
  9. '" 
  10. .so man.macros
  11. .TH Tk_ParseArgv 3 "" Tk "Tk Library Procedures"
  12. .BS
  13. .SH NAME
  14. Tk_ParseArgv - process command-line options
  15. .SH SYNOPSIS
  16. .nf
  17. fB#include <tk.h>fR
  18. .sp
  19. int
  20. fBTk_ParseArgvfR(fIinterp, tkwin, argcPtr, argv, argTable, flagsfR)
  21. .SH ARGUMENTS
  22. .AS Tk_ArgvInfo *argTable
  23. .AP Tcl_Interp *interp in
  24. Interpreter to use for returning error messages.
  25. .AP Tk_Window tkwin in
  26. Window to use when arguments specify Tk options.  If NULL, then
  27. no Tk options will be processed.
  28. .AP int argcPtr in/out
  29. Pointer to number of arguments in argv;  gets modified to hold
  30. number of unprocessed arguments that remain after the call.
  31. .AP "CONST char" **argv in/out
  32. Command line arguments passed to main program.  Modified to
  33. hold unprocessed arguments that remain after the call.
  34. .AP Tk_ArgvInfo *argTable in
  35. Array of argument descriptors, terminated by element with
  36. type TK_ARGV_END.
  37. .AP int flags in
  38. If non-zero, then it specifies one or more flags that control the
  39. parsing of arguments.  Different flags may be OR'ed together.
  40. The flags currently defined are TK_ARGV_DONT_SKIP_FIRST_ARG,
  41. TK_ARGV_NO_ABBREV, TK_ARGV_NO_LEFTOVERS, and TK_ARGV_NO_DEFAULTS.
  42. .BE
  43. .SH DESCRIPTION
  44. .PP
  45. fBTk_ParseArgvfR processes an array of command-line arguments according
  46. to a table describing the kinds of arguments that are expected.
  47. Each of the arguments in fIargvfR is processed in turn:  if it matches
  48. one of the entries in fIargTablefR, the argument is processed
  49. according to that entry and discarded.  The arguments that do not
  50. match anything in fIargTablefR are copied down to the beginning
  51. of fIargvfR (retaining their original order) and returned to
  52. the caller.  At the end of the call
  53. fBTk_ParseArgvfR sets fI*argcPtrfR to hold the number of
  54. arguments that are left in fIargvfR, and fIargv[*argcPtr]fR
  55. will hold the value NULL.  Normally, fBTk_ParseArgvfR
  56. assumes that fIargv[0]fR is a command name, so it is treated like
  57. an argument that doesn't match fIargTablefR and returned to the
  58. caller;  however, if the TK_ARGV_DONT_SKIP_FIRST_ARG bit is set in
  59. fIflagsfR then fIargv[0]fR will be processed just like the other
  60. elements of fIargvfR.
  61. .PP
  62. fBTk_ParseArgvfR normally returns the value TCL_OK.  If an error
  63. occurs while parsing the arguments, then TCL_ERROR is returned and
  64. fBTk_ParseArgvfR will leave an error message in fIinterp->resultfR
  65. in the standard Tcl fashion.  In
  66. the event of an error return, fI*argvPtrfR will not have been
  67. modified, but fIargvfR could have been partially modified.  The
  68. possible causes of errors are explained below.
  69. .PP
  70. The fIargTablefR array specifies the kinds of arguments that are
  71. expected;  each of its entries has the following structure:
  72. .CS
  73. typedef struct {
  74. char *fIkeyfR;
  75. int fItypefR;
  76. char *fIsrcfR;
  77. char *fIdstfR;
  78. char *fIhelpfR;
  79. } Tk_ArgvInfo;
  80. .CE
  81. The fIkeyfR field is a string such as ``-display'' or ``-bg''
  82. that is compared with the values in fIargvfR.  fITypefR
  83. indicates how to process an argument that matches fIkeyfR
  84. (more on this below).  fISrcfR and fIdstfR are additional
  85. values used in processing the argument.  Their exact usage
  86. depends on fItypefR, but typically fIsrcfR indicates
  87. a value and fIdstfR indicates where to store the
  88. value.  The fBchar *fR declarations for fIsrcfR and fIdstfR
  89. are placeholders:  the actual types may be different.  Lastly,
  90. fIhelpfR is a string giving a brief description
  91. of this option;  this string is printed when users ask for help
  92. about command-line options.
  93. .PP
  94. When processing an argument in fIargvfR, fBTk_ParseArgvfR
  95. compares the argument to each of the fIkeyfR's in fIargTablefR.
  96. fBTk_ParseArgvfR selects the first specifier whose fIkeyfR matches
  97. the argument exactly, if such a specifier exists.  Otherwise
  98. fBTk_ParseArgvfR selects a specifier for which the argument
  99. is a unique abbreviation.  If the argument is a unique abbreviation
  100. for more than one specifier, then an error is returned.  If there
  101. is no matching entry in fIargTablefR, then the argument is
  102. skipped and returned to the caller.
  103. .PP
  104. Once a matching argument specifier is found, fBTk_ParseArgvfR
  105. processes the argument according to the fItypefR field of the
  106. specifier.  The argument that matched fIkeyfR is called ``the matching
  107. argument'' in the descriptions below.  As part of the processing,
  108. fBTk_ParseArgvfR may also use the next argument in fIargvfR
  109. after the matching argument, which is called ``the following
  110. argument''.  The legal values for fItypefR, and the processing
  111. that they cause, are as follows:
  112. .TP
  113. fBTK_ARGV_ENDfR
  114. Marks the end of the table.  The last entry in fIargTablefR
  115. must have this type;  all of its other fields are ignored and it
  116. will never match any arguments.
  117. .TP
  118. fBTK_ARGV_CONSTANTfR
  119. fISrcfR is treated as an integer and fIdstfR is treated
  120. as a pointer to an integer.  fISrcfR is stored at fI*dstfR.
  121. The matching argument is discarded.
  122. .TP
  123. fBTK_ARGV_INTfR
  124. The following argument must contain an
  125. integer string in the format accepted by fBstrtolfR (e.g. ``0''
  126. and ``0x'' prefixes may be used to specify octal or hexadecimal
  127. numbers, respectively).  fIDstfR is treated as a pointer to an
  128. integer;  the following argument is converted to an integer value
  129. and stored at fI*dstfR.  fISrcfR is ignored.  The matching
  130. and following arguments are discarded from fIargvfR.
  131. .TP
  132. fBTK_ARGV_FLOATfR
  133. The following argument must contain a floating-point number in
  134. the format accepted by fBstrtolfR.
  135. fIDstfR is treated as the address of an double-precision
  136. floating point value;  the following argument is converted to a
  137. double-precision value and stored at fI*dstfR.  The matching
  138. and following arguments are discarded from fIargvfR.
  139. .TP
  140. fBTK_ARGV_STRINGfR
  141. In this form, fIdstfR is treated as a pointer to a (char *);
  142. fBTk_ParseArgvfR stores at fI*dstfR a pointer to the following
  143. argument, and discards the matching and following arguments from
  144. fIargvfR.  fISrcfR is ignored.
  145. .TP
  146. fBTK_ARGV_UIDfR
  147. This form is similar to TK_ARGV_STRING, except that the argument
  148. is turned into a Tk_Uid by calling fBTk_GetUidfR.
  149. fIDstfR is treated as a pointer to a
  150. Tk_Uid; fBTk_ParseArgvfR stores at fI*dstfR the Tk_Uid
  151. corresponding to the following
  152. argument, and discards the matching and following arguments from
  153. fIargvfR.  fISrcfR is ignored.
  154. .TP
  155. fBTK_ARGV_CONST_OPTIONfR
  156. This form causes a Tk option to be set (as if the fBoptionfR
  157. command had been invoked).  The fIsrcfR field is treated as a
  158. pointer to a string giving the value of an option, and fIdstfR
  159. is treated as a pointer to the name of the option.  The matching
  160. argument is discarded.  If fItkwinfR is NULL, then argument
  161. specifiers of this type are ignored (as if they did not exist).
  162. .TP
  163. fBTK_ARGV_OPTION_VALUEfR
  164. This form is similar to TK_ARGV_CONST_OPTION, except that the
  165. value of the option is taken from the following argument instead
  166. of from fIsrcfR.  fIDstfR is used as the name of the option.
  167. fISrcfR is ignored.  The matching and following arguments
  168. are discarded.  If fItkwinfR is NULL, then argument
  169. specifiers of this type are ignored (as if they did not exist).
  170. .TP
  171. fBTK_ARGV_OPTION_NAME_VALUEfR
  172. In this case the following argument is taken as the name of a Tk
  173. option and the argument after that is taken as the value for that
  174. option.  Both fIsrcfR and fIdstfR are ignored.  All three
  175. arguments are discarded from fIargvfR.  If fItkwinfR is NULL,
  176. then argument
  177. specifiers of this type are ignored (as if they did not exist).
  178. .TP
  179. fBTK_ARGV_HELPfR
  180. When this kind of option is encountered, fBTk_ParseArgvfR uses the
  181. fIhelpfR fields of fIargTablefR to format a message describing
  182. all the valid arguments.  The message is placed in fIinterp->resultfR
  183. and fBTk_ParseArgvfR returns TCL_ERROR.  When this happens, the
  184. caller normally prints the help message and aborts.  If the fIkeyfR
  185. field of a TK_ARGV_HELP specifier is NULL, then the specifier will
  186. never match any arguments;  in this case the specifier simply provides
  187. extra documentation, which will be included when some other
  188. TK_ARGV_HELP entry causes help information to be returned.
  189. .TP
  190. fBTK_ARGV_RESTfR
  191. This option is used by programs or commands that allow the last
  192. several of their options to be the name and/or options for some
  193. other program.  If a fBTK_ARGV_RESTfR argument is found, then
  194. fBTk_ParseArgvfR doesn't process any
  195. of the remaining arguments;  it returns them all at
  196. the beginning of fIargvfR (along with any other unprocessed arguments).
  197. In addition, fBTk_ParseArgvfR treats fIdstfR as the address of an
  198. integer value, and stores at fI*dstfR the index of the first of the
  199. fBTK_ARGV_RESTfR options in the returned fIargvfR.  This allows the
  200. program to distinguish the fBTK_ARGV_RESTfR options from other
  201. unprocessed options that preceded the fBTK_ARGV_RESTfR.
  202. .TP
  203. fBTK_ARGV_FUNCfR
  204. For this kind of argument, fIsrcfR is treated as the address of
  205. a procedure, which is invoked to process the following argument.
  206. The procedure should have the following structure:
  207. .RS
  208. .CS
  209. int
  210. fIfuncfR(fIdstfR, fIkeyfR, fInextArgfR)
  211. char *fIdstfR;
  212. char *fIkeyfR;
  213. char *fInextArgfR;
  214. {
  215. }
  216. .CE
  217. The fIdstfR and fIkeyfR parameters will contain the
  218. corresponding fields from the fIargTablefR entry, and
  219. fInextArgfR will point to the following argument from fIargvfR
  220. (or NULL if there aren't any more arguments left in fIargvfR).
  221. If fIfuncfR uses fInextArgfR (so that
  222. fBTk_ParseArgvfR should discard it), then it should return 1.  Otherwise it
  223. should return 0 and fBTkParseArgvfR will process the following
  224. argument in the normal fashion.  In either event the matching argument
  225. is discarded.
  226. .RE
  227. .TP
  228. fBTK_ARGV_GENFUNCfR
  229. This form provides a more general procedural escape.  It treats
  230. fIsrcfR as the address of a procedure, and passes that procedure
  231. all of the remaining arguments.  The procedure should have the following
  232. form:
  233. .RS
  234. .CS
  235. int
  236. fIgenfuncfR(dst, interp, key, argc, argv)
  237. char *fIdstfR;
  238. Tcl_Interp *fIinterpfR;
  239. char *fIkeyfR;
  240. int fIargcfR;
  241. char **fIargvfR;
  242. {
  243. }
  244. .CE
  245. The fIdstfR and fIkeyfR parameters will contain the
  246. corresponding fields from the fIargTablefR entry.  fIInterpfR
  247. will be the same as the fIinterpfR argument to fBTcl_ParseArgvfR.
  248. fIArgcfR and fIargvfR refer to all of the options after the
  249. matching one.  fIGenfuncfR should behave in a fashion similar
  250. to fBTk_ParseArgvfR:  parse as many of the remaining arguments as it can,
  251. then return any that are left by compacting them to the beginning of
  252. fIargvfR (starting at fIargvfR[0]).  fIGenfuncfR
  253. should return a count of how many arguments are left in fIargvfR;
  254. fBTk_ParseArgvfR will process them.  If fIgenfuncfR encounters
  255. an error then it should leave an error message in fIinterp->resultfR,
  256. in the usual Tcl fashion, and return -1;  when this happens
  257. fBTk_ParseArgvfR will abort its processing and return TCL_ERROR.
  258. .RE
  259. .SH "FLAGS"
  260. .TP
  261. fBTK_ARGV_DONT_SKIP_FIRST_ARGfR
  262. fBTk_ParseArgvfR normally treats fIargv[0]fR as a program
  263. or command name, and returns it to the caller just as if it
  264. hadn't matched fIargTablefR.  If this flag is given, then
  265. fIargv[0]fR is not given special treatment.
  266. .TP
  267. fBTK_ARGV_NO_ABBREVfR
  268. Normally, fBTk_ParseArgvfR accepts unique abbreviations for
  269. fIkeyfR values in fIargTablefR.  If this flag is given then
  270. only exact matches will be acceptable.
  271. .TP
  272. fBTK_ARGV_NO_LEFTOVERSfR
  273. Normally, fBTk_ParseArgvfR returns unrecognized arguments to the
  274. caller.  If this bit is set in fIflagsfR then fBTk_ParseArgvfR
  275. will return an error if it encounters any argument that doesn't
  276. match fIargTablefR.  The only exception to this rule is fIargv[0]fR,
  277. which will be returned to the caller with no errors as
  278. long as TK_ARGV_DONT_SKIP_FIRST_ARG isn't specified.
  279. .TP
  280. fBTK_ARGV_NO_DEFAULTSfR
  281. Normally, fBTk_ParseArgvfR searches an internal table of
  282. standard argument specifiers in addition to fIargTablefR.  If
  283. this bit is set in fIflagsfR, then fBTk_ParseArgvfR will
  284. use only fIargTablefR and not its default table.
  285. .SH EXAMPLE
  286. .PP
  287. Here is an example definition of an fIargTablefR and
  288. some sample command lines that use the options.  Note the effect
  289. on fIargcfR and fIargvfR;  arguments processed by fBTk_ParseArgvfR
  290. are eliminated from fIargvfR, and fIargcfR
  291. is updated to reflect reduced number of arguments.
  292. .CS
  293. /*
  294.  * Define and set default values for globals.
  295.  */
  296. int debugFlag = 0;
  297. int numReps = 100;
  298. char defaultFileName[] = "out";
  299. char *fileName = defaultFileName;
  300. Boolean exec = FALSE;
  301. /*
  302.  * Define option descriptions.
  303.  */
  304. Tk_ArgvInfo argTable[] = {
  305. {"-X", TK_ARGV_CONSTANT, (char *) 1, (char *) &debugFlag,
  306. "Turn on debugging printfs"},
  307. {"-N", TK_ARGV_INT, (char *) NULL, (char *) &numReps,
  308. "Number of repetitions"},
  309. {"-of", TK_ARGV_STRING, (char *) NULL, (char *) &fileName,
  310. "Name of file for output"},
  311. {"x", TK_ARGV_REST, (char *) NULL, (char *) &exec,
  312. "File to exec, followed by any arguments (must be last argument)."},
  313. {(char *) NULL, TK_ARGV_END, (char *) NULL, (char *) NULL,
  314.     (char *) NULL}
  315. };
  316. main(argc, argv)
  317. int argc;
  318. char *argv[];
  319. {
  320. &...
  321. if (Tk_ParseArgv(interp, tkwin, &argc, argv, argTable, 0) != TCL_OK) {
  322. fprintf(stderr, "%sen", interp->result);
  323. exit(1);
  324. }
  325. /*
  326.  * Remainder of the program.
  327.  */
  328. }
  329. .CE
  330. .PP
  331. Note that default values can be assigned to variables named in
  332. fIargTablefR:  the variables will only be overwritten if the
  333. particular arguments are present in fIargvfR.
  334. Here are some example command lines and their effects.
  335. .CS
  336. prog -N 200 infile # just sets the numReps variable to 200
  337. prog -of out200 infile  # sets fileName to reference "out200"
  338. prog -XN 10 infile # sets the debug flag, also sets numReps
  339. .CE
  340. In all of the above examples, fIargcfR will be set by fBTk_ParseArgvfR to 2,
  341. fIargvfR[0] will be ``prog'', fIargvfR[1] will be ``infile'',
  342. and fIargvfR[2] will be NULL.
  343. .SH KEYWORDS
  344. arguments, command line, options