home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume17 / parseargs / part04 < prev    next >
Internet Message Format  |  1991-03-17  |  63KB

  1. From: brad@hcx1.ssd.csd.harris.com (Brad Appleton)
  2. Newsgroups: comp.sources.misc
  3. Subject: v17i049:  parseargs - functions to parse command line arguments, Part04/12
  4. Message-ID: <1991Mar17.200651.17871@sparky.IMD.Sterling.COM>
  5. Date: 17 Mar 91 20:06:51 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: a0790335 6200296b 01972989 8e18cf04
  8.  
  9. Submitted-by: Brad Appleton <brad@hcx1.ssd.csd.harris.com>
  10. Posting-number: Volume 17, Issue 49
  11. Archive-name: parseargs/part04
  12.  
  13. This is part 4 of parseargs
  14.  
  15. #!/bin/sh
  16. # this is Part.04 (part 4 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file parseargs/doc/parseargs.man1 continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 4; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping parseargs/doc/parseargs.man1'
  34. else
  35. echo 'x - continuing file parseargs/doc/parseargs.man1'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'parseargs/doc/parseargs.man1' &&
  37. .TP 14
  38. \fB\-F\fP \fIstring\fP
  39. string to use for false boolean arguments  (\fIdefault=``\^''\fP\|)
  40. .TP 14
  41. \fB\-A\fP
  42. modify array behavior for the specified shell.
  43. .TP 14
  44. \fB\-a\fP \fIarg-spec\fP
  45. argument specification string
  46. .TP 14
  47. \fB\-e\fP\ \fIname\fP
  48. read the arg-spec string from the environment variable named \fIname\fP
  49. .TP 14
  50. \fB\-f\fP \fIfile\fP
  51. read the arg-spec from \fIfile\fP  (\fIdefault=stdin\fP)
  52. .TP 14
  53. \fB\-l\fP
  54. Long-options only. Disable the parsing of (single-character) options.
  55. .TP 14
  56. \fB\-o\fP
  57. Options only. Disable the parsing of long-options (keywords).
  58. .TP 14
  59. \fB\-s\fP \fIshell\fP
  60. use \fIshell\fP command syntax\|  (\fIdefault=``sh''\fP\|)
  61. .TP 14
  62. \fB\-u\fP
  63. unset positional parameters before assigning variables
  64. .TP 14
  65. \fB\-p\fP
  66. prompt the user for missing required arguments
  67. .TP 14
  68. \fB\-i\fP
  69. ignore bad command-line syntax and continue processing (instead of aborting)
  70. .\"-----------------------------------------------------------
  71. .SH ARGUMENTS
  72. .TP 14
  73. \fI\-\^\-\fP
  74. Indicates that any remaining options are intended for the calling program.
  75. .TP 14
  76. \fIname\fP
  77. name of calling program
  78. .TP 14
  79. \fIarguments\fP
  80. arguments to calling program
  81. .\"-----------------------------------------------------------
  82. .so parseargs1.inc
  83. .\"-----------------------------------------------------------
  84. .PP
  85. The argument specification string contains one entry for each possible flag.
  86. Entries in the arguments specification string are separated by commas.
  87. Each entry has five comma-separated fields:
  88. a name, some flags, a type, a variable-name, and a prompt.
  89. Each of these fields are described below:
  90. .TP 10
  91. \fIname\fP
  92. The single character name of the associated flag.
  93. For example, to indicate that the program is expecting a ``\-x'' flag,
  94. this field would contain \'x\'.
  95. Positional arguments (those without a ``\-\fIx\fP'' prefix)
  96. are indicated by passing a ``space'' character.
  97. .TP 10
  98. \fIflags\fP
  99. Flags modifying the semantics of this entry.
  100. These should have one of
  101. \s-1ARGREQ\s+1
  102. to indicate a required argument or
  103. \s-1ARGOPT\s+1
  104. to indicate an optional argument
  105. (\s-1ARGOPT\s+1 is the default unless \s-1ARGREQ\s+1 is specified).
  106. \s-1ARGPOS\s+1
  107. can be ``ored'' in to indicate a positional argument that may also
  108. be keyword matched.
  109. \s-1ARGNOVAL\s+1
  110. can be ``ored'' in to indicate that an argument is an option
  111. or a keyword that does not use an accompanying argument (such as
  112. a boolean flag). This flag is only required for corresponding argument
  113. types that are implemented by the programmer; \fBparseargs\fP already
  114. knows which pre-defined argument types take an argument.
  115. \s-1ARGVALOPT\s+1
  116. can be ``ored'' in to indicate that an argument to the option may be
  117. optionally supplied on the command-line, but is not required.
  118. \s-1ARGVALREQ\s+1
  119. can be ``ored'' in to indicate that an argument to the option is required
  120. (this is the default behavior for options that take arguments).
  121. \s-1ARGLIST\s+1
  122. can be ``ored'' in (using the `\^|\^' character) to indicate that an argument
  123. is actually a list of one or more arguments from the command line.
  124. \s-1ARGHIDDEN\s+1
  125. can be ``ored'' in to indicate a flag that should not be printed
  126. in usage messages \(em
  127. for example, flags intended for internal debugging purposes.
  128. .TP 10
  129. \fItype\fP
  130. The type of the argument.
  131. Existing types include
  132. \fIargUsage\fP (print usage message and exit),
  133. \fIargBool\fP and \fIargSBool\fP (set Boolean flags),
  134. \fIargUBool\fP (unset Boolean flags),
  135. \fIargStr\fP (string-valued arguments),
  136. \fIargChar\fP (char-valued arguments),
  137. \fIargInt\fP (native integer arguments),
  138. \fIargShort\fP (short integer arguments),
  139. \fIargLong\fP (long integer arguments),
  140. \fIargFloat\fP (short floating point arguments),
  141. \fIargDouble\fP (long floating point arguments), and
  142. \fIargDummy\fP (only used as part of usage message,
  143. not matched on command-line).
  144. .TP 10
  145. \fIvariable\fP
  146. The name of the shell variable that should receive the converted value.
  147. .TP 10
  148. \fIprompt\fP
  149. The string used when prompting interactively for argument values,
  150. and printed in usage messages. This string may be followed by a
  151. textual description that is enclosed in parentheses, square brackets,
  152. curly braces, or angle brackets.
  153. .PP
  154. The argument specification string must be terminated by the single string:
  155. ``ENDOFARGS''.
  156. .PP
  157. Note that the comma character (',') is used to separate all fields
  158. within an entry, and to separate the entries themselves.
  159. For this reason, \fIno field in any entry may contain a comma unless
  160. it appears inside of double or single quotes\fP.
  161. .PP
  162. .B Parseargs
  163. will parse all command-line arguments for the calling script and match
  164. them against the argument specification string provided. The argument
  165. specification string is read from standard input by default but may not
  166. come from a terminal. The argument specification string may be supplied as
  167. a single string argument by using the \fB\-a\fP ``\fIstring\fP'' flag.
  168. Long argument specification strings however, may limit the number of arguments
  169. to the script if there is a limit to the number of arguments and/or characters
  170. that may appear on the command line.
  171. For this reason, the argument specification string may be stored: in an
  172. environment variable using the \fB-e\fP \fIname\fP option; in a file
  173. and read using the \fB\-f\fP \fIfile\fP option; or read from standard input.
  174. When using the \fB\-e\fP option, the user must remember to use the name
  175. of an environment variable (not a mere shell variable)!
  176. The default behavior is to read the argument specification from standard input.
  177. .\"-----------------------------------------------------------
  178. .so shells.inc
  179. .\"-----------------------------------------------------------
  180. .PP
  181. The double-dash (``\fB\-\^\-\fP'') which precedes the name and arguments of
  182. the calling program is needed in order for \fBparseargs\fP to be able to
  183. distinguish options to itself from options for the calling program.
  184. .PP
  185. The default behavior of parseargs is allow both single-character options and
  186. long-options (keywords) on the command-line. The user may specify that only
  187. options (long-options) are to be permitted by specifying the \fB\-o\fP
  188. (\fB\-l\) option on the command-line.
  189. .\"----------------------------------------------------------------
  190. .so argvalopt.inc
  191. .\"----------------------------------------------------------------
  192. .so sh_arrays.inc
  193. .\"----------------------------------------------------------------
  194. .so env_args.inc
  195. .\"----------------------------------------------------------------
  196. .so env_parse.inc
  197. .\"----------------------------------------------------------------
  198. .so env_usage.inc
  199. .\"----------------------------------------------------------------
  200. .SH EXAMPLES
  201. .PP
  202. As a first example, consider the following argument specification for a
  203. Bourne shell script:
  204. .PP
  205. .nf
  206. .\" *** font 4 is the "typewriter-style" non-proportional font on my machine ***
  207. .ft 4
  208. .sp 8p
  209. #!/bin/sh
  210. .sp 8p
  211. RepCount=2;
  212. Verbose="";
  213. .sp 8p
  214. ARGSPEC="
  215. X    'c', ARGOPT,         argInt,  RepCount, 'count {# times to repeat}',
  216. X    'v', ARGOPT,         argBool, Verbose,  'verbose {turn on verbose mode}',
  217. X    ' ', ARGREQ,         argStr,  InFile,   'input {file to read from}',
  218. X    ' ', ARGOPT,         argStr,  OutFile,  'output {file to write to}',
  219. X    'X', ARGHIDDEN,      argBool, XRated,   'xrated {naughty! naughty!}',
  220. X    ' ', ARGOPT|ARGLIST, listStr, Files,    'files {files to process}',
  221. ENDOFARGS
  222. "
  223. .sp 8p
  224. eval `echo "$ARGUMENTS" | parseargs \-s sh \-\|\- $0 "$@"`
  225. .sp 8p
  226. .ft R
  227. .fi
  228. .PP
  229. This describes a Bourne shell script accepting up to three flag arguments and
  230. one or two positional arguments, plus a list of additional file arguments.
  231. Only the first positional argument is required.
  232. The possible flags (in UNIX) are:
  233. .RS
  234. .TP 10
  235. \fB\-c\fP \fIcount\fP
  236. An integer repetition count.
  237. This defaults to two.
  238. .TP 10
  239. \fB\-v\fP
  240. A Boolean ``verbose'' flag.
  241. It defaults to \s-1FALSE\s+1 (an empty string).
  242. .TP 10
  243. \fB\-X\fP
  244. A Boolean ``X Rated'' flag.
  245. This is not printed in the usage message.
  246. .RE
  247. .PP
  248. The two positional arguments are both strings, as is the final list.
  249. If we were to invoke the above script with the following command line:
  250. .sp 8p
  251. .RS
  252. \f4cmdname  \-v  input_file  output_file  file1  file2\fP
  253. .RE
  254. .sp 8p
  255. Then, after invoking \fBparseargs\fP, the following shell variables would
  256. contain the following values:
  257. .sp 8p
  258. .RS
  259. \f4$RepCount\fP would evaluate to ``\f42\fP\^''
  260. .sp 4p
  261. \f4$Verbose\fP would evaluate to ``\f4\s-1TRUE\s+1\fP\^''
  262. .sp 4p
  263. \f4$InFile\fP would evaluate to ``\f4input_file\fP\^''
  264. .sp 4p
  265. \f4$OutFile\fP would evaluate to ``\f4output_file'\fP\^'
  266. .sp 4p
  267. \f4$Files\fP would evaluate to ``\f4file1  file2\fP\^''
  268. .sp 4p
  269. \f4$XRated\fP would be unset and would evaluate to an empty string (``\^'').
  270. .RE
  271. .sp
  272. .PP
  273. Now let's present a more complete example. The following page shows a
  274. Bourne shell script which uses \fBparseargs\fP to parse its command line,
  275. echoes the settings of all its associated command line variables, and
  276. then prints its command usage.
  277. X
  278. .nf
  279. .\" *** font 4 is the "typewriter-style" non-proportional font on my machine ***
  280. .ft 4
  281. .so ../test.sh
  282. .ft R
  283. .fi
  284. .\"-----------------------------------------------------------
  285. .SH DIAGNOSTICS
  286. \fBParseargs\fP may exit with one of the following status codes:
  287. X
  288. .TP 5
  289. -1
  290. Some type of system error occurred during execution, causing the program
  291. to exit prematurely.
  292. .TP 5
  293. \|\|0
  294. Normal exit status (no problems were encountered).
  295. .TP 5
  296. \|\|1
  297. The calling program specified the \fB\-U\fP or the \fB\-M\fP option to
  298. \fBparseargs\fP, or specified an \fIargUsage\fP flag on the command line.
  299. Only the appropriate message is displayed.
  300. .TP 5
  301. \|\|2
  302. A command line syntax error was encountered by \fBparseargs\fP. The offending
  303. command line argument may have been intended for either \fBparseargs\fP or
  304. for the calling program.
  305. .TP 5
  306. \|\|3
  307. The environment variable that was specified with the \fB\-e\fP option
  308. is either \s-1NULL\s+1 (has an empty value) or does not exist. Perhaps
  309. the user specified a shell variable and/or forgot to export it.
  310. .TP 5
  311. \|\|4
  312. A syntax error was encountered in the argument specification string that was
  313. specified to \fBparseargs\fP.
  314. .\"-----------------------------------------------------------
  315. .SH FILES
  316. .IP "\fI/usr/local/parseargs.pl\fP"
  317. This file defines a \fIperl\fP function named \fIparseargs\fP to parse
  318. arguments more conveniently for perl-scripts. The function is 
  319. both documented and implemented in this file. The user should
  320. ``require'' this file in his/her perl-script before invoking the
  321. function.
  322. .IP "\fI/usr/local/parseargs.awk\fP"
  323. This file defines an \fIawk\fP function named \fIparseargs\fP to parse
  324. arguments more conveniently for awk-scripts. The function is 
  325. both documented and implemented in this file. The user should
  326. include this file in his/her awk-script before invoking the
  327. function.
  328. .\"-----------------------------------------------------------
  329. .SH SEE ALSO
  330. .IR argtype (3),
  331. .IR parseargs (3),
  332. .IR parsecntl (3)
  333. .\"-----------------------------------------------------------
  334. .so caveats.inc
  335. .\"-----------------------------------------------------------
  336. .so bugs.inc
  337. .\"-----------------------------------------------------------
  338. .SH AUTHOR
  339. .nf
  340. Brad Appleton  (\fIbrad@ssd.csd.harris.com\fP)
  341. Harris Computer Systems, Fort Lauderdale, FL USA
  342. .fi
  343. SHAR_EOF
  344. echo 'File parseargs/doc/parseargs.man1 is complete' &&
  345. chmod 0664 parseargs/doc/parseargs.man1 ||
  346. echo 'restore of parseargs/doc/parseargs.man1 failed'
  347. Wc_c="`wc -c < 'parseargs/doc/parseargs.man1'`"
  348. test 12151 -eq "$Wc_c" ||
  349.     echo 'parseargs/doc/parseargs.man1: original size 12151, current size' "$Wc_c"
  350. rm -f _shar_wnt_.tmp
  351. fi
  352. # ============= parseargs/doc/parseargs.man3 ==============
  353. if test -f 'parseargs/doc/parseargs.man3' -a X"$1" != X"-c"; then
  354.     echo 'x - skipping parseargs/doc/parseargs.man3 (File already exists)'
  355.     rm -f _shar_wnt_.tmp
  356. else
  357. > _shar_wnt_.tmp
  358. echo 'x - extracting parseargs/doc/parseargs.man3 (Text)'
  359. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parseargs.man3' &&
  360. .\" $Header: parseargs.3,v 2.0 89/12/24 00:56:26 eric Exp $
  361. .TH PARSEARGS 3
  362. .\"-----------------------------------------------------------
  363. .SH NAME
  364. parseargs, usage \- parse command line argument vectors
  365. .\"-----------------------------------------------------------
  366. .SH SYNOPSIS
  367. #include <parseargs.h>
  368. .PP
  369. .nf
  370. int  parseargs(  char *argv[],  ARGDESC *argd  )
  371. int  fparseargs(  FILE *fp,  ARGDESC *argd  )
  372. int  lparseargs(  ArgList *argls,  ARGDESC *argd  )
  373. int  sparseargs(  char *str,  ARGDESC *argd  )
  374. int  vparseargs(  ARGDESC *argd,  ...  )
  375. void  usage(  const ARGDESC *argd  )
  376. .fi
  377. .\"-----------------------------------------------------------
  378. .SH DESCRIPTION
  379. .so parseargs3.inc
  380. .so fparseargs3.inc
  381. .so lparseargs3.inc
  382. .so sparseargs3.inc
  383. .so vparseargs3.inc
  384. .so usage3.inc
  385. .\"-----------------------------------------------------------
  386. .so argdesc.inc
  387. .\"-----------------------------------------------------------
  388. .SH DEFINING ARGDESC ARRAYS
  389. When defining an argdesc array, the first item in the list should
  390. be the item STARTOFARGS. Normal arguments (defined by the programmer)
  391. may then be specified as documented in this manual.
  392. The list of arguments is terminated using ENDOFARGS.
  393. .PP
  394. For example, consider the description:
  395. .sp 4p
  396. .in +2
  397. .nf
  398. .ft 4
  399. int    RepCount =    2;
  400. BOOL    Verbose =    FALSE;
  401. char    *InFile;
  402. char    *OutFile =    CHARNULL;
  403. BOOL    XRated =    FALSE;
  404. struct namelist *Files = NULL;
  405. X
  406. ARGDESC Args[] =
  407. {
  408. X  STARTOFARGS,
  409. X  'c', ARGOPT,    argInt,  _\|_ &RepCount, "REPcount {# of repetitions}",
  410. X  'v', ARGOPT,    argBool, _\|_ &Verbose,  "Verbose {set verbose mode}",
  411. X  ' ', ARGREQ,    argStr,  _\|_ &InFile,   "INPUTfile {input file}",
  412. X  ' ', ARGOPT,    argStr,  _\|_ &OutFile,  "OUTPUTfile {output file}",
  413. X  'X', ARGHIDDEN, argBool, _\|_ &XRated,   "XratedMODE {naughty stuff!}",
  414. X  ' ', ARGOPT\^|\^ARGLIST, argStr, _\|_ &Files, "File {files to be read}",
  415. X  ENDOFARGS
  416. };
  417. .ft R
  418. .fi
  419. .in -2
  420. .PP
  421. This describes a program accepting up to three flag arguments and
  422. one or two positional arguments, plus a list of additional file arguments.
  423. Only the first positional argument is required.
  424. The possible flags (in UNIX) are:
  425. .TP 10
  426. \fB\-c\fP \fIcount\fP
  427. An integer repetition count.
  428. This defaults to two.
  429. .TP 10
  430. \fB\-v\fP
  431. A Boolean ``verbose'' flag.
  432. It defaults to FALSE.
  433. .TP 10
  434. \fB\-X\fP
  435. A Boolean ``X Rated'' flag.
  436. This is not printed in the usage message.
  437. .PP
  438. The two positional arguments are both strings, as is the final list.
  439. In AmigaDOS, the options would be
  440. \fBREP\fP \fBcount\fP,
  441. \fBV\fP, and
  442. \fB\s-1XMODE\s+1\fP.
  443. In \s-1VAX/VMS\s+1, the qualifiers would be
  444. \fB\s-1/REP\s+1\fP=\fIcount\fP,
  445. \fB\s-1/V\s+1\fP, and
  446. \fB\s-1/XMODE\s+1\fP.
  447. .\"-----------------------------------------------------------
  448. .so argflags.inc
  449. .\"-----------------------------------------------------------
  450. .so arg_macros.inc
  451. .\"-----------------------------------------------------------
  452. .so cmd_macros.inc
  453. .\"-----------------------------------------------------------
  454. .so defargs.inc
  455. .\"-----------------------------------------------------------
  456. .so env_args.inc
  457. .\"-----------------------------------------------------------
  458. .so env_parse.inc
  459. .\"-----------------------------------------------------------
  460. .so env_usage.inc
  461. .\"-----------------------------------------------------------
  462. .so multivals.inc
  463. .\"-----------------------------------------------------------
  464. .SH ARGUMENT TYPE FUNCTIONS
  465. The argument types recognized by
  466. .I parseargs
  467. can be extended by adding new type functions.
  468. Argument type functions are declared as:
  469. .RS
  470. .PP
  471. .nf
  472. .ft 4
  473. BOOL  argXxx(  ARGDESC *ad,  char *vp,  BOOL copyf  )
  474. .ft R
  475. .fi
  476. .RE
  477. .PP
  478. The
  479. .I argd
  480. argument points to the descriptor for the argument being converted.
  481. Its main use is to find the location in which to store the converted value,
  482. located in argd\(->ad_valp.
  483. The string value to be converted is passed in
  484. .IR argp
  485. (which will be \s-1NULL\s+1 if the \s-1ARGNOVAL\s+1 flag was set for the
  486. corresponding entry in the arg-descriptor table).
  487. The
  488. .I copyf
  489. flag is TRUE if the
  490. .I argp
  491. string value must be copied when saved.
  492. Most non-string types are copied implicitly
  493. (for example, integer arguments are stored in binary form,
  494. so the original string value need not be saved),
  495. so this argument can usually be ignored.
  496. Put simply, this flag is
  497. TRUE
  498. when
  499. .I argp
  500. points to a temporary buffer area.
  501. .PP
  502. If the type function successfully converts the value,
  503. and uses the entire value,
  504. it should return TRUE.
  505. If the type function successfully converts the value,
  506. and uses only \fIN\fP characters of the value,
  507. it should return -\fIN\fP.
  508. Otherwise,
  509. it should print a message using
  510. .IR usrerr (3)
  511. and return FALSE. This message should be of the form
  512. \fB"invalid xxxx option 'yyyy' for Zzzz"\fP, where xxxx is the type of the
  513. option, yyyy is the string passed in vp, and zzzz is the name (taken from
  514. \fBad\(->ad_prompt\fP).
  515. The \fIargXxxx\fP function is responsible for detecting if the given argument
  516. descriptor is an \s-1ARGVEC\s+1 argument and for taking the appropriate action.
  517. .PP
  518. For example, a type function that took a filename
  519. and stored an open file pointer might be coded as:
  520. .RS
  521. .PP
  522. .nf
  523. .ft 4
  524. #define REALLOC(ptr,size)  ((! ptr) ? malloc(size) : realloc(ptr, size))
  525. .sp 8p
  526. typedef ARGVEC_T(FILE *)  FILEvec_t;
  527. .sp 8p
  528. BOOL  argReadFile(  ARGDESC *\|ad,  char *\|vp,  BOOL copyf  )
  529. {
  530. X    register FILE *fp;
  531. .sp 4p
  532. X    fp = fopen(vp, "r");
  533. .sp 4p
  534. X    if ( ! fp ) {
  535. X        usrerr("cannot open '%s' for reading", vp);
  536. X        return (FALSE);
  537. X    }
  538. .sp 4p
  539. X    if ( BTEST(arg_flags(ad), ARGVEC) ) {
  540. X        FILEvec_t  *vec = (FILEvec_t *) arg_valp(ad);
  541. X        size_t  size  = (1 + vec->count) * (sizeof (FILE *));
  542. .sp 4p
  543. X        vec->array = (FILE **) REALLOC(vec->array, size);
  544. X        if ( ! vec->array )
  545. X            syserr( "(m|re)alloc failed in argReadFile" );
  546. .sp 4p
  547. X        vec->flags = (FILE **) REALLOC(vec->flags, size);
  548. X        if ( ! vec->flags )
  549. X            syserr( "(m|re)alloc failed in argReadFile" );
  550. .sp 4p
  551. X        vec->flags[ vec->count ] = arg_flags(ad);
  552. X        vec->array[ (vec->count)++ ] = fp;
  553. X    }
  554. X    else
  555. X        *(FILE *) arg_valp(ad) = fp;
  556. .sp 4p
  557. X    return (TRUE);
  558. }
  559. .ft R
  560. .fi
  561. .RE
  562. .RE
  563. .\"------------------------------------------------------------------
  564. .SH LONG OPTIONS
  565. .PP
  566. Under \s-1UNIX\s+1, Parseargs also allows for long options in addition to
  567. single character options. Long options are denoted by a `\fB+\fP' character
  568. (which may be changed using \fIkeywordprefix\fP). The keyword that is
  569. used is the first word in the prompt field of an argument descriptor entry.
  570. Long options are case insensitive! An argument to a long option may be
  571. separated from the long option by an equal sign (`=') or by one or more
  572. whitespace characters.  Thus, if an entry looks like:
  573. .RS
  574. .sp 4p
  575. .nf
  576. .ft 4
  577. \^'c', ARGOPT, argInt, _\|_ &count, "repCOUNT (# of times to repeat)",
  578. .ft R
  579. .fi
  580. .sp 4p
  581. .RE
  582. then ``\fB\-c4\fP'', ``\fB+repcount=4\fP'', ``\fB+count=4\fP'',
  583. ``\fB+repcount\04\fP'', and ``\fB+count\04\fP'' will all have the same effect.
  584. .PP
  585. The long option names for ``\fB\-?\fP'' in the default argument descriptor
  586. are ``\fB+help\fP'' and ``\fB+?\fP'' (respectively). In addition, ``\fB++\fP''
  587. or ``\fB+endopts\fP'' may be used to indicate the end of options so that
  588. all remaining arguments will be interpreted as positional parameters
  589. (even if one begins with a `\fB+\fP' or a `\fB\-\fP').
  590. .PP
  591. Under VAX/VMS and AmigaDOS, single-character options are not used and the
  592. ``long'' name (in the prompt field of an argument descriptor) is always used
  593. to match for possible arguments (or keywords, or qualifiers).
  594. .PP
  595. For all supported operating systems, a long option may be matched in one of
  596. two ways: it may match all uppercase characters in the prompt field, or it may
  597. match all characters in the prompt field (as in ``\fB+count=4\fP'' and
  598. ``\fB+repcount=4\fP'').
  599. .PP
  600. Under \s-1UNIX\s+1 and \s-1VAX/VMS\s+1,
  601. only the number of characters required to uniquely identify the desired argument
  602. are needed, but at least two characters must be given (unless the prompt field
  603. is itself less than two characters long). This means that using the above
  604. example, that ``\fB+rep=4\fP'' and
  605. ``\fB+cou=4\fP'' would also work but ``\fB+c=4\fP'' would \s-1NOT\s+1 (in other words, if
  606. you only want to use one character, use ``\fB\-c4\fP'' instead).
  607. .PP
  608. Under VAX/VMS, the possibilities using the above example would be:
  609. ``\fB/REPCOUNT=4\fP'', ``\fB/COUNT=4\fP'', ``\fB/REP=4\fP'', and ``\fB/COU=4\fP'',
  610. .PP
  611. Under AmigaDOS, no ``shortened'' keywords are accepted and the possibilities
  612. using the above example would be:
  613. ``\fBREPCOUNT 4\fP'', and ``\fBCOUNT 4\fP''
  614. .\"------------------------------------------------------------------
  615. .so returns.inc
  616. .\"------------------------------------------------------------------
  617. .SH SEE ALSO
  618. .IR argtype (3),
  619. .IR parseargs (1),
  620. .IR syserr (3)
  621. .br
  622. The ``C Advisor'' column in
  623. .ul
  624. UNIX Review
  625. Vol. 7 No. 11.
  626. .\"-----------------------------------------------------------
  627. .so caveats.inc
  628. .\"-----------------------------------------------------------
  629. .so lib_bugs.inc
  630. .\"-----------------------------------------------------------
  631. .SH AUTHOR
  632. Eric Allman, University of California, Berkeley
  633. .SH MODIFICATIONS
  634. .PP
  635. Modified to accept a vector of arguments, better error messages,
  636. Unix keyword matching, and AmigaDOS version by Peter da Silva.
  637. .PP
  638. Rewritten by Brad Appleton.
  639. Parseargs(1);
  640. functions parsecntl, sparseargs, fparseargs, lparseargs, and vparseargs;
  641. argument types argUsage, argDummy, argUBool, and argTBool;
  642. argument flags \s-1ARGPOS\s+1, \s-1ARGVALOPT\s+1, \s-1ARGVALREQ\s+1,
  643. \s-1ARGVALGIVEN\s+1, \s-1ARGNOVAL\s+1, and \s-1ARGVEC\s+1; and
  644. \s-1VAX/VMS\s+1 version and IBM-PC version by Brad Appleton
  645. SHAR_EOF
  646. chmod 0664 parseargs/doc/parseargs.man3 ||
  647. echo 'restore of parseargs/doc/parseargs.man3 failed'
  648. Wc_c="`wc -c < 'parseargs/doc/parseargs.man3'`"
  649. test 9554 -eq "$Wc_c" ||
  650.     echo 'parseargs/doc/parseargs.man3: original size 9554, current size' "$Wc_c"
  651. rm -f _shar_wnt_.tmp
  652. fi
  653. # ============= parseargs/doc/parseargs1.inc ==============
  654. if test -f 'parseargs/doc/parseargs1.inc' -a X"$1" != X"-c"; then
  655.     echo 'x - skipping parseargs/doc/parseargs1.inc (File already exists)'
  656.     rm -f _shar_wnt_.tmp
  657. else
  658. > _shar_wnt_.tmp
  659. echo 'x - extracting parseargs/doc/parseargs1.inc (Text)'
  660. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parseargs1.inc' &&
  661. .\"----------------------------------------------------------------------------
  662. .\"-- This text was extracted using the following command:
  663. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION ../parseargs.c
  664. .\"----------------------------------------------------------------------------
  665. .SH DESCRIPTION
  666. Given a command name, a vector of string-valued arguments
  667. such as that passed to a shell script,
  668. and a specification string describing the possible arguments,
  669. .B parseargs
  670. matches actual arguments to possible arguments,
  671. converts values to the desired type,
  672. and diagnoses problems such as
  673. missing arguments,
  674. extra arguments,
  675. and argument values that are syntactically incorrect.
  676. Other behavior such as prompting the user for missing arguments and
  677. ignoring as command-line syntax may be specified on the command-line
  678. through the use of various options, or through the use of the
  679. ``\s-1PARSECNTL\s+1'' environment variable.
  680. .PP
  681. Given the command name and the argument specification string,
  682. .B parseargs \-U
  683. prints a reasonably friendly version of the usage of the
  684. calling program on standard diagnostic output. The ``verbosity''
  685. of the usage message may be controlled through the use of the
  686. ``\s-1USAGECNTL\s+1'' environment variable.
  687. .PP
  688. Given the command name and the argument specification string,
  689. .B parseargs \-M
  690. prints a template of the command-syntax on standard output that is
  691. suitable for input to \fInroff\fP or \fItroff\fP using the \-man 
  692. macro package.
  693. SHAR_EOF
  694. chmod 0664 parseargs/doc/parseargs1.inc ||
  695. echo 'restore of parseargs/doc/parseargs1.inc failed'
  696. Wc_c="`wc -c < 'parseargs/doc/parseargs1.inc'`"
  697. test 1461 -eq "$Wc_c" ||
  698.     echo 'parseargs/doc/parseargs1.inc: original size 1461, current size' "$Wc_c"
  699. rm -f _shar_wnt_.tmp
  700. fi
  701. # ============= parseargs/doc/parseargs3.inc ==============
  702. if test -f 'parseargs/doc/parseargs3.inc' -a X"$1" != X"-c"; then
  703.     echo 'x - skipping parseargs/doc/parseargs3.inc (File already exists)'
  704.     rm -f _shar_wnt_.tmp
  705. else
  706. > _shar_wnt_.tmp
  707. echo 'x - extracting parseargs/doc/parseargs3.inc (Text)'
  708. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parseargs3.inc' &&
  709. .\"----------------------------------------------------------------------------
  710. .\"-- This text was extracted using the following command:
  711. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f parseargs ../xparse.c
  712. .\"----------------------------------------------------------------------------
  713. .PP
  714. Given a vector of string-valued arguments such as that passed to \fImain\fP
  715. and a vector describing the possible arguments, \fIparseargs\fP matches
  716. actual arguments to possible arguments, converts values to the desired type,
  717. and diagnoses problems such as missing arguments, extra arguments,
  718. and argument values that are syntactically incorrect.
  719. SHAR_EOF
  720. chmod 0664 parseargs/doc/parseargs3.inc ||
  721. echo 'restore of parseargs/doc/parseargs3.inc failed'
  722. Wc_c="`wc -c < 'parseargs/doc/parseargs3.inc'`"
  723. test 642 -eq "$Wc_c" ||
  724.     echo 'parseargs/doc/parseargs3.inc: original size 642, current size' "$Wc_c"
  725. rm -f _shar_wnt_.tmp
  726. fi
  727. # ============= parseargs/doc/parsecntl.man3 ==============
  728. if test -f 'parseargs/doc/parsecntl.man3' -a X"$1" != X"-c"; then
  729.     echo 'x - skipping parseargs/doc/parsecntl.man3 (File already exists)'
  730.     rm -f _shar_wnt_.tmp
  731. else
  732. > _shar_wnt_.tmp
  733. echo 'x - extracting parseargs/doc/parsecntl.man3 (Text)'
  734. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parsecntl.man3' &&
  735. .\"---------- TO PRINT, USE: {n,t}roff -man file ----------
  736. .TH PARSECNTL 3
  737. .\"-----------------------------------
  738. .SH NAME
  739. parsecntl \- get and set attributes of an argument descriptor array
  740. .\"-----------------------------------
  741. .SH SYNOPSIS
  742. #include <parseargs.h>
  743. .PP
  744. .nf
  745. int  parsecntl( ARGDESC argd[\|],  parsecntl_t func,  parsemode_t mode,  ... )
  746. .fi
  747. X
  748. .\"-----------------------------------
  749. .so parsecntl3.inc
  750. .\"-----------------------------------
  751. .so parsecntls.inc
  752. .\"-----------------------------------
  753. .so parsemodes.inc
  754. .\"-----------------------------------
  755. .so parseflags.inc
  756. .\"-----------------------------------
  757. .so argflags.inc
  758. .\"-----------------------------------
  759. .so returns.inc
  760. .\"-----------------------------------
  761. .SH SEE ALSO
  762. .nf
  763. .IR argtype (3),
  764. .IR parseargs (3),
  765. .IR parseargs (1)
  766. .fi
  767. .\"-----------------------------------
  768. .SH AUTHOR
  769. .PP
  770. .nf
  771. Brad Appleton  (\fIbrad@ssd.csd.harris.com\fP)
  772. Harris Computer Systems, Fort Lauderdale, FL USA
  773. .fi
  774. SHAR_EOF
  775. chmod 0664 parseargs/doc/parsecntl.man3 ||
  776. echo 'restore of parseargs/doc/parsecntl.man3 failed'
  777. Wc_c="`wc -c < 'parseargs/doc/parsecntl.man3'`"
  778. test 974 -eq "$Wc_c" ||
  779.     echo 'parseargs/doc/parsecntl.man3: original size 974, current size' "$Wc_c"
  780. rm -f _shar_wnt_.tmp
  781. fi
  782. # ============= parseargs/doc/parsecntl3.inc ==============
  783. if test -f 'parseargs/doc/parsecntl3.inc' -a X"$1" != X"-c"; then
  784.     echo 'x - skipping parseargs/doc/parsecntl3.inc (File already exists)'
  785.     rm -f _shar_wnt_.tmp
  786. else
  787. > _shar_wnt_.tmp
  788. echo 'x - extracting parseargs/doc/parsecntl3.inc (Text)'
  789. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parsecntl3.inc' &&
  790. .\"----------------------------------------------------------------------------
  791. .\"-- This text was extracted using the following command:
  792. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f parsecntl ../xparse.c
  793. .\"----------------------------------------------------------------------------
  794. .SH "DESCRIPTION"
  795. .PP
  796. .I Parsecntl
  797. will read and/or write the desired attributes of the given
  798. command-object. The attributes to be operated upon are specified by
  799. the second parameter to
  800. .I parsecntl.
  801. The desired mode (read, write, or both) are specified by the third parameter to
  802. .I parsecntl.
  803. If the operation to be performed is
  804. .I pc_\s-1ARGFLAGS\s+1,
  805. then the fourth argument to
  806. .I parsecntl
  807. should be the keyword name of the argument whose flags
  808. are to be retrieved.  The last parameter to
  809. .I parsecntl
  810. is always the object to contain the attribute(s) to be read/written.
  811. If the attribute(s) are to be read (regardless of whether or not they are 
  812. also being changed) then the last argument should be a pointer to
  813. an object, otherwise the last argument should be the object itself.
  814. .PP
  815. If mode is
  816. .I pc_\s-1READ\s+1,
  817. then the desired attributes are copied into
  818. the object pointed to by the last parameter. If the mode is
  819. .I pc_\s-1WRITE\s+1,
  820. then the attributes from the last parameter are copied to the command-
  821. object. If mode is
  822. .I pc_\s-1RDWR\s+1,
  823. then the attributes pointed to by the last
  824. parameter are copied to the command-object, and then the previous value
  825. of these attributes (before they were overwritten) is copied into the
  826. object pointed to by the last parameter.
  827. .PP
  828. If cntl is
  829. .I pc_\s-1ARGFLAGS\s+1,
  830. then the only valid mode is
  831. .I pc_\s-1READ\s+1.
  832. All other attributes may be written or read by
  833. .I parsecntl.
  834. SHAR_EOF
  835. chmod 0664 parseargs/doc/parsecntl3.inc ||
  836. echo 'restore of parseargs/doc/parsecntl3.inc failed'
  837. Wc_c="`wc -c < 'parseargs/doc/parsecntl3.inc'`"
  838. test 1721 -eq "$Wc_c" ||
  839.     echo 'parseargs/doc/parsecntl3.inc: original size 1721, current size' "$Wc_c"
  840. rm -f _shar_wnt_.tmp
  841. fi
  842. # ============= parseargs/doc/parsecntls.inc ==============
  843. if test -f 'parseargs/doc/parsecntls.inc' -a X"$1" != X"-c"; then
  844.     echo 'x - skipping parseargs/doc/parsecntls.inc (File already exists)'
  845.     rm -f _shar_wnt_.tmp
  846. else
  847. > _shar_wnt_.tmp
  848. echo 'x - extracting parseargs/doc/parsecntls.inc (Text)'
  849. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parsecntls.inc' &&
  850. .\"----------------------------------------------------------------------------
  851. .\"-- This text was extracted using the following command:
  852. .\"--   xdoc -man -p '[ \t]*' -s PARSE-CNTLS ../parseargs.h
  853. .\"----------------------------------------------------------------------------
  854. .SH "FUNCTION CODES"
  855. .PP
  856. Each of the following function codes specifies an attribute that
  857. is to be manipulated by \fIparsecntl\fP.  The function code is the
  858. second parameter to \fIparsecntl\fP. With the exception of
  859. .I pc_\s-1ARGFLAGS\s+1,
  860. each of the function codes corresponds to a call to \fIparsecntl\fP
  861. using four parameters (
  862. .I pc_\s-1ARGFLAGS\s+1
  863. uses 5 parameters). In each case,
  864. the last parameter is either the address of a buffer to write the
  865. attribute to, or the actual buffer to read the attribute from 
  866. (depending upon the mode \- the third parameter to \fIparsecntl\fP).
  867. .\"---------------------------------------------
  868. .IP "\fIpc_\s-1PARSEFLAGS\s+1"
  869. This function code is used to read and/or modify the existing parsing 
  870. parsing behavior. The fourth parameter to \fIparsecntl\fP should be a 
  871. combination of pc_XXXX bitmasks if the parse-flags are only being
  872. written, otherwise it should be a pointer to an \fIargMask_t\fP variable.
  873. .\"---------------------------------------------
  874. .IP "\fIpc_\s-1ARGFLAGS\s+1"
  875. This function code may only be used to read the argument-flags of
  876. a named argument. It is an error to specify a mode that attempts
  877. to write the argument-flags with this function code. The fourth
  878. parameter to \fIparsecntl\fP should be the keyword name of the argument
  879. whose flags are to be read. The fifth (and final) argument should
  880. be a pointer to the \fIargMask_t\fP variable which will receive the resulting
  881. argument-flags.
  882. .\"---------------------------------------------
  883. .IP "\fIpc_\s-1DEFARGS\s+1"
  884. This function code is used to query or modify the current default
  885. argument-descriptor list for the given command. The fourth parameter
  886. to \fIparsecntl\fP should be the argument-descriptor array to assign as the
  887. new default-list (or the address of an argdesc-array if the default
  888. list is being retrieved).
  889. X
  890. If a given option/qualifier does not appear to match any items in the
  891. argdesc-array, a  default argdesc-array is then searched to match the
  892. option. If it is STILL unmatched then it is flagged as such. The
  893. default-argdesc array is automatically used by all programmer-defined
  894. argdesc-array but may be unset or reset using the
  895. .I pc_\s-1DEFARGS\s+1
  896. function of
  897. .I parsecntl.
  898. In such a  manner, a  programmer could specify a
  899. different set of default-arguments to search for. Furthermore, default
  900. argdesc-arrays may also be assigned default argdesc-arrays, thus
  901. allowing the programmer to define a whole search-list of default
  902. argdesc-arrays for a given command.
  903. X
  904. This could prove useful in a situation where a set of commands have a
  905. few common-options and differ in their remaining ones. If the same
  906. \fImain()\fP were used for each command, then main could define one common
  907. argdesc-array and then a set of argdesc-arrays for each command. \fIMain\fP
  908. could then figure out which argdesc-array to used based on the name in
  909. \fIargv[0]\fP, and set its default argdesc-array to be the common
  910. argdesc-array, as in the following:
  911. X
  912. .nf
  913. .ft 4
  914. #include <parseargs.h>
  915. X     .
  916. X     .  \fIvariable declarations\fP
  917. X     .
  918. X
  919. static ARGDESC common_args[] = {
  920. X   STARTOFARGS,
  921. X   { 'L', ARGOPT, argBool, __ &lflag, "list (list the items)" },
  922. X   { 'I', ARGOPT, argStr, __ &item, "item (item to use)" },
  923. X   ENDOFARGS
  924. };
  925. X
  926. static ARGDESC cmd1_args[] = {
  927. X   STARTOFARGS,
  928. X   { 's', ARGOPT, argBool, __ &sflag, "S (set S)" },
  929. X   { 't', ARGOPT, argBool, __ &tflag, "T (set T)" },
  930. X   ENDOFARGS
  931. };
  932. X
  933. static ARGDESC cmd2_args[] = {
  934. X   STARTOFARGS,
  935. X   { 'x', ARGOPT, argBool, __ &xflag, "X (set X)" },
  936. X   { 'y', ARGOPT, argBool, __ &yflag, "Y (set Y)" },
  937. X   ENDOFARGS
  938. };
  939. X
  940. main( int argc, char *argv[] )
  941. {
  942. X   ARGDESC *cmd = cmd1_args;
  943. X   int  rc;
  944. X
  945. X   if ( strcmp(*argv, "cmd2") == 0 )
  946. X      cmd = cmd2_args;
  947. X
  948. X   rc = parsecntl( cmd, pc_DEFARGS, pc_WRITE, common_args );
  949. X   if ( rc != pe_SUCCESS )
  950. X      syserr( "unable to set default args" );
  951. X
  952. X   rc = parseargs( argv, cmd );
  953. X      .
  954. X      .
  955. X      .
  956. }
  957. .ft R
  958. .fi
  959. X
  960. Note that in the above call to
  961. .IR parsecntl(3),
  962. that zero will be
  963. returned upon success and non-zero upon failure. If pe_DEFARGS is
  964. returned, then cmd is already on common_args's list of defaults (and
  965. would result in an infinite loop while parsing).
  966. .\"---------------------------------------------
  967. .IP "\fIpc_\s-1NAME\s+1\fP"
  968. .IP "\fIpc_\s-1PURPOSE\s+1\fP"
  969. .IP "\fIpc_\s-1DESCRIPTION\s+1\fP"
  970. Each of these last three function codes are used to modify or query the
  971. name, purpose, or description associated with a command. The fourth
  972. parameter to \fIparsecntl\fP should be the new string to use (or the address
  973. of the string, a \fIchar**\fP variable, to recieve the current value).
  974. SHAR_EOF
  975. chmod 0664 parseargs/doc/parsecntls.inc ||
  976. echo 'restore of parseargs/doc/parsecntls.inc failed'
  977. Wc_c="`wc -c < 'parseargs/doc/parsecntls.inc'`"
  978. test 4875 -eq "$Wc_c" ||
  979.     echo 'parseargs/doc/parsecntls.inc: original size 4875, current size' "$Wc_c"
  980. rm -f _shar_wnt_.tmp
  981. fi
  982. # ============= parseargs/doc/parseflags.inc ==============
  983. if test -f 'parseargs/doc/parseflags.inc' -a X"$1" != X"-c"; then
  984.     echo 'x - skipping parseargs/doc/parseflags.inc (File already exists)'
  985.     rm -f _shar_wnt_.tmp
  986. else
  987. > _shar_wnt_.tmp
  988. echo 'x - extracting parseargs/doc/parseflags.inc (Text)'
  989. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parseflags.inc' &&
  990. .\"----------------------------------------------------------------------------
  991. .\"-- This text was extracted using the following command:
  992. .\"--   xdoc -man -p '[ \t]*' -s PARSE-FLAGS ../parseargs.h
  993. .\"----------------------------------------------------------------------------
  994. .SH "PARSE FLAGS"
  995. .PP
  996. The following bitmasks may be combined in order to modify the
  997. behavior of the parseargs library. The parse flags for a given
  998. may be set through the use of the \fIparsecntl\fP(3) function.
  999. .\"---------------------------------------------
  1000. .IP "\fIpa_\s-1PROMPT\s+1\fP"
  1001. Prompt the user for any missing arguments that are required on the
  1002. command-line. No special escaping or quoting is performed on the
  1003. user input. Required arguments that expect a list of values will
  1004. be repeatedly prompted for (one item per line) until a blank line
  1005. (followed by a carriage return) is entered.
  1006. .\"---------------------------------------------
  1007. .IP "\fIpa_\s-1IGNORE\s+1\fP"
  1008. Ignore any unrecognized or improperly specified command-line arguments
  1009. and continue execution of the program. Normally, if an argument is
  1010. unmatched (or is improperly specified), a usage message is printed
  1011. program execution is terminated.
  1012. .\"---------------------------------------------
  1013. .IP "\fIpa_\s-1OPTSONLY\s+1\fP"
  1014. Under \s-1UNIX\s+1, setting this flag will disable the parsing of long-option
  1015. syntax. This will cause all arguments starting with `+' to always be
  1016. treated as a positional parameter (instead of a long-option).
  1017. .\"---------------------------------------------
  1018. .IP "\fIpa_\s-1KWDSONLY\s+1\fP"
  1019. Under \s-1UNIX\s+1, setting this flag disables the parsing of single-character
  1020. options.  This will cause all arguments starting with `-' to always
  1021. be treated as a positional parameter (instead of an option).
  1022. .\"---------------------------------------------
  1023. .IP "\fIpa_\s-1FLAGS1ST\s+1\fP"
  1024. Setting this flag causes the parseargs library to force any and all
  1025. non-positional arguments to be specified before any positional ones.
  1026. As an example, under \s-1UNIX\s+1, if this flag is \s-1SET\s+1 then
  1027. .I parseargs
  1028. will consider the command line "\fBcmd \-x\fI arg\fR" to consist of one
  1029. option and one positional argument; however the command line
  1030. "\fBcmd\fI arg -x\fR" would be considered to consist of two positional
  1031. arguments (the \fB\-x\fP option will be unmatched).
  1032. X
  1033. If this flag is \s-1UNSET\s+1, then both of the previous examples are
  1034. considered to consist of one option and one positional argument.
  1035. .\"---------------------------------------------
  1036. .IP "\fIpa_\s-1ANYCASE\s+1\fP"
  1037. Setting this flag will cause character-case to be ignored when attempting
  1038. to match single-character argument names (i.e. causes "\fB\-i\fP" and
  1039. "\fB\-I\fP" will be considered equivalent).
  1040. .\"---------------------------------------------
  1041. .IP "\fIpa_\s-1ARGV0\s+1\fP"
  1042. Normally, the parseargs library will assume that the first argument
  1043. on the command-line is the name of the command. Setting this flag
  1044. tells parseargs that this is \s-1NOT\s+1 the case and that the very first
  1045. argument on the command-line is a bona-fide argument to the command.
  1046. .\"---------------------------------------------
  1047. .IP "\fIpa_\s-1NOCHECK\s+1\fP"
  1048. Setting this flag will prevent parseargs from checking for any 
  1049. required arguments that were not given on the command-line. This
  1050. is useful when more than one call to the parseargs library is needed
  1051. to parse all the command-line arguments (which could occur if the
  1052. command-line argument came from a file or from two argv-vectors).
  1053. X
  1054. Keeping this flag on until the final set of arguments is parsed will
  1055. cause parseargs to not check for missing arguments until the last set
  1056. of arguments has been parsed (by the final call to *parseargs).
  1057. .\"---------------------------------------------
  1058. .IP "\fIpa_\s-1CONTINUE\s+1\fP"
  1059. Setting this flag will cause subsequent calls to the parseargs library
  1060. to \s-1NOT\s+1 reset the current command-state. Hence, all arguments will not
  1061. be initially set to "\s-1NOT GIVEN\s+1" and other (normal) initializations are
  1062. not be performed.  This is useful in conjunction with the
  1063. \fIpa_\s-1NOCHECK\s+1\fP flag when more than one call to
  1064. .I parseargs
  1065. is required to parse all the command arguments. In this scenario,
  1066. \fIpa_\s-1CONTINUE\s+1\fP should be unset (the default setting) for the very
  1067. first call to
  1068. .I parseargs,
  1069. but should then be set before any subsequent calls to
  1070. .I parseargs
  1071. are made.
  1072. .\"---------------------------------------------
  1073. .IP "\fIpa_\s-1NOCMDENV\s+1\fP"
  1074. Setting this flag prevents parseargs from checking the
  1075. \s-1\fICMD-NAME\fP_ARGS\s+1 environment variable (or symbol) for any
  1076. user-defined default command arguments.
  1077. .\"---------------------------------------------
  1078. .IP "\fIpa_\s-1COPYF\s+1\fP"
  1079. When this flag is \s-1OFF\s+1 (the default), a value of \s-1FALSE\s+1 is
  1080. provided as the \fIcopyf\fP argument to all the arg-type
  1081. .I (argXxxxx)
  1082. functions when an argument is matched. Setting this flag will cause a value of
  1083. \s-1TRUE\s+1 to be provided as the \fIcopyf\fP argument to all the arg-type
  1084. .I (argXxxxx)
  1085. functions when an argument is matched.
  1086. .\"---------------------------------------------
  1087. SHAR_EOF
  1088. chmod 0664 parseargs/doc/parseflags.inc ||
  1089. echo 'restore of parseargs/doc/parseflags.inc failed'
  1090. Wc_c="`wc -c < 'parseargs/doc/parseflags.inc'`"
  1091. test 5108 -eq "$Wc_c" ||
  1092.     echo 'parseargs/doc/parseflags.inc: original size 5108, current size' "$Wc_c"
  1093. rm -f _shar_wnt_.tmp
  1094. fi
  1095. # ============= parseargs/doc/parsemodes.inc ==============
  1096. if test -f 'parseargs/doc/parsemodes.inc' -a X"$1" != X"-c"; then
  1097.     echo 'x - skipping parseargs/doc/parsemodes.inc (File already exists)'
  1098.     rm -f _shar_wnt_.tmp
  1099. else
  1100. > _shar_wnt_.tmp
  1101. echo 'x - extracting parseargs/doc/parsemodes.inc (Text)'
  1102. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/parsemodes.inc' &&
  1103. .\"----------------------------------------------------------------------------
  1104. .\"-- This text was extracted using the following command:
  1105. .\"--   xdoc -man -p '[ \t]*' -s PARSE-MODES ../parseargs.h
  1106. .\"----------------------------------------------------------------------------
  1107. .SH "PARSE MODES"
  1108. .PP
  1109. \fIParsecntl\fP may be used to read current command attributes, write
  1110. (assign) new command attributes, or both. The mode argument to
  1111. parsecntl determines the which of these three alternatives are
  1112. desired. If the programmer merely wishes to assign new attributes,
  1113. then invoking \fIparsecntl\fP in \fIpc_\s-1WRITE\s+1\fP mode and passing
  1114. the new attributes will do the job. If the programmer wishes simply to query
  1115. attributes, then invoking \fIparsecntl\fP in \fIpc_\s-1READ\s+1\fP mode and
  1116. passing a pointer to the desired object in which to write the attribute
  1117. settings will suffice.
  1118. X
  1119. If the programmer wishes to assign new attributes and at the same time
  1120. find out what the attributes were before making the assignment, then
  1121. programmer must invoke \fIparsecntl\fP for \fIpc_\s-1RDWR\s+1\fP mode
  1122. and pass a pointer to the object containing the new attribute settings;
  1123. When \fIparsecntl\fP returns, then (assuming it returns 0) the desired
  1124. attributes will have been assigned and the object that contained the
  1125. new attribute settings will now contain the attribute settings that
  1126. were in effect before \fIparsecntl\fP was invoked.
  1127. SHAR_EOF
  1128. chmod 0664 parseargs/doc/parsemodes.inc ||
  1129. echo 'restore of parseargs/doc/parsemodes.inc failed'
  1130. Wc_c="`wc -c < 'parseargs/doc/parsemodes.inc'`"
  1131. test 1427 -eq "$Wc_c" ||
  1132.     echo 'parseargs/doc/parsemodes.inc: original size 1427, current size' "$Wc_c"
  1133. rm -f _shar_wnt_.tmp
  1134. fi
  1135. # ============= parseargs/doc/returns.inc ==============
  1136. if test -f 'parseargs/doc/returns.inc' -a X"$1" != X"-c"; then
  1137.     echo 'x - skipping parseargs/doc/returns.inc (File already exists)'
  1138.     rm -f _shar_wnt_.tmp
  1139. else
  1140. > _shar_wnt_.tmp
  1141. echo 'x - extracting parseargs/doc/returns.inc (Text)'
  1142. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/returns.inc' &&
  1143. .\"----------------------------------------------------------------------------
  1144. .\"-- This text was extracted using the following command:
  1145. .\"--   xdoc -man -p '[ \t]*' -s RETURN-CODES ../parsearegs.h
  1146. .\"----------------------------------------------------------------------------
  1147. .SH "RETURN VALUE"
  1148. .PP
  1149. The functions in the \fIparseargs\fP library will return a value of zero
  1150. upon succesful completion. They may however, return any of
  1151. the following status codes (which are defined in <parseargs.h>):
  1152. .\"---------------------------------------------
  1153. .IP "\fIpe_\s-1SYSTEM\s+1\fP"
  1154. A system error occurred. The global variable \fIerrno\fP may indicate
  1155. the problem (then again, it may not).
  1156. .\"---------------------------------------------
  1157. .IP "\fIpe_\s-1SUCCESS\s+1\fP"
  1158. Success, no errors encountered (zero is returned).
  1159. .\"---------------------------------------------
  1160. .IP "\fIpe_\s-1SYNTAX\s+1\fP"
  1161. A command-line syntax error was encountered
  1162. .\"---------------------------------------------
  1163. .IP "\fIpe_\s-1DEFARGS\s+1\fP"
  1164. An attempt (using \fIparsecntl\fP) was made to change the
  1165. default arg-search list of a command to point to an argdesc-array
  1166. which already has the given command on its default arg-search list
  1167. (which would cause an infinite loop when attempting to match an
  1168. unknown command-line argument).
  1169. .\"---------------------------------------------
  1170. .IP "\fIpe_\s-1NOMATCH\s+1\fP"
  1171. Unable to match the named argument. This occurs
  1172. when the argument keyword name passed to \fIparsecntl\fP (using the 
  1173. \fIpc_\s-1ARGFLAGS\s+1\fP functions code) was found in the given argdesc-array
  1174. or in its default-list.
  1175. .\"---------------------------------------------
  1176. .IP "\fIpe_\s-1BADMODE\s+1\fP"
  1177. Bad mode for given command in \fIparsecntl\fP. This occurs when 
  1178. \fIpc_\s-1WRITE\s+1\fP or \fIpc_\s-1RDWR\s+1\fP mode is passed to
  1179. .I parsecntl
  1180. in conjunction with the \fIpc_ARGFLAGS\fP functions code.
  1181. .I Parsecntl
  1182. will not modify existing arguments.
  1183. .\"---------------------------------------------
  1184. .IP "\fIpe_\s-1BADCNTL\s+1\fP"
  1185. Bad command for parsecntl. This occurs if an unknown function-code
  1186. was passed to \fIparsecntl\fP.
  1187. SHAR_EOF
  1188. chmod 0664 parseargs/doc/returns.inc ||
  1189. echo 'restore of parseargs/doc/returns.inc failed'
  1190. Wc_c="`wc -c < 'parseargs/doc/returns.inc'`"
  1191. test 2118 -eq "$Wc_c" ||
  1192.     echo 'parseargs/doc/returns.inc: original size 2118, current size' "$Wc_c"
  1193. rm -f _shar_wnt_.tmp
  1194. fi
  1195. # ============= parseargs/doc/sh_arrays.inc ==============
  1196. if test -f 'parseargs/doc/sh_arrays.inc' -a X"$1" != X"-c"; then
  1197.     echo 'x - skipping parseargs/doc/sh_arrays.inc (File already exists)'
  1198.     rm -f _shar_wnt_.tmp
  1199. else
  1200. > _shar_wnt_.tmp
  1201. echo 'x - extracting parseargs/doc/sh_arrays.inc (Text)'
  1202. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/sh_arrays.inc' &&
  1203. .\"----------------------------------------------------------------------------
  1204. .\"-- This text was extracted using the following command:
  1205. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f put_argvector ../parseargs.c
  1206. .\"----------------------------------------------------------------------------
  1207. .SH ARGUMENT LISTS
  1208. .PP
  1209. .B Parseargs
  1210. treats \s-1ARGLIST\s+1 arguments in a special way. The method used for
  1211. setting up an argument list depends largely upon the syntax of shell
  1212. that was specified on the command line via the \fB\-s\fP option
  1213. (although \s-1ARGLIST\s+1 arguments are treated exactly the same as
  1214. \s-1ARGVEC\s+1 arguments).
  1215. .\"---------------
  1216. .SS "Resetting the Positional Parameters to an Argument List"
  1217. .PP
  1218. For the Bourne, Bourne-Again, and Korn shells,
  1219. if the variable name corresponding to the \s-1ARGLIST\s+1 argument is
  1220. ``\fB\-\^\-\fP'', then the positional parameters of the calling program
  1221. will be re-assigned to the contents of the argument list ($1 will be the
  1222. first item, $2 the second item, and so on). In this particular case, the
  1223. calling program may wish to use the \fB\-u\fP option to reset the positional
  1224. parameters to \s-1NULL\s+1 before making any shell-variable assignments
  1225. (this way, the positional parameters will be unset if the associated list
  1226. of command line arguments is not encountered).
  1227. .PP
  1228. Similarly for the C and TC shells,
  1229. if the variable name corresponding to the \s-1ARGLIST\s+1 argument is
  1230. ``\fBargv\fP'', then the positional parameters of the calling program
  1231. will be re-assigned to the contents of the argument list.
  1232. .PP
  1233. For the Plan 9 shell (rc),
  1234. if the variable name corresponding to the \s-1ARGLIST\s+1 argument is
  1235. ``\fB*\fP'', then the positional parameters of the calling program
  1236. will be re-assigned to the contents of the argument list.
  1237. .PP
  1238. For the \fIawk\fP and \fIperl\fP,
  1239. if the variable name corresponding to the \s-1ARGLIST\s+1 argument is
  1240. ``\fBARGV\fP'', then the positional parameters of the calling program
  1241. will be re-assigned to the contents of the argument list.
  1242. .SS "Bourne Shell Argument Lists"
  1243. .PP
  1244. For the Bourne shell, if the associated variable name is \s-1NOT\s+1
  1245. ``\fB\-\^\-\fP'' and the \fB\-A\fP option was \s-1NOT\s+1 specified,
  1246. then that variable is treated as a regular shell variable and is assigned
  1247. using the following syntax:
  1248. .sp 2p
  1249. .RS
  1250. \f4name\^=\^'arg1 arg2\fP  \fI...\fP\f4'\fP
  1251. .RE
  1252. .sp 2p
  1253. After invoking \fBparseargs\fP, if you wish to go through all the
  1254. words in the variable \fIname\fP and one of the words in \fIname\fP
  1255. contains an \s-1IFS\s+1 character (such as a space or a tab), then
  1256. that particular word will be treated by the Bourne shell as two distinct words.
  1257. .sp 8p
  1258. Also for the Bourne shell,
  1259. If the associated variable name is \s-1NOT\s+1 ``\fB\-\^\-\fP'' and the
  1260. \fB\-A\fP option \s-1WAS\s+1 specified, then that variable is treated as
  1261. the root name of an array that is set using the following syntax:
  1262. .sp 2p
  1263. .RS
  1264. .nf
  1265. \f4name1\^=\^'arg1'\fP
  1266. \f4name2\^=\^'arg2'\fP
  1267. \0\0\0 ...
  1268. .fi
  1269. .RE
  1270. .sp 2p
  1271. and the variable ``\f4name_count\fP'' will be set to contain the number of
  1272. items in the array.  The user may then step through all the items in the array
  1273. using the following syntax:
  1274. .sp 2p
  1275. .RS
  1276. .nf
  1277. .ft 4
  1278. i=1
  1279. while [ $i -le $name_count ] ; do
  1280. X  eval echo "item #$i is: " \\$name$i
  1281. X  i=`expr $i + 1`
  1282. done
  1283. .ft R
  1284. .fi
  1285. .RE
  1286. .SS "Korn Shell Argument Lists"
  1287. .PP
  1288. For the Korn shell, if the associated variable name is \s-1NOT\s+1
  1289. ``\fB\-\^\-\fP'', then that variable is treated as an array and is assigned
  1290. using the \fB\-A\fP option of the set command. The first item will be in
  1291. \f4${name[0]}\fP, the second item will be in \f4${name[1]}\fP, etc ...,
  1292. and all items may be given by \f4${name[*]}\fP or \f4${name[@]}\fP.
  1293. If the associated variable name is \s-1NOT\s+1 ``\fB\-\^\-\fP'' and the
  1294. \fB\-A\fP option \s-1WAS\s+1 specified, then that variable is assigned
  1295. using the \fB+A\fP option of the set command (which preserves any array
  1296. elements that were not overwritten by the set command).
  1297. .sp 2p
  1298. It should be noted that there is a bug in versions of the Korn shell
  1299. earlier than 11/16/88a, in which the following:
  1300. .sp 2p
  1301. .RS
  1302. \f4set  \-A  name  'arg1'  'arg2'\fP  \fI...\fP
  1303. .RE
  1304. .sp 2p
  1305. causes the positional parameters to be overwritten as an unintentional
  1306. side-effect. If your version of the Korn shell is earlier than this and you
  1307. wish to keep the contents of your positional parameters after invoking
  1308. \fBparseargs\fP than you must save them yourself before you call
  1309. \fBparseargs\fP. This may be accomplished by the following:
  1310. .sp 2p
  1311. .RS
  1312. \f4set  \-A  save_parms  "$@"\fP
  1313. .RE
  1314. .SS "C and TC Shell Argument Lists"
  1315. .PP
  1316. For the C and TC shells, \s-1ARGLIST\s+1 variables are treated as word-lists
  1317. and are assigned using the following syntax:
  1318. .sp 2p
  1319. .RS
  1320. \f4set  name = ( 'arg1'  'arg2'\fP  \fI...\fP\f4 )\fP
  1321. .RE
  1322. .sp 2p
  1323. The first item will be in \f4$name[1]\fP, the second item will be in
  1324. \f4$name[2]\fP, etc ..., and all items may be given by \f4$name\fP.
  1325. Notice that Korn shell arrays start at index zero whereas C and TC shell
  1326. word-lists start at index one.
  1327. .SS "Bourne-Again Shell Argument Lists"
  1328. .PP
  1329. At present, the Free Software Foundation's Bourne-Again shell is treated
  1330. exactly the same as the Bourne Shell. This will change when \fIbash\fP
  1331. supports arrays.
  1332. .SS "Plan 9 Shell Argument Lists"
  1333. .PP
  1334. For the Plan 9 shell, if the associated variable name is not ``*'' then
  1335. it is considered to be word-list and set using the following syntax:
  1336. .nf
  1337. .RS
  1338. .ft 4
  1339. name=( 'arg1'  'arg2'  ... )
  1340. .ft R
  1341. .RE
  1342. .fi
  1343. .SS "Awk Argument Lists"
  1344. For \fIawk\fP, if the \fB\-A\fP option is not given, then the output for thes
  1345. variable-list will be a line with the variable name, followed by a line with
  1346. each of the values (each value will be separated with the field separator
  1347. specified using the \fB\-S\fP option - which defaults to a space). 
  1348. .nf
  1349. .RS
  1350. .ft 4
  1351. name
  1352. arg1  arg2  ...
  1353. .ft R
  1354. .RE
  1355. .fi
  1356. If the \fB\-A\fP option is given, then the associated variable is considered
  1357. the root name of an array. The ouput for the array
  1358. will consist of two lines for each item in the list (as in the following
  1359. expample):
  1360. .nf
  1361. .RS
  1362. .ft 4
  1363. name1
  1364. arg1
  1365. X
  1366. name2
  1367. arg2
  1368. X
  1369. \...
  1370. .ft R
  1371. .RE
  1372. .fi
  1373. and the variable ``\f4name_count\fP'' will have an output line showing the
  1374. number of items in the array.
  1375. .PP
  1376. .SS "Perl Argument Lists"
  1377. .PP
  1378. For \fIperl\fP, each argument list is considered an array and is set using 
  1379. the following syntax:
  1380. .nf
  1381. .RS
  1382. .ft 4
  1383. @name=( arg1 , arg2 ,  ... )
  1384. .ft R
  1385. .RE
  1386. .fi
  1387. .SS ""A Final Note on Argument Lists"
  1388. .PP
  1389. The word-lists used by the C shell, the arrays used by the Korn shell, the 
  1390. Plan 9 shell, \fIawk\fP, \fIperl\fP, and the positional parameters used by
  1391. all shells (if overwritten by \fBparseargs\fP) will preserve any \s-1IFS\s+1
  1392. characters in their contents.  That is to say that if an item in one of the
  1393. aforementioned multi-word lists contains any \s-1IFS\s+1 characters, it will
  1394. not be split up into multiple items but will remain a single item which
  1395. contains \s-1IFS\s+1 characters.
  1396. SHAR_EOF
  1397. chmod 0664 parseargs/doc/sh_arrays.inc ||
  1398. echo 'restore of parseargs/doc/sh_arrays.inc failed'
  1399. Wc_c="`wc -c < 'parseargs/doc/sh_arrays.inc'`"
  1400. test 6926 -eq "$Wc_c" ||
  1401.     echo 'parseargs/doc/sh_arrays.inc: original size 6926, current size' "$Wc_c"
  1402. rm -f _shar_wnt_.tmp
  1403. fi
  1404. # ============= parseargs/doc/shells.inc ==============
  1405. if test -f 'parseargs/doc/shells.inc' -a X"$1" != X"-c"; then
  1406.     echo 'x - skipping parseargs/doc/shells.inc (File already exists)'
  1407.     rm -f _shar_wnt_.tmp
  1408. else
  1409. > _shar_wnt_.tmp
  1410. echo 'x - extracting parseargs/doc/shells.inc (Text)'
  1411. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/shells.inc' &&
  1412. .\"----------------------------------------------------------------------------
  1413. .\"-- This text was extracted using the following command:
  1414. .\"--   xdoc -man -p '[ \t]*' -s SHELLS ../parseargs.c
  1415. .\"----------------------------------------------------------------------------
  1416. .SH SHELLS
  1417. .PP
  1418. After the command line has been parsed, \fBparseargs\fP will print on
  1419. standard output, a script to set the shell variables which correspond to
  1420. arguments that were present on the command-line.
  1421. This script may be evaluated by redirecting it to a file and then executing
  1422. the file, or by directly evaluating the output from \fBparseargs\fP
  1423. (under most \s-1UNIX\s+1 shells, this could be done using \fBeval\fP).
  1424. If any arguments on the command line contained any special characters that
  1425. needed to be escaped from the shell, these characters will remain intact
  1426. (not be evaluated by the shell) in the corresponding shell variable.
  1427. .PP
  1428. The \fB\-s\fP \fIshell\fP option may be used to tell \fBparseargs\fP which
  1429. shell syntax to use. At present, \fBparseargs\fP only recognizes
  1430. ``sh'', ``csh'', ``ksh'', ``tcsh'', ``bash'', ``rc'', ``awk'', and ``perl''
  1431. as valid command interpreters. \fIAwk\fP output is slightly different from 
  1432. that of the other shells in that the actual variable setting are not
  1433. printed but each line of an associative array is printed (the first field
  1434. is the array index, the second is the value for that index).
  1435. If no shell is specified, then the Bourne shell (``sh'') will be assumed.
  1436. .PP
  1437. If the user wishes to use a value other than ``\s-1TRUE\s+1'' for a boolean
  1438. flag that is true, this may be done using the \fB\-T\fP \fIstring\fP option.
  1439. The same may also be done for a boolean flag that is false using the
  1440. \fB\-F\fP \fIstring\fP option.
  1441. .PP
  1442. .B Parseargs
  1443. will only set the values of variables that correspond to arguments that
  1444. were given on the command line. If a particular argument was not supplied
  1445. on the command line, then no assignment is made for the corresponding
  1446. shell variable and it will have the same value that it had before
  1447. .B parseargs
  1448. was invoked. The only exception to this is that if the \fB\-u\fP option is
  1449. specified, then the positional parameters are unset before any shell variable
  1450. assignments (which may reset the positional parameters) are made.
  1451. SHAR_EOF
  1452. chmod 0664 parseargs/doc/shells.inc ||
  1453. echo 'restore of parseargs/doc/shells.inc failed'
  1454. Wc_c="`wc -c < 'parseargs/doc/shells.inc'`"
  1455. test 2275 -eq "$Wc_c" ||
  1456.     echo 'parseargs/doc/shells.inc: original size 2275, current size' "$Wc_c"
  1457. rm -f _shar_wnt_.tmp
  1458. fi
  1459. # ============= parseargs/doc/sparseargs3.inc ==============
  1460. if test -f 'parseargs/doc/sparseargs3.inc' -a X"$1" != X"-c"; then
  1461.     echo 'x - skipping parseargs/doc/sparseargs3.inc (File already exists)'
  1462.     rm -f _shar_wnt_.tmp
  1463. else
  1464. > _shar_wnt_.tmp
  1465. echo 'x - extracting parseargs/doc/sparseargs3.inc (Text)'
  1466. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/sparseargs3.inc' &&
  1467. .\"----------------------------------------------------------------------------
  1468. .\"-- This text was extracted using the following command:
  1469. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f sparseargs ../xparse.c
  1470. .\"----------------------------------------------------------------------------
  1471. .PP
  1472. Given a single string and an argdesc array, \fIsparseargs\fP
  1473. will parse arguments from a string in much the same manner as \fIparseargs\fP.
  1474. .I Sparseargs
  1475. will split the given string up into a vector of whitespace
  1476. separated tokens and then attempt to parse the resultant vector as
  1477. if it were given as \fIargv[]\fP on the command-line.
  1478. NO special treatment is given to characters such as single-quotes,
  1479. double-quotes, or anything else. \fISparseargs\fP will always assume that
  1480. any whitespace characters are intended as argument separators.
  1481. X
  1482. SHAR_EOF
  1483. chmod 0664 parseargs/doc/sparseargs3.inc ||
  1484. echo 'restore of parseargs/doc/sparseargs3.inc failed'
  1485. Wc_c="`wc -c < 'parseargs/doc/sparseargs3.inc'`"
  1486. test 836 -eq "$Wc_c" ||
  1487.     echo 'parseargs/doc/sparseargs3.inc: original size 836, current size' "$Wc_c"
  1488. rm -f _shar_wnt_.tmp
  1489. fi
  1490. # ============= parseargs/doc/usage3.inc ==============
  1491. if test -f 'parseargs/doc/usage3.inc' -a X"$1" != X"-c"; then
  1492.     echo 'x - skipping parseargs/doc/usage3.inc (File already exists)'
  1493.     rm -f _shar_wnt_.tmp
  1494. else
  1495. > _shar_wnt_.tmp
  1496. echo 'x - extracting parseargs/doc/usage3.inc (Text)'
  1497. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/usage3.inc' &&
  1498. .\"----------------------------------------------------------------------------
  1499. .\"-- This text was extracted using the following command:
  1500. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f usage ../xparse.c
  1501. .\"----------------------------------------------------------------------------
  1502. .PP
  1503. Given an argdesc array, \fIusage\fP will print the usage for the given
  1504. command in the format specified by the user's \s-1USAGECNTL\s+1 environment
  1505. variable.
  1506. SHAR_EOF
  1507. chmod 0664 parseargs/doc/usage3.inc ||
  1508. echo 'restore of parseargs/doc/usage3.inc failed'
  1509. Wc_c="`wc -c < 'parseargs/doc/usage3.inc'`"
  1510. test 449 -eq "$Wc_c" ||
  1511.     echo 'parseargs/doc/usage3.inc: original size 449, current size' "$Wc_c"
  1512. rm -f _shar_wnt_.tmp
  1513. fi
  1514. # ============= parseargs/doc/vparseargs3.inc ==============
  1515. if test -f 'parseargs/doc/vparseargs3.inc' -a X"$1" != X"-c"; then
  1516.     echo 'x - skipping parseargs/doc/vparseargs3.inc (File already exists)'
  1517.     rm -f _shar_wnt_.tmp
  1518. else
  1519. > _shar_wnt_.tmp
  1520. echo 'x - extracting parseargs/doc/vparseargs3.inc (Text)'
  1521. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/doc/vparseargs3.inc' &&
  1522. .\"----------------------------------------------------------------------------
  1523. .\"-- This text was extracted using the following command:
  1524. .\"--   xdoc -man -n -p '[ \t]*' -I DESCRIPTION -f vparseargs ../xparse.c
  1525. .\"----------------------------------------------------------------------------
  1526. .PP
  1527. .I Vparseargs
  1528. takes an argdesc array, the number of arguments to parse, and a
  1529. (possibly NULL terminated) list of argument-strings
  1530. and parses them in much the same manner as \fIparseargs\fP.
  1531. Unlike
  1532. .I sparseargs,
  1533. .I vparseargs
  1534. assumes that all parameters are already split up into tokens, hence any
  1535. whitespace characters contained in any of the string-parameters are used as
  1536. is (and will be considered a part of an argument name or value).
  1537. X
  1538. SHAR_EOF
  1539. chmod 0664 parseargs/doc/vparseargs3.inc ||
  1540. echo 'restore of parseargs/doc/vparseargs3.inc failed'
  1541. Wc_c="`wc -c < 'parseargs/doc/vparseargs3.inc'`"
  1542. test 737 -eq "$Wc_c" ||
  1543.     echo 'parseargs/doc/vparseargs3.inc: original size 737, current size' "$Wc_c"
  1544. rm -f _shar_wnt_.tmp
  1545. fi
  1546. # ============= parseargs/ibm_args.c ==============
  1547. if test -f 'parseargs/ibm_args.c' -a X"$1" != X"-c"; then
  1548.     echo 'x - skipping parseargs/ibm_args.c (File already exists)'
  1549.     rm -f _shar_wnt_.tmp
  1550. else
  1551. > _shar_wnt_.tmp
  1552. echo 'x - extracting parseargs/ibm_args.c (Text)'
  1553. sed 's/^X//' << 'SHAR_EOF' > 'parseargs/ibm_args.c' &&
  1554. /*************************************************************************
  1555. ** ^FILE: ibm_args.c - parse MS-DOS and OS/2 argument vectors
  1556. **
  1557. ** ^DESCRIPTION:
  1558. **    This file contains the routines used to parse MS-DOS and OS/2
  1559. **    argument vectors and to print MS-DOS and OS/2 usage messages.
  1560. **
  1561. ** ^HISTORY:
  1562. **    01/02/91     Brad Appleton     <brad@ssd.csd.harris.com>    Created
  1563. ***^^**********************************************************************/
  1564. X
  1565. #include <ctype.h>
  1566. #include <useful.h>
  1567. #include "strfuncs.h"
  1568. #include "pgopen.h"
  1569. X
  1570. #define PARSEARGS_PRIVATE   /* include private definitions */
  1571. #include "parseargs.h"
  1572. X
  1573. EXTERN  VOID  syserr       ARGS((const char *, ...));
  1574. EXTERN  VOID  usrerr       ARGS((const char *, ...));
  1575. EXTERN  char *getenv       ARGS((const char *));
  1576. EXTERN  VOID  get_winsize  ARGS((int, int *, int *));
  1577. X
  1578. VERSIONID("$Header: parseargs.c,v 2.1 89/12/30 20:59:48 eric Exp $");
  1579. X
  1580. /***************************************************************************
  1581. ** ^GLOBAL-VARIABLE: OptPrefix, KwdPrefix
  1582. **
  1583. ** ^VISIBILITY:
  1584. **    static-global (visible to all functions in this file).
  1585. **
  1586. ** ^DESCRIPTION:
  1587. **    OptPrefix contains the single character prefix used to precede
  1588. SHAR_EOF
  1589. true || echo 'restore of parseargs/ibm_args.c failed'
  1590. fi
  1591. echo 'End of  part 4'
  1592. echo 'File parseargs/ibm_args.c is continued in part 5'
  1593. echo 5 > _shar_seq_.tmp
  1594. exit 0
  1595. exit 0 # Just in case...
  1596. -- 
  1597. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1598. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1599. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1600. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1601.