Xref: utzoo comp.unix.programmer:1410 comp.unix.shell:1743 comp.unix.questions:29728 comp.lang.c:37495 comp.sources.d:6683 comp.sys.amiga.programmer:1731 Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!wuarchive!rex!uflorida!travis!brad From: brad@SSD.CSD.HARRIS.COM (Brad Appleton) Newsgroups: comp.unix.programmer,comp.unix.shell,comp.unix.questions,comp.lang.c,comp.sources.d,comp.sys.amiga.programmer Subject: Parseargs Summary: look for it in comp.sources.misc Keywords: Parseargs, unix-shells, c-programming, command-line parsing, getopt Message-ID: <2715@travis.csd.harris.com> Date: 21 Mar 91 16:13:53 GMT Sender: news@travis.csd.harris.com Followup-To: comp.unix.programmer Organization: Harris Computers Systems Division, Fort Lauderdale,FL Lines: 110 I just released parseargs on comp.sources.misc. It is the "dream" command-line parser you have always wanted. It will completely parse yor command-lines from shell-scripts, C-programs, perl-scripts and awk-scripts. The following is a brief description of parseargs: 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 brad@ssd.csd.harris.com Harris Computer Systems uunet!hcx1!brad Fort Lauderdale, FL USA ~~~~~~~~~~~~~~~~~~~~ Disclaimer: I said it, not my company! ~~~~~~~~~~~~~~~~~~~