Newsgroups: comp.sources.misc Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!wuarchive!uunet!sparky!kent From: Brad Appleton Subject: v19i082: parseargs - functions to parse command line argument, Patch05a/5 Message-ID: <1991May17.181527.22168@sparky.IMD.Sterling.COM> X-Md4-Signature: 8c374620d01516b8c5214277cdbf721a Sender: kent@sparky.IMD.Sterling.COM (Kent Landfield) Reply-To: uunet!travis.ssd.csd.harris.com!brad Organization: Harris Computer Systems Date: Fri, 17 May 1991 18:15:27 GMT Approved: kent@sparky.imd.sterling.com Submitted-by: Brad Appleton Posting-number: Volume 19, Issue 82 Archive-name: parseargs/patch05a Patch-To: parseargs: Volume 17, Issue 45-57 This is the first part of Patch05, a five part patch to parseargs. Changes made in Patch05 - documented support for zsh in parseargs(1) - added missing call to pclose() in pgopen.c:pgclose() - added zsh to the list of shells supported by parseargs(1) - changed the shell_info structure used by parseargs(1) to represent different shells. It should now be much simpler to add new shells to parseargs.c - fixed a bug in strfuncs.c:basename() for VMS systems - added more comments to explain whats going on in each _args.c - updated the README file to correspond with the patchlevel(s) - updated dependencies in doc/Makefile Brad Appleton ----- #!/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 05/14/1991 17:54 UTC by kent@sparky.IMD.Sterling.COM # Source directory /u1/csm/queue/parseargs/test/patches # # existing files will NOT be overwritten unless -c is specified # # 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 # ------ ---------- ------------------------------------------ # 268263 -rw-rw-r-- PATCH05 # 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 # ============= PATCH05 ============== if test -f 'PATCH05' -a X"$1" != X"-c"; then echo 'x - skipping PATCH05 (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting PATCH05 (Text)' sed 's/^X//' << 'SHAR_EOF' > 'PATCH05' && diff -cNr ../patchlevel4/Intro ./Intro *** ../patchlevel4/Intro Thu May 2 10:56:07 1991 --- ./Intro Thu May 2 14:34:14 1991 *************** *** 51,58 **** X Parseargs consists of a set of C-functions to parse arguments from the X command-line, from files, from strings, from linked-lists, and from X string-vectors. Also included is a command-line interface which will parse ! arguments for shell scripts (sh, csh/tcsh, ksh, bash, and rc), awk-scripts, ! and perl-scripts. X X The basic structure used by parseargs is the argument-descriptor (sometimes X called "argdesc" for brevity). An array/string of argdescs is declared by --- 51,58 ---- X Parseargs consists of a set of C-functions to parse arguments from the X command-line, from files, from strings, from linked-lists, and from X string-vectors. Also included is a command-line interface which will parse ! arguments for shell scripts (sh, csh/tcsh/itcsh, ksh, bash, zsh, and rc), ! awk-scripts, and perl-scripts. X X The basic structure used by parseargs is the argument-descriptor (sometimes X called "argdesc" for brevity). An array/string of argdescs is declared by *************** *** 78,86 **** X or from a shell script as in the following example: X X echo "$ARGDESC_STR" | parseargs -s sh -- "$0" "$@" >tmp$$ ! if [ $? = 0 ] ; then ! . tmp$$ ! fi X /bin/rm -f tmp$$ X X And before you know it, your command-line had been parsed, all variables --- 78,84 ---- X or from a shell script as in the following example: X X echo "$ARGDESC_STR" | parseargs -s sh -- "$0" "$@" >tmp$$ ! test $? = 0 && . tmp$$ X /bin/rm -f tmp$$ X X And before you know it, your command-line had been parsed, all variables diff -cNr ../patchlevel4/MANIFEST ./MANIFEST *** ../patchlevel4/MANIFEST Thu May 2 11:06:06 1991 --- ./MANIFEST Thu May 2 13:00:33 1991 *************** *** 6,12 **** X Makefile.cpp 3 makefile template read by the C preprocessor X README 1 release information X amiga_args.c 4 parse AmigaDOS command-lines ! arglist.c 2 implement the listXxxx functions for arglists X argtype.c 5 implement the argXxxx argument type functions X doc 1 directory containing documentation X doc/Makefile 2 makefile for the documentation --- 6,12 ---- X Makefile.cpp 3 makefile template read by the C preprocessor X README 1 release information X amiga_args.c 4 parse AmigaDOS command-lines ! arglist.c 3 implement the listXxxx functions for arglists X argtype.c 5 implement the argXxxx argument type functions X doc 1 directory containing documentation X doc/Makefile 2 makefile for the documentation *************** *** 15,21 **** X doc/argflags.inc 2 describe argument flags X doc/argtype.man3 3 {n,t}roff source for argtype(3) X doc/argvalopt.inc 1 describe options with optional arguments ! doc/bugs.inc 2 BUGS section for parseargs(1) X doc/caveats.inc 1 CAVEATS section for parseargs(1) and (3) X doc/cmd_macros.inc 1 describe CMD_XXX macros X doc/defargs.inc 1 describe the default argdesc-array --- 15,21 ---- X doc/argflags.inc 2 describe argument flags X doc/argtype.man3 3 {n,t}roff source for argtype(3) X doc/argvalopt.inc 1 describe options with optional arguments ! doc/bugs.inc 1 BUGS section for parseargs(1) X doc/caveats.inc 1 CAVEATS section for parseargs(1) and (3) X doc/cmd_macros.inc 1 describe CMD_XXX macros X doc/defargs.inc 1 describe the default argdesc-array *************** *** 44,56 **** X doc/vparseargs3.inc 1 describe vparseargs(3) X ibm_args.c 5 parse MS-DOS and OS/2 command-lines X parseargs.awk 3 parseargs for awk ! parseargs.c 7 C source for parseargs(1) ! parseargs.h 6 include file for parseargs library X parseargs.pl 2 parseargs for perl ! patchlevel.h 1 list of patches (most recent first) X pgopen.c 4 pipe output to a pager X pgopen.h 1 include file for pgopen.c ! stest.c 3 test progarm for parseargs(3) X strfuncs.c 6 string library X strfuncs.h 1 include file for strfuncs.c X syserr.c 2 diagnostic message printing routines --- 44,56 ---- X doc/vparseargs3.inc 1 describe vparseargs(3) X ibm_args.c 5 parse MS-DOS and OS/2 command-lines X parseargs.awk 3 parseargs for awk ! parseargs.c 8 C source for parseargs(1) ! parseargs.h 7 include file for parseargs library X parseargs.pl 2 parseargs for perl ! patchlevel.h 2 list of patches (most recent first) X pgopen.c 4 pipe output to a pager X pgopen.h 1 include file for pgopen.c ! stest.c 4 test program for parseargs(3) X strfuncs.c 6 string library X strfuncs.h 1 include file for strfuncs.c X syserr.c 2 diagnostic message printing routines *************** *** 60,69 **** X test.pl 1 perl test program for parseargs(1) X test.rc 1 Plan 9 shell test program for parseargs(1) X test.sh 1 Bourne shell test program for parseargs(1) ! unix_args.c 4 parse Unix command-lines X unix_man.c 3 print Unix manual-page templates X useful.h 3 common include file for the library ! vms_args.c 5 parse VAX/VMS DCL command-lines X vprintf.c 3 portable vfprintf, vprintf, and vsprintf X winsize.c 3 determine # rows and # columns of window ! xparse.c 8 implement the parseargs library --- 60,70 ---- X test.pl 1 perl test program for parseargs(1) X test.rc 1 Plan 9 shell test program for parseargs(1) X test.sh 1 Bourne shell test program for parseargs(1) ! test.zsh 2 Z shell test program for parseargs(1) ! unix_args.c 5 parse Unix command-lines X unix_man.c 3 print Unix manual-page templates X useful.h 3 common include file for the library ! vms_args.c 6 parse VAX/VMS DCL command-lines X vprintf.c 3 portable vfprintf, vprintf, and vsprintf X winsize.c 3 determine # rows and # columns of window ! xparse.c 9 implement the parseargs library diff -cNr ../patchlevel4/README ./README *** ../patchlevel4/README Thu May 2 10:56:10 1991 --- ./README Thu May 2 14:34:23 1991 *************** *** 58,106 **** X X CONTENTS X ======== ! README : this file. ! [ Intro : introduction to parseargs -- BDA ] ! [ doc/Makefile : makefile for parseargs documentation -- BDA ] ! [ doc/* : documentation for parseargs -- BDA ] ! Makefile : a makefile for the library. ! [ Makefile.cpp : a makefile template -- BDA ] ! useful.h : a general header file, used by most everything. ! parseargs.h : headers for the argument parser. ! [ parseargs.c is now broken down into the following files : PDS ] ! unix_args.c : a command line argument parser. Popular ! response to my C Advisor column about this routine ! in UNIX Review Vol. 7 No. 11 prompted me to make ! this distribution available. ! amiga_args.c : Amiga version of unix_args.c -- PDS ! ibm_args.c : IBM-PC version of unix_args.c -- BDA ! vms_args.c : VAX/VMS version of unix_args.c -- BDA ! arglist.c : routines for ARGLIST options. -- PDS ! argtype.c : routines for other options. The argument value parsers ! for floating point values may be excluded by #defining the ! macro NOFLOAT (only if you do NOT need floating-point values). ! I had to break this out because RISC/os 4.01 from Mips doesn't ! seem to support strtod in the BSD environment. You may find you ! need to include -lm for this to work. ! strfuncs.[ch] : string-manipulation functions & ! dictionary-style searching routines. ! [ end of parseargs.c : PDS ] ! [ parseargs.c has been resurrected as a command line interface ! to the parseargs library routines -- BDA ] ! syserr.c : error message printing routines. ! stest.c : a small test program for the argument parser. ! [ xparse.c : source for [flsv]parseargs() and parsecntl() -- BDA ] ! [ unix_man.c : routine to print unix man1 templates -- BDA ] ! [ winsize.c : routine to "portably" get the screen size -- BDA ] ! [ pgopen.[ch] : Unix source to pipe output to a pager -- BDA ] ! [ vprintf.c : portable implementations of vprintf() & vfprintf() ] ! [ parseargs.awk : awk interface to parseargs(1) -- BDA ] ! [ parseargs.pl : perl interface to parseargs(1) -- BDA ] ! [ test.sh : Bourne shell-script to test parseargs(1) -- BDA ] ! [ test.csh : C shell-script to test parseargs(1) -- BDA ] ! [ test.ksh : Korn shell-script to test parseargs(1) -- BDA ] ! [ test.awk : awk script to test parseargs(1) -- BDA ] ! [ test.pl : perl script to test parseargs(1) -- BDA ] X X The parseargs routines really ought to have a way of matching a list X (e.g., return the rest of argv). This isn't especially hard to do, but X I haven't gotten around to it yet. [ Added, with ARGLIST flag -- PDS ] --- 58,68 ---- X X CONTENTS X ======== ! See the file "MANIFEST" in the distribution for a complete list and ! description of all the files included in this release. X + TO DO + ===== X The parseargs routines really ought to have a way of matching a list X (e.g., return the rest of argv). This isn't especially hard to do, but X I haven't gotten around to it yet. [ Added, with ARGLIST flag -- PDS ] *************** *** 261,268 **** X X Update to parseargs (and major re-write) by Brad Appleton X (brad@travis.ssd.csd.harris.com) ! Last Update: 03/01/91 X X DISCLAIMER X ========== X Neither Brad Appleton, nor Harris Corporation (including any of its --- 223,237 ---- X X Update to parseargs (and major re-write) by Brad Appleton X (brad@travis.ssd.csd.harris.com) ! Last Update: 04/12/91 ! X + THIS RELEASE + ============ + Read the file patchlevel.h in the distribution to find out what version + and patchlevel of parseargs you have received. + + X DISCLAIMER X ========== X Neither Brad Appleton, nor Harris Corporation (including any of its *************** *** 427,449 **** X If someone wants to try to add more shell-types to parseargs.c, here X are the main things that need to be done: X ! 1. add #defines for both the name (a string) and type (an integer) of ! shell (e.g #define BOURNE_SHELL "sh" and #define SH 4) X ! 2. add a shell_info entry into the array Shell[]. The index of the ! entry in the array should be the number used in the #define for the ! type of shell. ! ! 3. make sure that get_shell_type() will return the proper value for ! the new shell. ! ! 4. print_args doesnt really do any shell specific stuff outside of ! indexing into the table. The print_arglist() and ! unset_positional_parameters() functions do some shell specific stuff ! and will need a case added to the switch statement(s) for the newly ! added shell. X ! 5. If the information in the shell-info structure is not sufficient X for the new shell then you should either: X a) redefine the structure for all shells including your shell. X b) add some special code into print_args() for your shell! --- 396,412 ---- X If someone wants to try to add more shell-types to parseargs.c, here X are the main things that need to be done: X ! 1. add an entry for the shell type into the type definition for the ! "shell_t" enumerated type. X ! 2. add a shell_info entry for the shell into the array Shell[]. X ! 3. print_args doesnt really do any shell specific stuff outside of ! indexing into the table. The print_arglist() function does some ! shell specific stuff and MAY need a case added to the switch statement(s) ! for the newly added shell. ! ! 4. If the information in the shell-info structure is not sufficient X for the new shell then you should either: X a) redefine the structure for all shells including your shell. X b) add some special code into print_args() for your shell! *************** *** 786,792 **** X NAME OS X ------------------ ------------------------ X unix Unix (BSD or AT&T) ! BSD, ucb_universe BSD Unix (only one need be present) X MANX, AZTEC AmigaDOS X MSDOS MS-DOS for IBM PCs X OS2 OS/2 for IBM PCs --- 749,755 ---- X NAME OS X ------------------ ------------------------ X unix Unix (BSD or AT&T) ! BSD, SYSV BSD Unix or AT&T Unix (only one should be present) X MANX, AZTEC AmigaDOS X MSDOS MS-DOS for IBM PCs X OS2 OS/2 for IBM PCs *************** *** 817,823 **** X By default, if SWITCHAR is undefined then both the long and short X option prefix character are '/'. One is able to distinguish an option X from a long-option in this case because the third character of an ! option-arg will always be '=' or ' '. Hence, using the test program X with the defaults, both "ibm_test foo /D=directory" and "ibm_test X /DIR=directory" are equivalent. X --- 780,786 ---- X By default, if SWITCHAR is undefined then both the long and short X option prefix character are '/'. One is able to distinguish an option X from a long-option in this case because the third character of an ! option-arg will always be '=' or '\0'. Hence, using the test program X with the defaults, both "ibm_test foo /D=directory" and "ibm_test X /DIR=directory" are equivalent. X *************** *** 852,859 **** X thanks to posters from comp.os.vms for giving me a clue on how to do X this). As a result of this, under VAX/VMS, there are two new argtype X functions "argInput" and "argOutput": each requires that ad->ad_valp ! be a file pointer (not a pointer to a file pointer as in "__ &stdin" ! but an actual file pointer as in "__ stdin"). ArgInput and argOutput X close the stream associated with the given file-pointer and reconnect X the stream to the named file for input or output (so the effect is to X redirect input (output) from (to) the stream to the named file. If --- 815,822 ---- X thanks to posters from comp.os.vms for giving me a clue on how to do X this). As a result of this, under VAX/VMS, there are two new argtype X functions "argInput" and "argOutput": each requires that ad->ad_valp ! be a pointer to a file pointer (not a FILE * variable as in "__ stdin" ! but an actual FILE ** variable as in "__ &stdin"). ArgInput & argOutput X close the stream associated with the given file-pointer and reconnect X the stream to the named file for input or output (so the effect is to X redirect input (output) from (to) the stream to the named file. If *************** *** 888,904 **** X vms_args.c as well. X X X LITERATE PROGRAMMING X ==================== X If you look at the source code you will notice that it contains lots X of funny looking comments with sections that have titles enclosed X between '^' and ':' characters. This is my own feeble attempt at ! literate programming. I have a Unix-shell script which will extract ! certain portions of these "structured" comments so that I may dump ! them directly into the documentation (and thus attempt to keep the ! documentation up-to-date at the same rate as the source). If anyone ! is interested in my script(s) please let me know and I will gladly e- ! mail them to the interested parties. X X X ACKNOWLEDGEMENTS --- 851,879 ---- X vms_args.c as well. X X + TO DO + ===== + - get parseargs(1) to work for DCL under VMS using symbols + - add ash to the list of shells supported by parseargs(1) + - add clam to the list of shells supported by parseargs(1) + - get parseargs(1) to support arrays for bash + - verify that parseargs(1) works for rc, the Plan 9 shell + - verify that parseargs(1) works for zsh + - verify that parseargs(3) works on VMS systems. + - verify that parseargs(3) works on MS-DOS and OS/2 systems. + + X LITERATE PROGRAMMING X ==================== X If you look at the source code you will notice that it contains lots X of funny looking comments with sections that have titles enclosed X between '^' and ':' characters. This is my own feeble attempt at ! literate programming. I have a Korn shell script (xdoc) which will ! extract certain portions of these "structured" comments so that I may ! dump them directly into the documentation (and thus attempt to keep ! the documentation up-to-date at the same rate as the source). If anyone ! is interested in my script(s) please let me know and I will gladly ! e-mail them to the interested parties. X X X ACKNOWLEDGEMENTS *************** *** 905,911 **** X ================ X I was in constant contact with Peter Da Silva during the entire period X that I implemented all of the above modifications and would like to ! thank him for his time and his sage advice. X X Thanx also to Jim Barbour for helping me with some VMS specific things X (like getting the original, unparsed command-line from DCL and --- 880,887 ---- X ================ X I was in constant contact with Peter Da Silva during the entire period X that I implemented all of the above modifications and would like to ! thank him for his time and his sage advice. Many of the ideas which I ! implemented are a direct result of our discussions. X X Thanx also to Jim Barbour for helping me with some VMS specific things X (like getting the original, unparsed command-line from DCL and *************** *** 912,920 **** X retreiving the value of a symbol), and to Tom Christiansen and Raymond X Chen for their help in getting parseargs(1) to work for perl scripts. X X Lastly, thanks to all those who use and will continue to improve X parseargs, all I ask is that you keep me updated of your efforts (so I X can keep my own version of parseargs up-to-date). I am always eager X to discuss possible changes or enhancements with any interested X parties. - --- 888,899 ---- X retreiving the value of a symbol), and to Tom Christiansen and Raymond X Chen for their help in getting parseargs(1) to work for perl scripts. X + Thanx also to Gillmer J. Derge, Marco Nijdam, & Chris Johnston for sending + me their bug reports and fixes so that I could incorporate them into the + latest patch of parseargs. + X Lastly, thanks to all those who use and will continue to improve X parseargs, all I ask is that you keep me updated of your efforts (so I X can keep my own version of parseargs up-to-date). I am always eager X to discuss possible changes or enhancements with any interested X parties. diff -cNr ../patchlevel4/amiga_args.c ./amiga_args.c *** ../patchlevel4/amiga_args.c Thu May 2 11:06:07 1991 --- ./amiga_args.c Thu May 2 14:34:25 1991 *************** *** 199,205 **** X ad = ARGDESCNULL; X }/*else*/ X } ! else if (cmd_prev(cmd)) { X flags = arg_flags(cmd_prev(cmd)); /* save flags */ X if ( ARG_isGIVEN(cmd_prev(cmd)) ) { /* reset flags */ X BCLEAR( arg_flags(cmd_prev(cmd)), ARGVALSEP ); --- 199,210 ---- X ad = ARGDESCNULL; X }/*else*/ X } ! else if (cmd_prev(cmd)) { /* expecting a vlue from previous arg */ ! /* reset the argument flags - if this arg was already given, some ! ** of its flags may be set to indicate how it was given before. ! ** we need to know how it was given now (but save the old ones ! ** just in case the new one fails). ! */ X flags = arg_flags(cmd_prev(cmd)); /* save flags */ X if ( ARG_isGIVEN(cmd_prev(cmd)) ) { /* reset flags */ X BCLEAR( arg_flags(cmd_prev(cmd)), ARGVALSEP ); *************** *** 228,233 **** --- 233,243 ---- X } X else { /* it's a positional argument or a list item */ X if ( cmd_list(cmd) ) { /* its a list item */ + /* reset the argument flags - if this arg was already given, some + ** of its flags may be set to indicate how it was given before. + ** we need to know how it was given now (but save the old ones + ** just in case the new one fails). + */ X flags = arg_flags(cmd_list(cmd)); /* save flags */ X if ( ARG_isGIVEN(cmd_list(cmd)) ) { /* reset flags */ X BCLEAR( arg_flags(cmd_list(cmd)), ARGVALSEP ); *************** *** 243,248 **** --- 253,260 ---- X continue; X } X else { /* its a positional argument */ + + /* if FLAGS1ST is set then first positional marks end-of-flags */ X if ( BTEST(cmd_flags(cmd), pa_FLAGS1ST) ) X BSET( cmd_state(cmd), ps_NOFLAGS ); X *************** *** 265,270 **** --- 277,287 ---- X ad = ARGDESCNULL; X } X else { + /* reset the argument flags - if this arg was already given, some + ** of its flags may be set to indicate how it was given before. + ** we need to know how it was given now (but save the old ones + ** just in case the new one fails). + */ X flags = arg_flags(ad); /* save flags */ X if ( ARG_isGIVEN(ad) ) { /* reset flags for this appearance */ X BCLEAR( arg_flags(ad), ARGVALSEP ); diff -cNr ../patchlevel4/argtype3.txt ./argtype3.txt *** ../patchlevel4/argtype3.txt Thu May 2 11:06:44 1991 --- ./argtype3.txt Wed Dec 31 18:00:00 1969 *************** *** 1,264 **** - - - - ARGTYPE(3) ARGTYPE(3) - - - - NAME - argtype - argument type functions used by parseargs(3) - - SYNOPSIS - #include - - BOOL argUsage( argdesc, argstr, copyf ); - BOOL argEnd( argdesc, argstr, copyf ); - BOOL argDummy( argdesc, argstr, copyf ); - BOOL argBool( argdesc, argstr, copyf ); - BOOL argSBool( argdesc, argstr, copyf ); - BOOL argUBool( argdesc, argstr, copyf ); - BOOL argTBool( argdesc, argstr, copyf ); - BOOL argChar( argdesc, argstr, copyf ); - BOOL argStr( argdesc, argstr, copyf ); - BOOL argInt( argdesc, argstr, copyf ); - BOOL argShort( argdesc, argstr, copyf ); - BOOL argLong( argdesc, argstr, copyf ); - BOOL argFloat( argdesc, argstr, copyf ); - BOOL argDouble( argdesc, argstr, copyf ); - BOOL listStr( argdesc, argstr, copyf ); - void listFree( arglist ); - void vecFree( argvec, type ); - void vecDeepFree( argvec, type ); - - ARGDESC *argdesc; - char *argstr; - BOOL copyf; - ArgList *arglist; - - DESCRIPTION - Each of these converts a parameter value to the internal - form, including validity checking. Their parameters and - return values all behave similarly. One of these routines is - called when an argument of that particular type is matched - by one of the argument parsing function in parseargs(3). - When such an argument is matched, its argument translation - routine is invoked and is passed (1) the address of the - argument descriptor for the matched argument, (2) the possi- - ble argument string for that matched argument, and (3) a - boolean field that is TRUE only if the second parameter - points to temporary storage (indicating that some copying - may need to be done instead of just pointing to the same - object). - - Once the argument translation routine is invoked, it is - responsible for converting the argument string to the - desired internal form (perhaps a number), and assigning the - resultant value to the arg_valp(ad) field of the argument - descriptor (this includes handling any necessary - (re)allocation if the matched argument has the ARGVEC flag - enabled). If the argument is an ARGVEC or ARGLIST then the - - - - Page 1 - - - - - - - ARGTYPE(3) ARGTYPE(3) - - - - routine is responsible for allocating any space, copying the - arg-flags to the value-specific flags, and setting the - ARGCOPYF flag for the value if it needs to be allocated as - well. - - - RETURN VALUE - TRUE The conversion was successful and the entire value - was used. - - - FALSE The conversion failed. The reason for failure - should be diagnosed using usrerr(3). - - - -N The conversion was successful but only N characters - of the value were used, the remaining characters may - still match other arguments. - - - PSEUDO-TYPES: argUsage, argDummy, argEnd - ArgUsage is used to specify an argument that causes the com- - mand usage to be printed. - - ArgDummy is used to force an item to show up in usage- - messages but the item itself is never matched against any - arguments from the command-line. - - ArgEnd is used by Amiga style command-lines to indicate an - argument that forces all remaining arguments to be con- - sidered positional args. - - These three are dummy functions. The routines themselves do - nothing of importance, we just need to have their addresses - available for identification in the corresponding command- - line styles. - - STRING-TYPES: argStr - ArgStr is one of the few argument translation routines that - actually uses the copyf flag. If copyf is true then the - string is duplicated. - - ArgStr assigns the given string (or a copy of it) to the - value referenced by arg_valp(ad) (unless the argument is a - vector in which case the given string is appended to the - end). - - ArgStr ensures that the very last item in a vector of - strings (the one accessed as vec.array[ vec.count ]) will - always be NULL. - - - - - - Page 2 - - - - - - - ARGTYPE(3) ARGTYPE(3) - - - - CHARACTER-TYPES: argChar - ArgChar assigns the given character to the value referenced - by arg_valp(ad) (unless the argument is a vector in which - case the given character is appended to the end). - - ArgChar ensures that the very last item in a vector of char- - acter (the one accessed as vec.array[ vec.count ]) will - always be a NULL byte so that the resulting vector may also - be used as a NULL terminated string. - - Unlike argStr, argChar will translate character escape - sequences such as `\n' and `\012'. - - INTEGER-TYPES: argInt, argShort, argLong - Each of these functions converts the given string to the - desired integral type. The value may be specified as an - octal number by specifying the first digit to be 0. Simi- - larly, If the first two characters are `0x' then the number - is treated as hexadecimal. - - FLOATING-POINT-TYPES: argFloat, argDouble - Each of these functions converts the given string to the - desired floating-point type. - - BOOLEAN-TYPES: argBool, argSBool, argTBool, argUBool - ArgBool and argSBool set a boolean value (if no value is - given). ArgUBool unsets a boolean value (if no value is - given). ArgTBool toggles a boolean value (if no value is - given). If a value is supplied to any of these routines, - then the string is looked up in a table and assigned the - corresponding value. - - If a value is supplied for an argument that was matched via - its single character name and is part of the same argv ele- - ment as the argument-name (so that both ARGKEYWORD and - ARGVALSEP are not set), then only the first character of the - value is used (unless it is not found in our table, in which - case the value is ignored and the default action is taken). - The table used for single-character-options is the follow- - ing: - - `0' or `-' - The corresponding boolean flag is set to FALSE. - - `1' or `+' - The corresponding boolean flag is set to TRUE. - - `^' or `~' - The corresponding boolean flag is toggled. - - The possible argument strings for long-options (keywords) - are as follows (case-insensitive): - - - - Page 3 - - - - - - - ARGTYPE(3) ARGTYPE(3) - - - - ``0'', ``-'', ``OFF'', or ``FALSE'' - The corresponding boolean flag is set to FALSE. - - ``1'', ``+'', ``ON'', or ``TRUE'' - The corresponding boolean flag is set to TRUE. - - LIST TYPES: listStr - The listStr argument translation routine is only intended - for use on behalf of arguments that have the ARGLIST flag - enabled. It will allocate space for a new node (and for the - new string if copyf is set) and append it to the end of the - list. The argument-list may later be deallocated by invoking - the function listFree and passing it the address of the - first item in the list. - - - VecFree is a macro that is used to deallocate argument- - vectors. It will free the array and flags fields of a vec- - tor, set them to NULL, and set the count field to zero. Vec- - DeepFree is a macro that is similar to vecFree but will - additionally look at each item in the array; any component - of the array that had ARGCOPYF enabled will also be deallo- - cated. Both macros are given the vector structure to free - followed by the type of the items in the vector. - - SEE ALSO - parseargs(3), parseargs(1), parsecntl(3) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Page 4 - - - --- 0 ---- diff -cNr ../patchlevel4/doc/Makefile ./doc/Makefile *** ../patchlevel4/doc/Makefile Thu May 2 11:05:46 1991 --- ./doc/Makefile Tue May 14 12:32:17 1991 *************** *** 90,101 **** X ### X # include dependencies X ### ! argtype.3: ! parseargs.1: ! parseargs.3: ! parsecntl.3: X X X ### X # maintenance dependencies X ### --- 90,140 ---- X ### X # include dependencies X ### ! argtype.3: argtype.man3 X + parseargs.1: parseargs.man1 \ + ../test.sh \ + argvalopt.inc \ + bugs.inc \ + caveats.inc \ + env_args.inc \ + env_parse.inc \ + env_usage.inc \ + parseargs1.inc \ + sh_arrays.inc \ + shells.inc X + parseargs.3: parseargs.man3 \ + arg_macros.inc \ + argdesc.inc \ + argflags.inc \ + caveats.inc \ + cmd_macros.inc \ + defargs.inc \ + effects.inc \ + env_args.inc \ + env_parse.inc \ + env_usage.inc \ + fparseargs3.inc \ + lib_bugs.inc \ + lparseargs3.inc \ + multivals.inc \ + parseargs3.inc \ + returns.inc \ + sparseargs3.inc \ + usage3.inc \ + vparseargs3.inc + + parsecntl.3: parsecntl.man3 \ + argflags.inc \ + effects.inc \ + parsecntl3.inc \ + parsecntls.inc \ + parseflags.inc \ + parsemodes.inc \ + returns.inc + + X ### X # maintenance dependencies X ### *************** *** 105,111 **** X clobber: clean X ${DEL} *.txt X ! spell: ${INCS} ${SRCS}} X ${SPELL} ${SPELLFLAGS} ${INCS} ${SRCS} X X print: ${MANFILES} ${INCS} --- 144,150 ---- X clobber: clean X ${DEL} *.txt X ! spell: ${INCS} ${SRCS} X ${SPELL} ${SPELLFLAGS} ${INCS} ${SRCS} X X print: ${MANFILES} ${INCS} diff -cNr ../patchlevel4/doc/arg_macros.inc ./doc/arg_macros.inc *** ../patchlevel4/doc/arg_macros.inc Thu May 2 10:56:14 1991 --- ./doc/arg_macros.inc Thu May 2 14:34:39 1991 *************** *** 27,33 **** X .IP "\fIarg_sdesc\fP(ad)" X Return the description of an argument. If a description was supplied, X the \fI\s-1ARGDESCRIBED\s+1\fP flag will be set and the description will ! immediately follow the terminating NUL byte of the string name. X .\"--------------------------------------------- X .IP "\fIARG_isDESCRIBED\fP(ad)" X Evaluates to \s-1TRUE\s+1 only if an argument description was provided. --- 27,33 ---- X .IP "\fIarg_sdesc\fP(ad)" X Return the description of an argument. If a description was supplied, X the \fI\s-1ARGDESCRIBED\s+1\fP flag will be set and the description will ! immediately follow the terminating NULL byte of the string name. X .\"--------------------------------------------- X .IP "\fIARG_isDESCRIBED\fP(ad)" X Evaluates to \s-1TRUE\s+1 only if an argument description was provided. diff -cNr ../patchlevel4/doc/argdesc.inc ./doc/argdesc.inc *** ../patchlevel4/doc/argdesc.inc Thu May 2 11:00:21 1991 --- ./doc/argdesc.inc Thu May 2 14:34:41 1991 *************** *** 52,57 **** X square-brackets, or angle-brackets). If the long-name contains any X uppercase characters, then the substring of long-name consisting of X all uppercase characters is 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 unique prefix X of either the argument keyword or the argument name. --- 52,57 ---- X square-brackets, or angle-brackets). If the long-name contains any X uppercase characters, then the substring of long-name consisting of X all uppercase characters is 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 unique prefix X of either the argument keyword or the argument name. diff -cNr ../patchlevel4/doc/argflags.inc ./doc/argflags.inc *** ../patchlevel4/doc/argflags.inc Thu May 2 10:56:15 1991 --- ./doc/argflags.inc Thu May 2 14:34:44 1991 *************** *** 51,57 **** X .\"--------------------------------------------- X .IP "\fI\s-1ARGLIST\s+1\fP" X A variable number of values are used for this argument (and hence may ! use more than one or two argv elements from the command-line as in X "\fB\-l\fI val1 val2\fR ..."). The list of values must be stored in an X .I ArgList X structure (\s-1NOT\s+1 a vector structure), an the corresponding argument-type --- 51,57 ---- X .\"--------------------------------------------- X .IP "\fI\s-1ARGLIST\s+1\fP" X A variable number of values are used for this argument (and hence may ! use more than one or two \f4argv\fP elements from the command-line as in X "\fB\-l\fI val1 val2\fR ..."). The list of values must be stored in an X .I ArgList X structure (\s-1NOT\s+1 a vector structure), an the corresponding argument-type diff -cNr ../patchlevel4/doc/argtype.man3 ./doc/argtype.man3 *** ../patchlevel4/doc/argtype.man3 Thu May 2 11:00:40 1991 --- ./doc/argtype.man3 Thu May 2 14:34:47 1991 *************** *** 37,45 **** X all behave similarly. One of these routines is called when an X argument of that particular type is matched by one of the argument X parsing function in \fIparseargs\fP(3). When such an argument is matched, ! its argument translation routines is invoked and is passed (1) the address of X the argument descriptor for the matched argument, (2) the possible argument ! string for that matched argument, and (3) a boolean filed that is \s-1TRUE\s+1 X only if the second parameter points to temporary storage (indicating that X some copying may need to be done instead of just pointing to the same object). X --- 37,45 ---- X all behave similarly. One of these routines is called when an X argument of that particular type is matched by one of the argument X parsing function in \fIparseargs\fP(3). When such an argument is matched, ! its argument translation routine is invoked and is passed (1) the address of X the argument descriptor for the matched argument, (2) the possible argument ! string for that matched argument, and (3) a boolean field that is \s-1TRUE\s+1 X only if the second parameter points to temporary storage (indicating that X some copying may need to be done instead of just pointing to the same object). X *************** *** 128,134 **** X in a table and assigned the corresponding value. X X If a value is supplied for an argument that was matched via its ! single character name and is part of the same argv element as the X argument-name (so that both \fBARGKEYWORD\fP and \fBARGVALSEP\fP X are not set), X then only the first character of the value is used (unless it is --- 128,134 ---- X in a table and assigned the corresponding value. X X If a value is supplied for an argument that was matched via its ! single character name and is part of the same \f4argv\fP element as the X argument-name (so that both \fBARGKEYWORD\fP and \fBARGVALSEP\fP X are not set), X then only the first character of the value is used (unless it is *************** *** 168,172 **** X type of the items in the vector. X .SH SEE ALSO X .IR parseargs (3), ! .IR parseargs (3), ! .IR parsecntl (1), --- 168,172 ---- X type of the items in the vector. X .SH SEE ALSO X .IR parseargs (3), ! .IR parseargs (1), ! .IR parsecntl (3) diff -cNr ../patchlevel4/doc/bugs.inc ./doc/bugs.inc *** ../patchlevel4/doc/bugs.inc Thu May 2 10:56:16 1991 --- ./doc/bugs.inc Thu May 2 14:34:52 1991 *************** *** 27,38 **** X .PP X \fIParseargs\fP cannot properly preserve any newlines in shell variables X if the \fBeval\fP command is used to read its output (this is a shortcoming ! of the eval command, not of parseargs). If the user is concerned about this ! particular case, then the user should redirect the output from \fBparseargs\fP ! to a temporary file and use the \fBsource\fP command in \fIcsh\fP or the ! dot command (`\fB.\fP') in sh and ksh, to interpret the results; otherwise, ! newlines will be translated into spaces, or characters following ! a newline may be lost, in any variables that are set by \fBparseargs\fP. ! .PP ! Parseargs(1) is subject to the same caveats as parseargs(3). Refer to the ! \s-1CAVEATS\s+1 section of the parseargs(3) manual page(s) for more information. --- 27,36 ---- X .PP X \fIParseargs\fP cannot properly preserve any newlines in shell variables X if the \fBeval\fP command is used to read its output (this is a shortcoming ! of the \fBeval\fP command, not of \fBparseargs\fP). If the user is concerned ! about this particular case, then the user should redirect the output from ! \fBparseargs\fP to a temporary file and use the \fBsource\fP command in ! \fIcsh\fP or the dot command (`\fB.\fP') in sh and ksh, to interpret the ! results; otherwise, newlines will be translated into spaces, or characters ! following a newline may be lost, in any variables that are set by ! \fBparseargs\fP. diff -cNr ../patchlevel4/doc/cmd_macros.inc ./doc/cmd_macros.inc *** ../patchlevel4/doc/cmd_macros.inc Thu May 2 10:56:17 1991 --- ./doc/cmd_macros.inc Thu May 2 14:34:57 1991 *************** *** 3,9 **** X .\"-- xdoc -man -p '[ \t]*' -s CMD-MACROS ../parseargs.h X .\"---------------------------------------------------------------------------- X .SH "CMD MACROS" ! Parseargs.h defines a set of macros to allow a more "self documenting" X approach to declaring argument-descriptor arrays. The "old-style" is X still accepted (but if used it is recommended that the \s-1STARTOFARGS\s+1 X macro is used in conjunction with \s-1ENDOFARGS\s+1). --- 3,9 ---- X .\"-- xdoc -man -p '[ \t]*' -s CMD-MACROS ../parseargs.h X .\"---------------------------------------------------------------------------- X .SH "CMD MACROS" ! \f4\fP defines a set of macros to allow a more "self documenting" X approach to declaring argument-descriptor arrays. The "old-style" is X still accepted (but if used it is recommended that the \s-1STARTOFARGS\s+1 X macro is used in conjunction with \s-1ENDOFARGS\s+1). diff -cNr ../patchlevel4/doc/defargs.inc ./doc/defargs.inc *** ../patchlevel4/doc/defargs.inc Thu May 2 10:56:18 1991 --- ./doc/defargs.inc Thu May 2 14:34:59 1991 *************** *** 4,11 **** X .\"---------------------------------------------------------------------------- X .SH "DEFAULT ARGUMENT DESCRIPTOR" X .PP ! Each argdesc-array has an initial default argument list (which may ! be reset using the pc_DEFARGS function code with parsecntl). This initial X default argument-list contains `?' and `H' which may be used as single X character keywords to display command-usage for all command-line styles. X Similarly, ``?'', ``H'', and ``Help'' may be used as long-keywords to display --- 4,11 ---- X .\"---------------------------------------------------------------------------- X .SH "DEFAULT ARGUMENT DESCRIPTOR" X .PP ! Each argdesc-array has an initial default argument list (which may be reset ! using the pc_DEFARGS function code with \fIparsecntl\fP). This initial X default argument-list contains `?' and `H' which may be used as single X character keywords to display command-usage for all command-line styles. X Similarly, ``?'', ``H'', and ``Help'' may be used as long-keywords to display *************** *** 12,17 **** X command-usage for all command-line styles. In Addition, for \s-1VMS\s+1 X style commands, the qualifiers \fB\s-1/INPUT\s+1=\fIfile\fR, X \fB\s-1/OUTPUT\s+1=\fIfile\fR, and \fB\s-1/ERROR\s+1=\fIfile\fR, may be used ! to redirect stdin, stdout, and stderr (respectively) to a file. For ! Amiga\s-1DOS\s+1 style commands, the keyword ``ENDKWDS'' may be used to ! disable parsing for any more keywords on the command-line. --- 12,17 ---- X command-usage for all command-line styles. In Addition, for \s-1VMS\s+1 X style commands, the qualifiers \fB\s-1/INPUT\s+1=\fIfile\fR, X \fB\s-1/OUTPUT\s+1=\fIfile\fR, and \fB\s-1/ERROR\s+1=\fIfile\fR, may be used ! to redirect \f4stdin\fP, \f4stdout\fP, and \f4stderr\fP (respectively) to a ! file. For Amiga\s-1DOS\s+1 style commands, the keyword ``ENDKWDS'' may be ! used to disable parsing for any more keywords on the command-line. diff -cNr ../patchlevel4/doc/env_args.inc ./doc/env_args.inc *** ../patchlevel4/doc/env_args.inc Thu May 2 11:00:46 1991 --- ./doc/env_args.inc Thu May 2 14:35:04 1991 *************** *** 5,11 **** X .SH "SUPPLYING DEFAULT ARGUMENTS" X Programs that use \fIparseargs\fP may be given default arguments under UNIX X and PCs through the use of environment variables (symbols are used for VMS ! systems). If a C-program or shell-script uses parseargs to implement a X command named ``\fIcmd\fP'' then the environment variable ``\s-1CMD_ARGS\s+1'' X will be parsed for any "default" arguments before the command-line is parsed. X The command-line will over-ride any options that are specified in this --- 5,11 ---- X .SH "SUPPLYING DEFAULT ARGUMENTS" X Programs that use \fIparseargs\fP may be given default arguments under UNIX X and PCs through the use of environment variables (symbols are used for VMS ! systems). If a C-program or shell-script uses \fIparseargs\fP to implement a X command named ``\fIcmd\fP'' then the environment variable ``\s-1CMD_ARGS\s+1'' X will be parsed for any "default" arguments before the command-line is parsed. X The command-line will over-ride any options that are specified in this diff -cNr ../patchlevel4/doc/env_parse.inc ./doc/env_parse.inc *** ../patchlevel4/doc/env_parse.inc Thu May 2 11:00:56 1991 --- ./doc/env_parse.inc Thu May 2 14:35:06 1991 *************** *** 8,19 **** X The user may set his (or her) own desired parsing X behavior through the use of the ``\s-1PARSECNTL\s+1'' environment variable. X By indicating any number of flags (possibly negated) the user will ! directly modify the behavior of the parseargs library. Flags may be X combined by placing a `+' or `|' character in between flags. A switch X is negated by immediately preceding it with a `!' or `-' character. X The possible ``flags'' are given by the following table. X Flags are case-insensitive. X .sp 4p X .IP "\fIPrompt\fP" X Prompt the user for any missing arguments that are required on the X command-line. No special escaping or quoting is performed on the --- 8,20 ---- X The user may set his (or her) own desired parsing X behavior through the use of the ``\s-1PARSECNTL\s+1'' environment variable. X By indicating any number of flags (possibly negated) the user will ! directly modify the behavior of the \fIparseargs\fP library. Flags may be X combined by placing a `+' or `|' character in between flags. A switch X is negated by immediately preceding it with a `!' or `-' character. X The possible ``flags'' are given by the following table. X Flags are case-insensitive. X .sp 4p + .\"--------------------------------------------- X .IP "\fIPrompt\fP" X Prompt the user for any missing arguments that are required on the X command-line. No special escaping or quoting is performed on the *************** *** 20,61 **** X user input. Required arguments that expect a list of values will X be repeatedly prompted for (one item per line) until a blank line X (followed by a carriage return) is entered. ! .\"---------------------- X .IP "\fIIgnore\fP" X Ignore any unrecognized or improperly specified 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 .IP "\fIOptsOnly\fP" ! Under UNIX, setting this flag will disable the parsing of long-option ! syntax. This will cause all arguments starting with '+' to always be X treated as a positional parameter (instead of a long-option). ! .\"---------------------- X .IP "\fIKwdsOnly\fP" ! Under UNIX, setting this flag disables the parsing of single-character ! options. This will cause all arguments starting with '-' to always X be treated as a positional parameter (instead of an option). ! .\"---------------------- X .IP "\fILoptsOnly\fP" X Same as \fIKwdsOnly\fP. ! .\"---------------------- X .IP "\fIFlags1st\fP" ! Setting this flag causes the parseargs library to force any and all X non-positional arguments to be specified before any positional ones. ! As an example, under UNIX, if this flag is SET then parseargs will ! consider the command line "cmd -x arg" to consist of one option and ! one positional argument; however the command line "cmd arg -x" would ! be considered to consist of two positional arguments (the -x option ! will be unmatched). X ! If this flag is UNSET, then both of the previous examples are X considered to consist of one option and one positional argument. ! .\"---------------------- X .IP "\fICaseIgnore\fP" ! 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 .sp 4p X .PP X If the environment variable ``\s-1PARSECNTL\s+1'' is empty or --- 21,64 ---- X user input. Required arguments that expect a list of values will X be repeatedly prompted for (one item per line) until a blank line X (followed by a carriage return) is entered. ! .\"--------------------------------------------- X .IP "\fIIgnore\fP" X Ignore any unrecognized or improperly specified 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 .IP "\fIOptsOnly\fP" ! Under \s-1UNIX\s+1, setting this flag will disable the parsing of long-option ! syntax. This will cause all arguments starting with `+' to always be X treated as a positional parameter (instead of a long-option). ! .\"--------------------------------------------- X .IP "\fIKwdsOnly\fP" ! Under \s-1UNIX\s+1, setting this flag disables the parsing of single-character ! options. This will cause all arguments starting with `\-' to always X be treated as a positional parameter (instead of an option). ! .\"--------------------------------------------- X .IP "\fILoptsOnly\fP" X Same as \fIKwdsOnly\fP. ! .\"--------------------------------------------- X .IP "\fIFlags1st\fP" ! Setting this flag causes the \fIparseargs\fP library to force any and all X non-positional arguments to be specified before any positional ones. ! As an example, under \s-1UNIX\s+1, if this flag is \s-1SET\s+1 then ! .I parseargs ! will consider the command line "\fBcmd \-x\fI arg\fR" to consist of one ! option and one positional argument; however the command line ! "\fBcmd\fI arg -x\fR" would be considered to consist of two positional ! arguments (the \fB\-x\fP option will be unmatched). X ! If this flag is \s-1UNSET\s+1, then both of the previous examples are X considered to consist of one option and one positional argument. ! .\"--------------------------------------------- X .IP "\fICaseIgnore\fP" ! Setting this flag will cause character-case to be ignored when attempting ! to match single-character argument names (i.e. causes "\fB\-i\fP" and ! "\fB\-I\fP" to be considered equivalent). ! .\"--------------------------------------------- X .sp 4p X .PP X If the environment variable ``\s-1PARSECNTL\s+1'' is empty or diff -cNr ../patchlevel4/doc/env_usage.inc ./doc/env_usage.inc *** ../patchlevel4/doc/env_usage.inc Thu May 2 10:56:19 1991 --- ./doc/env_usage.inc Thu May 2 14:35:08 1991 *************** *** 16,22 **** X printed (this is also refferred to as ``terse'' mode). The other two ``modes'' X control the displaying of option syntax and long-option syntax. A mode may X be explicitly disabled by preceding its corresponding string with the `!' ! character. The ``modes'' which correspond to the possible values of the X ``\s-1USAGECNTL\s+1'' environment variable are given by the following table. X .sp 4p X .\"--------------------------------------- --- 16,22 ---- X printed (this is also refferred to as ``terse'' mode). The other two ``modes'' X control the displaying of option syntax and long-option syntax. A mode may X be explicitly disabled by preceding its corresponding string with the `!' ! or `-' character. The ``modes'' which correspond to the possible values of the X ``\s-1USAGECNTL\s+1'' environment variable are given by the following table. X .sp 4p X .\"--------------------------------------- diff -cNr ../patchlevel4/doc/fparseargs3.inc ./doc/fparseargs3.inc *** ../patchlevel4/doc/fparseargs3.inc Thu May 2 10:56:20 1991 --- ./doc/fparseargs3.inc Thu May 2 14:35:10 1991 *************** *** 4,10 **** X .\"---------------------------------------------------------------------------- X .PP X Given a readable input stream and an argdesc array, \fIfparseargs\fP ! will parse arguments in a file in much the same manner as \fIparseargs\fP. X A maximum-line length of 255 characters is imposed. NO ``escaping'' of any X kind is performed. Comments of a limited form are permitted: if the first X non-whitespace character on a line is a '#' (or '!' for \s-1VMS\s+1) then --- 4,10 ---- X .\"---------------------------------------------------------------------------- X .PP X Given a readable input stream and an argdesc array, \fIfparseargs\fP ! will parse arguments in a file in the same manner as \fIparseargs\fP. X A maximum-line length of 255 characters is imposed. NO ``escaping'' of any X kind is performed. Comments of a limited form are permitted: if the first X non-whitespace character on a line is a '#' (or '!' for \s-1VMS\s+1) then diff -cNr ../patchlevel4/doc/lparseargs3.inc ./doc/lparseargs3.inc *** ../patchlevel4/doc/lparseargs3.inc Thu May 2 11:01:17 1991 --- ./doc/lparseargs3.inc Thu May 2 14:35:15 1991 *************** *** 4,7 **** X .\"---------------------------------------------------------------------------- X .PP X Given an ArgList and an argdesc array, \fIlparseargs\fP ! will parse arguments in an ArgList in much the same manner as \fIparseargs\fP. --- 4,7 ---- X .\"---------------------------------------------------------------------------- X .PP X Given an ArgList and an argdesc array, \fIlparseargs\fP ! will parse arguments in an ArgList in the same manner as \fIparseargs\fP. diff -cNr ../patchlevel4/doc/multivals.inc ./doc/multivals.inc *** ../patchlevel4/doc/multivals.inc Thu May 2 11:01:27 1991 --- ./doc/multivals.inc Thu May 2 14:35:18 1991 *************** *** 28,44 **** X the function X .I listFree. X .I ListFree ! takes one parameter: first of which is the address of the first item in ! the arg-list. X .PP X An alternative to argument-lists is argument vectors (or arg-vectors). X Arg-vectors use the \s-1ARGVEC\s+1 flag instead of the \s-1ARGLIST\s+1 flag X and do not require a special \fIlistXxxx\fP function for each vector-type. X Each of the \fIargXxxx\fP functions is responsible for handling vectors of its ! type (although some argXxx functions such as the boolean types do not support ! vectors). An arg-vector is a structure which contains a count, an ! array of elements (i.e. an argc/argv pair), and an array of flags, one for ! each element of argv. There are two macros in defined in X \f4\fR which are used for arg-vectors. \s-1ARGVEC_T\s+1 may be X used to declare a vector structure or a vector type; X \s-1ARGVEC_EMPTY\s+1 may be used to initialize the structure. --- 28,43 ---- X the function X .I listFree. X .I ListFree SHAR_EOF true || echo 'restore of PATCH05 failed' fi echo 'End of part 1' echo 'File PATCH05 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.