From pa.dec.com!decwrl!uunet!sparky!kent Fri Apr 26 09:02:26 PDT 1991 Article: 2267 of comp.sources.misc Path: pa.dec.com!decwrl!uunet!sparky!kent From: brad@hcx1.ssd.csd.harris.com (Brad Appleton) Newsgroups: comp.sources.misc Subject: v18i101: parseargs - functions to parse command line arguments, Patch04a/4 Message-ID: <1991Apr26.035651.18697@sparky.IMD.Sterling.COM> Date: 26 Apr 91 03:56:51 GMT Sender: kent@sparky.IMD.Sterling.COM (Kent Landfield) Reply-To: uunet!travis.ssd.csd.harris.com!brad Organization: Harris Computer Systems Lines: 1709 Approved: kent@sparky.imd.sterling.com X-Checksum-Snefru: aa10b441 0172f42d 2638fed9 93182d90 Submitted-by: Brad Appleton Posting-number: Volume 18, Issue 101 Archive-name: parseargs/patch04a Patch-To: parseargs: Volume 17, Issue 45-57 This is patch04 for parseargs. It is a four part patch that you will need to unshar in order. It fixes some major bugs, a few minor ones, and corrects some more errors in the documentation. Two new files are given here (patchlevel.h & doc/effects.inc). Two old files are resubmitted (Makefile & doc/Makefile) amd two patchfiles are included (PATCH and DOCPATCH). ______________________ "And miles to go before I sleep." ______________________ Brad Appleton Harris Corp., Computer Systems Division Software Engineer 2101 West Cypress Creek Road, M/S 161 brad@ssd.csd.harris.com Fort Lauderdale, FL 33309-1892 USA ...!uunet!hcx1!brad Phone: (305) 973-5360 ~~~~~~~~~~~~~~~~~~~~ Disclaimer: I said it, not my company! ~~~~~~~~~~~~~~~~~~~ #!/bin/sh # This is a shell archive (produced by shar 3.49) # To extract the files from this archive, save it to a file, remove # everything above the "!/bin/sh" line above, and type "sh file_name". # # made 04/24/1991 21:50 UTC by kent@sparky.IMD.Sterling.COM # # existing files WILL be overwritten # # This is part 1 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 66103 -rw-rw-r-- DOCPATCH # 4610 -rw-rw-r-- Makefile # 79034 -rw-rw-r-- PATCH # 2667 -rw-rw-r-- doc/Makefile # 1060 -rw-rw-r-- doc/effects.inc # 2409 -rw-rw-r-- patchlevel.h # if test -r _shar_seq_.tmp; then echo 'Must unpack archives in sequence!' echo Please unpack part `cat _shar_seq_.tmp` next exit 1 fi # ============= DOCPATCH ============== echo 'x - extracting DOCPATCH (Text)' sed 's/^X//' << 'SHAR_EOF' > 'DOCPATCH' && *** /hx1d3/lp/brad/parseargs_patch03/parseargs/argtype3.txt Wed Apr 10 09:55:51 1991 --- argtype3.txt Mon Apr 15 08:31:00 1991 *************** *** 42,51 **** X called when an argument of that particular type is matched X by one of the argument parsing function in parseargs(3). X When such an argument is matched, its argument translation ! routines is invoked and is passed (1) the address of the X argument descriptor for the matched argument, (2) the possi- X ble argument string for that matched argument, and (3) a ! boolean filed that is TRUE only if the second parameter X points to temporary storage (indicating that some copying X may need to be done instead of just pointing to the same X object). --- 42,51 ---- X called when an argument of that particular type is matched X by one of the argument parsing function in parseargs(3). X When such an argument is matched, its argument translation ! routine is invoked and is passed (1) the address of the X argument descriptor for the matched argument, (2) the possi- X ble argument string for that matched argument, and (3) a ! boolean field that is TRUE only if the second parameter X points to temporary storage (indicating that some copying X may need to be done instead of just pointing to the same X object). *************** *** 229,235 **** X followed by the type of the items in the vector. X X SEE ALSO ! parseargs(3), parseargs(3), parsecntl(1), X X X --- 229,235 ---- X followed by the type of the items in the vector. X X SEE ALSO ! parseargs(3), parseargs(1), parsecntl(3) X X X *** /hx1d3/lp/brad/parseargs_patch03/parseargs/parseargs1.txt Wed Apr 10 09:55:52 1991 --- parseargs1.txt Mon Apr 15 08:31:18 1991 *************** *** 9,19 **** X parseargs - parse command line arguments in shell scripts X X SYNOPSIS ! parseargs [-U] [-M] [-T string] [-F string] [-A] [-a arg- ! spec] [-e name] [-f file] [-l] [-o] [-s shell] ! [-u] [-i] [-p] -- name [arguments ...] X X OPTIONS X -U just print program usage, do not parse the X command line X --- 9,22 ---- X parseargs - parse command line arguments in shell scripts X X SYNOPSIS ! parseargs [-#UMCAlouip1] [-S separator] [-T string] ! [-F string] [-a arg-spec] [-e name] [-f file] ! [-s shell] -- name [arguments ...] X X OPTIONS + -# just print the version and patchlevel, do not + parse the command line + X -U just print program usage, do not parse the X command line X *************** *** 20,25 **** --- 23,31 ---- X -M just print (n|t)roff -man manual page X template, do not parse the command line X + -S separator field-separator-string used to delimit array + elements (default= + X -T string string to use for true boolean arguments X (default=``TRUE'') X *************** *** 26,31 **** --- 32,40 ---- X -F string string to use for false boolean arguments X (default=``'') X + -C Ignore the difference between upper and lower + case when parsing single character options. + X -A modify array behavior for the specified shell. X X -a arg-spec argument specification string *************** *** 48,76 **** X X -p prompt the user for missing required arguments X - -i ignore bad command-line syntax and continue - processing (instead of aborting) X - ARGUMENTS - -- Indicates that any remaining options are - intended for the calling program. X - name name of calling program X X X X - Page 1 X X X X X X ! PARSEARGS(1) PARSEARGS(1) X X X X arguments arguments to calling program X X DESCRIPTION --- 57,89 ---- X X -p prompt the user for missing required arguments X X X X + Page 1 X X X X X X + PARSEARGS(1) PARSEARGS(1) X X X ! -i ignore bad command-line syntax and continue ! processing (instead of aborting) X + -1 Force any and all non-positional parameters to + be specified before any positional parameters + on the command-line. X + ARGUMENTS + -- Indicates that any remaining options are + intended for the calling program. X + name name of calling program + X arguments arguments to calling program X X DESCRIPTION *************** *** 98,131 **** X on standard output that is suitable for input to nroff or X troff using the -man macro package. X X The argument specification string contains one entry for ! each possible flag. Entries in the arguments specification X string are separated by commas. Each entry has five comma- X separated fields: a name, some flags, a type, a variable- X name, and a prompt. Each of these fields are described X below: X - name The single character name of the associated flag. - For example, to indicate that the program is - expecting a ``-x'' flag, this field would contain - 'x'. Positional arguments (those without a ``-x'' - prefix) are indicated by passing a ``space'' - character. X - flags Flags modifying the semantics of this entry. - These should have one of ARGREQ to indicate a - required argument or ARGOPT to indicate an - optional argument (ARGOPT is the default unless - ARGREQ is specified). ARGPOS can be ``ored'' in - to indicate a positional argument that may also be - keyword matched. ARGNOVAL can be ``ored'' in to - indicate that an argument is an option or a - keyword that does not use an accompanying argument - (such as a boolean flag). This flag is only - required for corresponding argument types that are X X - X Page 2 X X --- 111,131 ---- X on standard output that is suitable for input to nroff or X troff using the -man macro package. X + Given no other arguments parseargs -# prints on standard + output, the current version and patchlevel of the running + version of parseargs. + + X The argument specification string contains one entry for ! each possible flag. Entries in the argument specification X string are separated by commas. Each entry has five comma- X separated fields: a name, some flags, a type, a variable- X name, and a prompt. Each of these fields are described X below: X X X X X Page 2 X X *************** *** 137,154 **** X X X ! implemented by the programmer; parseargs already ! knows which pre-defined argument types take an ! argument. ARGVALOPT can be ``ored'' in to X indicate that an argument to the option may be X optionally supplied on the command-line, but is ! not required. ARGVALREQ can be ``ored'' in to X indicate that an argument to the option is X required (this is the default behavior for options ! that take arguments). ARGLIST can be ``ored'' in X (using the `|' character) to indicate that an X argument is actually a list of one or more ! arguments from the command line. ARGHIDDEN can be X ``ored'' in to indicate a flag that should not be X printed in usage messages - for example, flags X intended for internal debugging purposes. --- 137,165 ---- X X X ! name The single character name of the associated flag. ! For example, to indicate that the program is ! expecting a ``-x'' flag, this field would contain ! 'x'. Positional arguments (those without a ``-x'' ! prefix) are indicated by passing a ``space'' ! character. ! ! flags Flags modifying the semantics of this entry. ! These should have one of ARGREQ to indicate a ! required argument or ARGOPT to indicate an ! optional argument (ARGOPT is the default unless ! ARGREQ is specified). ARGPOS may be ``ored'' in ! to indicate a positional argument that may also be ! keyword matched. ARGVALOPT may be ``ored'' in to X indicate that an argument to the option may be X optionally supplied on the command-line, but is ! not required. ARGVALREQ may be ``ored'' in to X indicate that an argument to the option is X required (this is the default behavior for options ! that take arguments). ARGLIST may be ``ored'' in X (using the `|' character) to indicate that an X argument is actually a list of one or more ! arguments from the command line. ARGHIDDEN may be X ``ored'' in to indicate a flag that should not be X printed in usage messages - for example, flags X intended for internal debugging purposes. *************** *** 177,194 **** X The argument specification string must be terminated by the X single string: ``ENDOFARGS''. X - Note that the comma character (',') is used to separate all - fields within an entry, and to separate the entries - themselves. For this reason, no field in any entry may - contain a comma unless it appears inside of double or single - quotes. X - Parseargs will parse all command-line arguments for the - calling script and match them against the argument - specification string provided. The argument specification - string is read from standard input by default but may not - come from a terminal. The argument specification string may - be supplied as a single string argument by using the -a X X X --- 188,194 ---- *************** *** 203,208 **** --- 203,220 ---- X X X + Note that the comma character (',') is used to separate all + fields within an entry, and to separate the entries + themselves. For this reason, no field in any entry may + contain a comma unless it appears inside of double or single + quotes. + + Parseargs will parse all command-line arguments for the + calling script and match them against the argument + specification string provided. The argument specification + string is read from standard input by default but may not + come from a terminal. The argument specification string may + be supplied as a single string argument by using the -a X ``string'' flag. Long argument specification strings X however, may limit the number of arguments to the script if X there is a limit to the number of arguments and/or *************** *** 244,263 **** X string option. The same may also be done for a boolean flag X that is false using the -F string option. X - Parseargs will only set the values of variables that - correspond to arguments that were given on the command line. - If a particular argument was not supplied on the command - line, then no assignment is made for the corresponding shell - variable and it will have the same value that it had before - parseargs was invoked. The only exception to this is that if - the -u option is specified, then the positional parameters - are unset before any shell variable assignments (which may - reset the positional parameters) are made. X X - - - X Page 4 X X --- 256,263 ---- *************** *** 269,274 **** --- 269,284 ---- X X X + Parseargs will only set the values of variables that + correspond to arguments that were given on the command line. + If a particular argument was not supplied on the command + line, then no assignment is made for the corresponding shell + variable and it will have the same value that it had before + parseargs was invoked. The only exception to this is that if + the -u option is specified, then the positional parameters + are unset before any shell variable assignments (which may + reset the positional parameters) are made. + X The double-dash (``--'') which precedes the name and X arguments of the calling program is needed in order for X parseargs to be able to distinguish options to itself from *************** *** 280,285 **** --- 290,310 ---- X options) are to be permitted by specifying the -o (-l) X option on the command-line. X + SPECIFYING PARSE-BEHAVIOR + The -C, -p, -i, and -1 switches may be used to modify the + command-line parsing behavior of the invoking script. + Specifying -C will cause case-differences in single- + character options to be ignored. Specifying -p will cause + the user to be interactively prompted for any missing + required arguments. Specifying -i will cause syntactically + incorrect arguments to be ignored (instead of having a usage + message printed and execution terminated). Specifying -1 + will force all non-positional parameters to precede any + positional parameters on the command-line (hence anything on + the command-line after a positional parameter that resembles + a keyword parameter will nevertheles be interpreted as a + positional parameter). + X OPTIONS WITH OPTIONAL ARGUMENTS X Options that may take an optional argument need special X consideration. The shell programmer needs to know whether *************** *** 297,302 **** --- 322,340 ---- X the shell variable associated with the option in the X argument description string. X + + + Page 5 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X ARGUMENT LISTS X Parseargs treats ARGLIST arguments in a special way. The X method used for setting up an argument list depends largely *************** *** 321,340 **** X positional parameters of the calling program will be re- X assigned to the contents of the argument list. X - - - - Page 5 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X For the Plan 9 shell (rc), if the variable name X corresponding to the ARGLIST argument is ``*'', then the X positional parameters of the calling program will be re- --- 359,364 ---- *************** *** 344,349 **** --- 368,374 ---- X ARGLIST argument is ``ARGV'', then the positional parameters X of the calling program will be re-assigned to the contents X of the argument list. + X Bourne Shell Argument Lists X X For the Bourne shell, if the associated variable name is NOT *************** *** 356,362 **** X contains an IFS character (such as a space or a tab), then X that particular word will be treated by the Bourne shell as X two distinct words. - X Also for the Bourne shell, If the associated variable name X is NOT ``--'' and the -A option WAS specified, then that X variable is treated as the root name of an array that is set --- 381,386 ---- *************** *** 363,368 **** --- 387,406 ---- X using the following syntax: X name1='arg1' X name2='arg2' + + + + Page 6 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X ... X and the variable ``name_count'' will be set to contain the X number of items in the array. The user may then step *************** *** 387,406 **** X overwritten by the set command). X It should be noted that there is a bug in versions of the X Korn shell earlier than 11/16/88a, in which the following: - - - - Page 6 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X set -A name 'arg1' 'arg2' ... X causes the positional parameters to be overwritten as an X unintentional side-effect. If your version of the Korn shell --- 425,430 ---- *************** *** 409,414 **** --- 433,439 ---- X must save them yourself before you call parseargs. This may X be accomplished by the following: X set -A save_parms "$@" + X C and TC Shell Argument Lists X X For the C and TC shells, ARGLIST variables are treated as *************** *** 418,436 **** X in $name[2], etc ..., and all items may be given by $name. X Notice that Korn shell arrays start at index zero whereas C X and TC shell word-lists start at index one. - X Bourne-Again Shell Argument Lists X X At present, the Free Software Foundation's Bourne-Again X shell is treated exactly the same as the Bourne Shell. This X will change when bash supports arrays. X Plan 9 Shell Argument Lists X X For the Plan 9 shell, if the associated variable name is not ! ``*'' then it is considered to be word-list and set using X the following syntax: X name=( 'arg1' 'arg2' ... ) - X Awk Argument Lists X For awk, if the -A option is not given, then the output for X thes variable-list will be a line with the variable name, --- 443,474 ---- X in $name[2], etc ..., and all items may be given by $name. X Notice that Korn shell arrays start at index zero whereas C X and TC shell word-lists start at index one. X Bourne-Again Shell Argument Lists X X At present, the Free Software Foundation's Bourne-Again X shell is treated exactly the same as the Bourne Shell. This X will change when bash supports arrays. + X Plan 9 Shell Argument Lists X X For the Plan 9 shell, if the associated variable name is not ! ``*'' then it is considered to be a word-list and set using ! ! ! ! Page 7 ! ! ! ! ! ! ! PARSEARGS(1) PARSEARGS(1) ! ! ! X the following syntax: X name=( 'arg1' 'arg2' ... ) X Awk Argument Lists X For awk, if the -A option is not given, then the output for X thes variable-list will be a line with the variable name, *************** *** 442,448 **** X If the -A option is given, then the associated variable is X considered the root name of an array. The ouput for the X array will consist of two lines for each item in the list ! (as in the following expample): X name1 X arg1 X --- 480,486 ---- X If the -A option is given, then the associated variable is X considered the root name of an array. The ouput for the X array will consist of two lines for each item in the list ! (as in the following example): X name1 X arg1 X *************** *** 452,477 **** X and the variable ``name_count'' will have an output line X showing the number of items in the array. X - - - - - Page 7 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X Perl Argument Lists X X For perl, each argument list is considered an array and is X set using the following syntax: ! @name=( arg1 , arg2 , ... ); X A Final Note on Argument Lists X X The word-lists used by the C shell, the arrays used by the --- 490,501 ---- X and the variable ``name_count'' will have an output line X showing the number of items in the array. X X Perl Argument Lists X X For perl, each argument list is considered an array and is X set using the following syntax: ! @name=( 'arg1' , 'arg2' , ... ); ! X A Final Note on Argument Lists X X The word-lists used by the C shell, the arrays used by the *************** *** 495,500 **** --- 519,538 ---- X ARGLISTs and ARGVECs set in ``CMD_ARGS'' will be appended X from the command-line if they are selected). X + + + + Page 8 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X It is important to note that the contents of the X ``CMD_ARGS'' environment variable are NOT expanded by the X shell and hence any special characters (such as quotes or *************** *** 519,538 **** X of parsecntl(3). The user may set his (or her) own desired X parsing behavior through the use of the ``PARSECNTL'' X environment variable. By indicating any number of flags - - - - Page 8 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X (possibly negated) the user will directly modify the X behavior of the parseargs library. Flags may be combined by X placing a `+' or `|' character in between flags. A switch is --- 557,562 ---- *************** *** 551,570 **** X Ignore X Ignore any unrecognized or improperly specified X command-line arguments and continue execution of the ! program. Normally, if an argument is unmatched (or is ! improperly specified), a usage message is printed and ! program execution is terminated. X X OptsOnly X Under UNIX, setting this flag will disable the parsing X of long-option syntax. This will cause all arguments ! starting with '+' to always be treated as a positional X parameter (instead of a long-option). X X KwdsOnly X Under UNIX, setting this flag disables the parsing of X single-character options. This will cause all ! arguments starting with '-' to always be treated as a X positional parameter (instead of an option). X X LoptsOnly --- 575,608 ---- X Ignore X Ignore any unrecognized or improperly specified X command-line arguments and continue execution of the ! program. Normally, if a required argument is unmatched ! (or an argument is improperly specified), a usage ! message is printed program execution is terminated. X X OptsOnly X Under UNIX, setting this flag will disable the parsing X of long-option syntax. This will cause all arguments ! starting with `+' to always be treated as a positional X parameter (instead of a long-option). X + + + + Page 9 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X KwdsOnly X Under UNIX, setting this flag disables the parsing of X single-character options. This will cause all ! arguments starting with `-' to always be treated as a X positional parameter (instead of an option). X X LoptsOnly *************** *** 585,609 **** X one positional argument. X X CaseIgnore X - - - Page 9 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - - Setting this flag causes character-case to be ignored - when attempting to match single-character argument - names (i.e. causes "-i" and "-I" will be considered - equivalent). - X If the environment variable ``PARSECNTL'' is empty or X undefined, then the parsing behavior set by the programmer X is used. If the programmer has not explicitly used --- 623,633 ---- X one positional argument. X X CaseIgnore + Setting this flag will cause character-case to be + ignored when attempting to match single-character + argument names (i.e. causes "-i" and "-I" to be + considered equivalent). X X If the environment variable ``PARSECNTL'' is empty or X undefined, then the parsing behavior set by the programmer X is used. If the programmer has not explicitly used *************** *** 627,638 **** X only a command-line synopsis is printed (this is also X refferred to as ``terse'' mode). The other two ``modes'' X control the displaying of option syntax and long-option - syntax. A mode may be explicitly disabled by preceding its - corresponding string with the `!' character. The ``modes'' - which correspond to the possible values of the ``USAGECNTL'' - environment variable are given by the following table. X X X Quiet X No usage message of any kind is displayed. X --- 651,676 ---- X only a command-line synopsis is printed (this is also X refferred to as ``terse'' mode). The other two ``modes'' X control the displaying of option syntax and long-option X X + + Page 10 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + + syntax. A mode may be explicitly disabled by preceding its + corresponding string with the `!' or `-' character. The + ``modes'' which correspond to the possible values of the + ``USAGECNTL'' environment variable are given by the + following table. + X Quiet X No usage message of any kind is displayed. X *************** *** 651,670 **** X Description X The command description is printed. X - - - - Page 10 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X Terse X Terse mode, just print command-line synopsis. X --- 689,694 ---- *************** *** 680,685 **** --- 704,710 ---- X KeyWords X Same as LongOpts. X + X If the environment variable ``USAGECNTL'' is empty or X undefined, then the default usage level (which is presently X ``Verbose + Options'') will be used. *************** *** 689,697 **** X specification for a Bourne shell script: X X #!/bin/sh - X RepCount=2; X Verbose=""; X ARGSPEC=" X 'c', ARGOPT, argInt, RepCount, 'count {# times to repeat}', X 'v', ARGOPT, argBool, Verbose, 'verbose {turn on verbose mode}', --- 714,736 ---- X specification for a Bourne shell script: X X #!/bin/sh X RepCount=2; X Verbose=""; + + + + + Page 11 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X ARGSPEC=" X 'c', ARGOPT, argInt, RepCount, 'count {# times to repeat}', X 'v', ARGOPT, argBool, Verbose, 'verbose {turn on verbose mode}', *************** *** 701,708 **** X ' ', ARGOPT|ARGLIST, listStr, Files, 'files {files to process}', X ENDOFARGS X " X - eval `echo "$ARGUMENTS" | parseargs -s sh -- $0 "$@"` X X This describes a Bourne shell script accepting up to three X flag arguments and one or two positional arguments, plus a --- 740,747 ---- X ' ', ARGOPT|ARGLIST, listStr, Files, 'files {files to process}', X ENDOFARGS X " + eval `echo "$ARGSPEC" | parseargs -s sh -- $0 "$@"` X X X This describes a Bourne shell script accepting up to three X flag arguments and one or two positional arguments, plus a *************** *** 717,736 **** X FALSE (an empty string). X X -X A Boolean ``X Rated'' flag. This is not - - - - Page 11 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X printed in the usage message. X X The two positional arguments are both strings, as is the --- 756,761 ---- *************** *** 758,763 **** --- 783,802 ---- X associated command line variables, and then prints its X command usage. X + + + + Page 12 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X #!/bin/sh X # test.sh - Bourne shell script to test out the parseargs command! X # *************** *** 783,802 **** X X ## parse command-line and save assignments in a temporary file ## X parseargs -s sh -e ARGUMENTS -u -- "$NAME" "$@" >/tmp/tmp$$ - - - - Page 12 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X if [ $? -ne 0 ] X then rm -f /tmp/tmp$$; exit 2 ## non-zero status (usage given) X fi --- 822,827 ---- *************** *** 825,838 **** X Parseargs may exit with one of the following status codes: X X X -1 Some type of system error occurred during execution, X causing the program to exit prematurely. X X 0 Normal exit status (no problems were encountered). X ! 1 The calling program specified the -U or the -M option ! to parseargs, or specified an argUsage flag on the ! command line. Only the appropriate message is X displayed. X X 2 A command line syntax error was encountered by --- 850,876 ---- X Parseargs may exit with one of the following status codes: X X + + + Page 13 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X -1 Some type of system error occurred during execution, X causing the program to exit prematurely. X X 0 Normal exit status (no problems were encountered). X ! 1 The calling program specified the -#, the -U or the -M ! option to parseargs, or specified an argUsage flag on ! the command line. Only the appropriate message is X displayed. X X 2 A command line syntax error was encountered by *************** *** 848,868 **** X 4 A syntax error was encountered in the argument X specification string that was specified to parseargs. X - - - - - Page 13 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X FILES X /usr/local/parseargs.pl X This file defines a perl function named parseargs to --- 886,891 ---- *************** *** 892,897 **** --- 915,934 ---- X -f-arg X X will properly assign the string ``-arg'' to the option + + + + Page 14 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X whereas the following: X -f -arg X *************** *** 916,934 **** X Hence multiple ``leading dash'' arguments may specified as X follows: X - - - Page 14 - - - - - - - PARSEARGS(1) PARSEARGS(1) - - - X -f-dash_arg1 -f-dash_arg2 ... X X BUGS --- 953,958 ---- *************** *** 957,962 **** --- 981,1000 ---- X X Parseargs cannot properly preserve any newlines in shell X variables if the eval command is used to read its output + + + + Page 15 + + + + + + + PARSEARGS(1) PARSEARGS(1) + + + X (this is a shortcoming of the eval command, not of X parseargs). If the user is concerned about this particular X case, then the user should redirect the output from *************** *** 966,975 **** X or characters following a newline may be lost, in any X variables that are set by parseargs. X - Parseargs(1) is subject to the same caveats as parseargs(3). - Refer to the CAVEATS section of the parseargs(3) manual - page(s) for more information. - X AUTHOR X Brad Appleton (brad@ssd.csd.harris.com) X Harris Computer Systems, Fort Lauderdale, FL USA --- 1004,1009 ---- *************** *** 984,990 **** X X X ! Page 15 X X X --- 1018,1056 ---- X X X ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Page 16 X X X *** /hx1d3/lp/brad/parseargs_patch03/parseargs/parseargs3.txt Wed Apr 10 09:56:01 1991 --- parseargs3.txt Mon Apr 15 08:31:33 1991 *************** *** 6,22 **** X X X NAME ! parseargs, usage - parse command line argument vectors X X SYNOPSIS X #include X ! int parseargs( char *argv[], ARGDESC *argd ) ! int fparseargs( FILE *fp, ARGDESC *argd ) ! int lparseargs( ArgList *argls, ARGDESC *argd ) ! int sparseargs( char *str, ARGDESC *argd ) ! int vparseargs( ARGDESC *argd, int argc, ... ) ! void usage( const ARGDESC *argd ) X X DESCRIPTION X Given a vector of string-valued arguments such as that --- 6,23 ---- X X X NAME ! parseargs - parse command line argument vectors X X SYNOPSIS X #include X ! int parseargs( char *argv[], ARGDESC *argd ); ! int fparseargs( FILE *fp, ARGDESC *argd ); ! int lparseargs( ArgList *argls, ARGDESC *argd ); ! int sparseargs( char *str, ARGDESC *argd ); ! int vparseargs( ARGDESC *argd, int argc, ... ); ! void usage( const ARGDESC *argd ); ! extern const char *ProgName; X X DESCRIPTION X Given a vector of string-valued arguments such as that *************** *** 27,50 **** X argument values that are syntactically incorrect. X X Given a readable input stream and an argdesc array, fpar- ! seargs will parse arguments in a file in much the same ! manner as parseargs. A maximum-line length of 255 charac- ! ters is imposed. NO ``escaping'' of any kind is performed. ! Comments of a limited form are permitted: if the first non- ! whitespace character on a line is a '#' (or '!' for VMS) ! then that entire line is considered a comment and is ! ignored. If a value is provided for an argument that is NOT ! a list or a vector, then the value MUST be on the same line ! as the argument (in other words, ``-v val'' is fine but ! ``-v\nval'' is a not). X X Given an ArgList and an argdesc array, lparseargs will parse ! arguments in an ArgList in much the same manner as par- ! seargs. X X Given a single string and an argdesc array, sparseargs will ! parse arguments from a string in much the same manner as ! parseargs. Sparseargs will split the given string up into a X vector of whitespace separated tokens and then attempt to X parse the resultant vector as if it were given as argv[] on X the command-line. NO special treatment is given to charac- --- 28,50 ---- X argument values that are syntactically incorrect. X X Given a readable input stream and an argdesc array, fpar- ! seargs will parse arguments in a file in the same manner as ! parseargs. A maximum-line length of 255 characters is ! imposed. NO ``escaping'' of any kind is performed. Comments ! of a limited form are permitted: if the first non-whitespace ! character on a line is a '#' (or '!' for VMS) then that ! entire line is considered a comment and is ignored. If a ! value is provided for an argument that is NOT a list or a ! vector, then the value MUST be on the same line as the argu- ! ment (in other words, ``-v val'' is fine but ``-v\nval'' is ! a not). X X Given an ArgList and an argdesc array, lparseargs will parse ! arguments in an ArgList in the same manner as parseargs. X X Given a single string and an argdesc array, sparseargs will ! parse arguments from a string in much the manner as par- ! seargs. Sparseargs will split the given string up into a X vector of whitespace separated tokens and then attempt to X parse the resultant vector as if it were given as argv[] on X the command-line. NO special treatment is given to charac- *************** *** 52,62 **** X Sparseargs will always assume that any whitespace characters X are intended as argument separators. X - X Vparseargs takes an argdesc array, the number of arguments X to parse, and a (possibly NULL terminated) list of ! argument-strings and parses them in much the same manner as ! parseargs. Unlike sparseargs, vparseargs assumes that all X X X --- 52,62 ---- X Sparseargs will always assume that any whitespace characters X are intended as argument separators. X X Vparseargs takes an argdesc array, the number of arguments X to parse, and a (possibly NULL terminated) list of ! argument-strings and parses them in the same manner as par- ! seargs. Unlike sparseargs, vparseargs assumes that all ! parameters are already split up into tokens, hence any X X X *************** *** 71,86 **** X X X ! parameters are already split up into tokens, hence any whi- ! tespace characters contained in any of the string-parameters ! are used as is (and will be considered a part of an argument ! name or value). X - X Given an argdesc array, usage will print the usage for the X given command in the format specified by the user's X USAGECNTL environment variable. X X THE ARGUMENT STRUCTURE X The basic type used by the parseargs library is the argument X descriptor (or "argdesc" for short). An ARGDESC structure is --- 71,90 ---- X X X ! whitespace characters contained in any of the string- ! parameters are used as is (and will be considered a part of ! an argument name or value). X X Given an argdesc array, usage will print the usage for the X given command in the format specified by the user's X USAGECNTL environment variable. X + After returning from any of the aforementioned functions, + the global string ProgName will contain the name of the com- + mand corresponding to the argument-descriptor array that was + most recently operated upon by one the functions in the par- + seargs(3) function library. + X THE ARGUMENT STRUCTURE X The basic type used by the parseargs library is the argument X descriptor (or "argdesc" for short). An ARGDESC structure is *************** *** 120,131 **** X this field must correspond to the name of one of the X argument type functions described in argtype(3). X - ARBPTR ad_valp; - This field is a generic pointer to the storage used to - represent the internal value of the command-line X X - X Page 2 X X --- 124,131 ---- *************** *** 137,149 **** X X X ! argument. It may be a pointer to a number, a boolean ! value, a string, a list, or anything else for which ! there exists a corresponding arg-type function to use ! in the ad_type field. In the case of of parseargs(1) ! this field must be the name of the corresponding shell ! variable which will eventually hold the value of the ! argument given on the command-line. X X const char *ad_prompt; X This field contains the long-name of the argument and --- 137,152 ---- X X X ! ARBPTR ad_valp; ! This field is a generic pointer to the storage used to ! represent the internal value of the command-line argu- ! ment. It may be a pointer to a number, a boolean value, ! a string, a list, or anything else for which there ! exists a corresponding arg-type function to use in the ! ad_type field. In the case of of parseargs(1) this ! field must be the name of the corresponding shell vari- ! able which will eventually hold the value of the argu- ! ment given on the command-line. X X const char *ad_prompt; X This field contains the long-name of the argument and *************** *** 155,161 **** X contains any uppercase characters, then the substring X of long-name consisting of all uppercase characters is X used as the argument keyword and the entire long-name ! is used as the name of the argument (if a value my be X supplied). The long-name may be matched by supplying a X unique prefix of either the argument keyword or the X argument name. --- 158,164 ---- X contains any uppercase characters, then the substring X of long-name consisting of all uppercase characters is X used as the argument keyword and the entire long-name ! is used as the name of the argument (if a value may be X supplied). The long-name may be matched by supplying a X unique prefix of either the argument keyword or the X argument name. *************** *** 173,179 **** X char *InFile; X char *OutFile = CHARNULL; X BOOL XRated = FALSE; ! struct namelist *Files = NULL; X X ARGDESC Args[] = X { --- 176,182 ---- X char *InFile; X char *OutFile = CHARNULL; X BOOL XRated = FALSE; ! ArgList *Files = ARGLISTNULL; X X ARGDESC Args[] = X { *************** *** 183,197 **** X ' ', ARGREQ, argStr, __ &InFile, "INPUTfile {input file}", X ' ', ARGOPT, argStr, __ &OutFile, "OUTPUTfile {output file}", X 'X', ARGHIDDEN, argBool, __ &XRated, "XratedMODE {naughty stuff!}", ! ' ', ARGOPT|ARGLIST, argStr, __ &Files, "File {files to be read}", X ENDOFARGS X }; X X X - - - X Page 3 X X --- 186,197 ---- X ' ', ARGREQ, argStr, __ &InFile, "INPUTfile {input file}", X ' ', ARGOPT, argStr, __ &OutFile, "OUTPUTfile {output file}", X 'X', ARGHIDDEN, argBool, __ &XRated, "XratedMODE {naughty stuff!}", ! ' ', ARGLIST, listStr, __ &Files, "File {files to be read}", X ENDOFARGS X }; X X X X Page 3 X X *************** *** 379,386 **** X arg_sdesc(ad) X Return the description of an argument. If a description X was supplied, the ARGDESCRIBED flag will be set and the ! description will immediately follow the terminating NUL ! byte of the string name. X X ARG_isDESCRIBED(ad) X Evaluates to TRUE only if an argument description was --- 379,386 ---- X arg_sdesc(ad) X Return the description of an argument. If a description X was supplied, the ARGDESCRIBED flag will be set and the ! description will immediately follow the terminating ! NULL byte of the string name. X X ARG_isDESCRIBED(ad) X Evaluates to TRUE only if an argument description was *************** *** 448,454 **** X usage messages. X X CMD MACROS ! Parseargs.h defines a set of macros to allow a more "self X documenting" approach to declaring argument-descriptor X arrays. The "old-style" is still accepted (but if used it is X recommended that the STARTOFARGS macro is used in conjunc- --- 448,454 ---- X usage messages. X X CMD MACROS ! defines a set of macros to allow a more "self X documenting" approach to declaring argument-descriptor X arrays. The "old-style" is still accepted (but if used it is X recommended that the STARTOFARGS macro is used in conjunc- *************** *** 606,625 **** X Ignore X Ignore any unrecognized or improperly specified X command-line arguments and continue execution of the ! program. Normally, if an argument is unmatched (or is ! improperly specified), a usage message is printed and ! program execution is terminated. X X OptsOnly X Under UNIX, setting this flag will disable the parsing X of long-option syntax. This will cause all arguments ! starting with '+' to always be treated as a positional X parameter (instead of a long-option). X X KwdsOnly X Under UNIX, setting this flag disables the parsing of X single-character options. This will cause all argu- ! ments starting with '-' to always be treated as a posi- X tional parameter (instead of an option). X X LoptsOnly --- 606,625 ---- X Ignore X Ignore any unrecognized or improperly specified X command-line arguments and continue execution of the ! program. Normally, if a required argument is unmatched ! (or an argument is improperly specified), a usage mes- ! sage is printed program execution is terminated. X X OptsOnly X Under UNIX, setting this flag will disable the parsing X of long-option syntax. This will cause all arguments ! starting with `+' to always be treated as a positional X parameter (instead of a long-option). X X KwdsOnly X Under UNIX, setting this flag disables the parsing of X single-character options. This will cause all argu- ! ments starting with `-' to always be treated as a posi- X tional parameter (instead of an option). X X LoptsOnly *************** *** 640,648 **** X positional argument. X X CaseIgnore ! Setting this flag causes character-case to be ignored ! when attempting to match single-character argument ! names (i.e. causes "-i" and "-I" will be considered X equivalent). X X If the environment variable ``PARSECNTL'' is empty or unde- --- 640,648 ---- X positional argument. X X CaseIgnore ! Setting this flag will cause character-case to be ! ignored when attempting to match single-character argu- ! ment names (i.e. causes "-i" and "-I" to be considered X equivalent). X X If the environment variable ``PARSECNTL'' is empty or unde- *************** *** 683,691 **** X ferred to as ``terse'' mode). The other two ``modes'' con- X trol the displaying of option syntax and long-option syntax. X A mode may be explicitly disabled by preceding its ! corresponding string with the `!' character. The ``modes'' ! which correspond to the possible values of the ``USAGECNTL'' ! environment variable are given by the following table. X X Quiet X No usage message of any kind is displayed. --- 683,692 ---- X ferred to as ``terse'' mode). The other two ``modes'' con- X trol the displaying of option syntax and long-option syntax. X A mode may be explicitly disabled by preceding its ! corresponding string with the `!' or `-' character. The ! ``modes'' which correspond to the possible values of the ! ``USAGECNTL'' environment variable are given by the follow- ! ing table. X X Quiet X No usage message of any kind is displayed. *************** *** 719,725 **** X X X - X Page 11 X X --- 720,725 ---- *************** *** 759,766 **** X vectors however need a set of flags for each item they con- X tain. Once an arg-list has been created, it may be deallo- X cated using the function listFree. ListFree takes one param- ! eter: first of which is the address of the first item in the ! arg-list. X X An alternative to argument-lists is argument vectors (or X arg-vectors). Arg-vectors use the ARGVEC flag instead of --- 759,765 ---- X vectors however need a set of flags for each item they con- X tain. Once an arg-list has been created, it may be deallo- X cated using the function listFree. ListFree takes one param- ! eter: the address of the first item in the arg-list. X X An alternative to argument-lists is argument vectors (or X arg-vectors). Arg-vectors use the ARGVEC flag instead of *************** *** 769,775 **** X responsible for handling vectors of its type (although some X argXxx functions such as the boolean types do not support X vectors). An arg-vector is a structure which contains a ! count, an array of elements (i.e. an argc/argv pair), and an X array of flags, one for each element of argv. There are two X macros in defined in which are used for arg- X vectors. ARGVEC_T may be used to declare a vector structure --- 768,774 ---- X responsible for handling vectors of its type (although some X argXxx functions such as the boolean types do not support X vectors). An arg-vector is a structure which contains a ! count, an array of elements (i.e. an argc,argv pair), and an X array of flags, one for each element of argv. There are two X macros in defined in which are used for arg- X vectors. ARGVEC_T may be used to declare a vector structure *************** *** 783,788 **** --- 782,788 ---- X X ( StrVec.array[ StrVec.count ] == (char *)NULL ) X + is always true, and character-vectors will always have an X X X *************** *** 797,803 **** X X X - is always true, and character-vectors will always have an X extra NUL-character at the end such that: X X ( CharVec.array[ CharVec.count ] == '\0' ) --- 797,802 ---- *************** *** 849,854 **** --- 848,854 ---- X printf( "String[%d]=%s, flags=%x\n", X i, StrVec.array[i], StrVec.flags[i] ); X + for ( i = 0 ; i < NumVec.count ; i++ ) X X X *************** *** 863,869 **** X X X - for ( i = 0 ; i < NumVec.count ; i++ ) X printf( "Number[%d]=%s, flags=%x\n", X i, NumVec.array[i], NumVec.flags[i] ); X --- 863,868 ---- *************** *** 884,901 **** X X BOOL argXxx( ARGDESC *ad, char *vp, BOOL copyf ) X ! The argd argument points to the descriptor for the argument ! being converted. Its main use is to find the location in ! which to store the converted value, located in ! argd->ad_valp. The string value to be converted is passed ! in vp (which will be NULL if the ARGNOVAL flag was set for ! the corresponding entry in the arg-descriptor table). The ! copyf flag is TRUE if the vp string value must be copied ! when saved. Most non-string types are copied implicitly ! (for example, integer arguments are stored in binary form, ! so the original string value need not be saved), so this ! argument can usually be ignored. Put simply, this flag is ! TRUE when vp points to a temporary buffer area. X X If the type function successfully converts the value, and X uses the entire value, it should return TRUE. If the type --- 883,900 ---- X X BOOL argXxx( ARGDESC *ad, char *vp, BOOL copyf ) X ! The ad argument points to the descriptor for the argument ! being converted. Its main use is to find the location in ! which to store the converted value, located in ad->ad_valp. ! The string value to be converted is passed in vp (which will ! be NULL if the ARGNOVAL flag was set for the corresponding ! entry in the arg-descriptor table). The copyf flag is TRUE ! if the vp string value must be copied when saved. Most SHAR_EOF true || echo 'restore of DOCPATCH failed' echo 'End of part 1' echo 'File DOCPATCH is continued in part 2' echo 2 > _shar_seq_.tmp exit 0 exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.