[comp.sources.misc] v17i045: parseargs - functions to parse command line arguments, Part00/12

brad@hcx1.ssd.csd.harris.com (Brad Appleton) (03/18/91)

Submitted-by: Brad Appleton <brad@hcx1.ssd.csd.harris.com>
Posting-number: Volume 17, Issue 45
Archive-name: parseargs/part00


                                  PARSEARGS

                        extracted from Eric Allman's

                            NIFTY UTILITY LIBRARY

                          Created by Eric P. Allman
                             <eric@Berkeley.EDU>

                         Modified by Peter da Silva
                            <peter@Ferranti.COM>

                   Modified and Rewritten by Brad Appleton
                          <brad@SSD.CSD.Harris.COM>


 Welcome to parseargs! Dont let the initial size of this package scare you.
 over 75% of it is English text, and more than 50% of the source is comments.

 Parseargs is a set of functions to parse command-line arguments. Unlike
 getopt and its variants, parseargs does more than just split up the
 command-line into some canonical form. Parseargs will actually parse the
 command-line, assigning the appropriate command-line values to the
 corresponding variables, and will verify the command-line syntax (and print
 a usage message if necessary). Furthermore, many features of it's parsing
 behavior are configurable at run-time. Some of these features include the
 following:

     o  Prompting the user for missing arguments
     o  Allowing keywords (+count=4) and/or options (-c4)
     o  Checking for default arguments in an environment variable
     o  Ignoring bad syntax instead of terminating
     o  Ignoring upper/lower case on the command-line
     o  Controlling the location of non-positional parameters
     o  Controlling the contents (syntax and verbosity) of usage messages
     o  Having long usage messages piped through a paging program

 Parseargs also allows for options that take an optional argument, and
 options that take a (possibly optional) list of one or more arguments.
 In addition, parseargs may be configured at compile-time to parse
 command-lines in accordance with the native command-syntax of any of the
 following operating systems:

     o  Unix
     o  VAX/VMS
     o  OS/2
     o  MS-DOS
     o  AmigaDOS

 Parseargs consists of a set of C-functions to parse arguments from the
 command-line, from files, from strings, from linked-lists, and from
 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.

 The basic structure used by parseargs is the argument-descriptor (sometimes
 called "argdesc" for brevity).  An array/string of argdescs is declared by
 the user to describe the command in question.  The resulting argdesc-array
 is passed to all the parseargs functions and is used to hold all information
 about the command. a sample argdesc-array is shown below.

    STARTOFARGS,
    { 'a', ARGVALOPT, argStr,   &area,    "AREAcode : optional area-code" },
    { 'g', ARGLIST,   argStr,   &groups,  "newsGROUPS : groups to test" },
    { 'r', ARGOPT,    argInt,   &count,   "REPcount : repetition factor" },
    { 's', ARGOPT,    argChar,  &sepch,   "SEPchar : field separator" },
    { 'x', ARGOPT,    argBool,  &xflag,   "Xflag : turn on X-mode" },
    { ' ', ARGREQ,    argStr,   &name,    "name : name to use" },
    { ' ', ARGLIST,   argStr,   &args,    "args : any remaining arguments" },
    ENDOFARGS

 Once the above array/string is declared it is a simple matter to invoke
 parseargs from C as in the following example:

    status = parseargs( argdesc_array, argv );

 or from a shell script as in the following example:

    echo "$ARGDESC_STR" | parseargs -s sh -- "$0" "$@" >tmp$$
    if [ $? = 0 ] ; then
       . tmp$$
    fi
    /bin/rm -f tmp$$

 And before you know it, your command-line had been parsed, all variables 
 have been assigned their corresponding values from the command-line, syntax
 has been verified, and a usage message (if required) has been printed. 

 Under UNIX, the command-line syntax (using single character options) for the
 above command would be:

    cmdname [-a [<areacode>]] [-g <newsgroups>...] [-r <repcount>]
            [-s <sepchar>] [-x]  <name>  [<args>...]

 The UNIX command-line syntax using keywords (or long options) would be:

    cmdname [+area [<areacode>]] [+groups <newsgroups>...] [+rep <repcount>]
            [+sep <sepchar>] [+x]  <name>  [<args>...]

 The VMS command-line syntax would be the following:

    cmdname [/AREA[=<areacode>]] [/GROUPS=<newsgroups>[,<newsgroups>...]
            [/REP=<repcount>] [/SEP=<sepchar>] [/X]  <name>
            [<args>[,<args>...]]

 The MS-DOS and OS/2 command-line syntax would be the following (unless the
 environment variable $SWITCHAR is '-' in which case UNIX syntax is used):

    cmdname [/a[=<areacode>]] [/g=<newsgroups>...] [/r=<repcount>]
            [/s=<sepchar>] [/x]  <name>  [<args>...]

  The AmigaDOS command-line syntax would be the following:

    cmdname [AREA [<areacode>]] [GROUPS <newsgroups>...] [REP <repcount>]
            [SEP <sepchar>] [X]  <name>  [<args>...]


 Please look at the README files and manpages for more detailed information!

______________________ "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! ~~~~~~~~~~~~~~~~~~~

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.