Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!sparky!kent From: brad@hcx1.ssd.csd.harris.com (Brad Appleton) Newsgroups: comp.sources.misc Subject: v17i045: parseargs - functions to parse command line arguments, Part00/12 Message-ID: <1991Mar17.195904.17451@sparky.IMD.Sterling.COM> Date: 17 Mar 91 19:59:04 GMT Sender: kent@sparky.IMD.Sterling.COM (Kent Landfield) Organization: Harris Computer Systems Lines: 137 Approved: kent@sparky.imd.sterling.com X-Checksum-Snefru: 7c158c3f e273509b 9c4d42a9 f1705651 Submitted-by: Brad Appleton Posting-number: Volume 17, Issue 45 Archive-name: parseargs/part00 PARSEARGS extracted from Eric Allman's NIFTY UTILITY LIBRARY Created by Eric P. Allman Modified by Peter da Silva Modified and Rewritten by Brad Appleton 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 []] [-g ...] [-r ] [-s ] [-x] [...] The UNIX command-line syntax using keywords (or long options) would be: cmdname [+area []] [+groups ...] [+rep ] [+sep ] [+x] [...] The VMS command-line syntax would be the following: cmdname [/AREA[=]] [/GROUPS=[,...] [/REP=] [/SEP=] [/X] [[,...]] 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[=]] [/g=...] [/r=] [/s=] [/x] [...] The AmigaDOS command-line syntax would be the following: cmdname [AREA []] [GROUPS ...] [REP ] [SEP ] [X] [...] 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.