[comp.sources.misc] v19i085: parseargs - functions to parse command line argument, Patch05d/5

Brad Appleton <brad@hcx1.ssd.csd.harris.com> (05/18/91)

Submitted-by: Brad Appleton <brad@hcx1.ssd.csd.harris.com>
Posting-number: Volume 19, Issue 85
Archive-name: parseargs/patch05d
Patch-To: parseargs: Volume 17, Issue 45-57

#!/bin/sh
# do not concatenate these parts, unpack them in order with /bin/sh
# file PATCH05 continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 4; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
	echo 'x - still skipping PATCH05'
else
echo 'x - continuing file PATCH05'
sed 's/^X//' << 'SHAR_EOF' >> 'PATCH05' &&
-      ``verbose'' mode, which controls whether or not a detailed
-      description of each argument should accompany the usual
-      command-line sysnopsis. If	verbose	mode is	``off'', then
-      only a command-line synopsis is printed (this is also
-      refferred to as ``terse'' mode). The other	two ``modes''
-      control the displaying of option syntax and long-option
- 
- 
- 
- 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.
- 
-      Quiet
- 	  No usage message of any kind is displayed.
- 
-      Silent
- 	  Same as Quiet.
- 
-      Paged
- 	  The usage message is piped to	a pager. The pager used
- 	  is named by the ``USAGE_PAGER'' environment variable.
- 	  If this variable is unset or empty (or is not	the name
- 	  of an	executable program) then the pager named by the
- 	  ``PAGER'' environment	variable us used.  If this
- 	  variable is unset or empty (or is not	the name of an
- 	  executable program) then /usr/ucb/more is used.
- 
-      Description
- 	  The command description is printed.
- 
-      Terse
- 	  Terse	mode, just print command-line synopsis.
- 
-      Verbose
- 	  Verbose mode,	print descriptions for each argument
- 
-      Options
- 	  Option syntax	is displayed.
- 
-      LongOpts
- 	  Long-option syntax is	displayed.
- 
-      KeyWords
- 	  Same as LongOpts.
- 
- 
-      If	the environment	variable ``USAGECNTL'' is empty	or
-      undefined,	then the default usage level (which is presently
-      ``Verbose + Options'') will be used.
- 
- EXAMPLES
-      As	a first	example, consider the following	argument
-      specification for a Bourne	shell script:
- 
-      #!/bin/sh
-      RepCount=2;
-      Verbose="";
- 
- 
- 
- 
- Page 11
- 
- 
- 
- 
- 
- 
- PARSEARGS(1)					     PARSEARGS(1)
- 
- 
- 
-      ARGSPEC="
- 	 'c', ARGOPT,	      argInt,  RepCount, 'count	{# times to repeat}',
- 	 'v', ARGOPT,	      argBool, Verbose,	 'verbose {turn	on verbose mode}',
- 	 ' ', ARGREQ,	      argStr,  InFile,	 'input	{file to read from}',
- 	 ' ', ARGOPT,	      argStr,  OutFile,	 'output {file to write	to}',
- 	 'X', ARGHIDDEN,      argBool, XRated,	 'xrated {naughty! naughty!}',
- 	 ' ', ARGOPT|ARGLIST, listStr, Files,	 'files	{files to process}',
-      ENDOFARGS
-      "
-      eval `echo	"$ARGSPEC" | parseargs -s sh --	$0 "$@"`
- 
- 
-      This describes a Bourne shell script accepting up to three
-      flag arguments and	one or two positional arguments, plus a
-      list of additional	file arguments.	 Only the first
-      positional	argument is required.  The possible flags (in
-      UNIX) are:
- 
- 	  -c count  An integer repetition count.  This defaults
- 		    to two.
- 
- 	  -v	    A Boolean ``verbose'' flag.	 It defaults to
- 		    FALSE (an empty string).
- 
- 	  -X	    A Boolean ``X Rated'' flag.	 This is not
- 		    printed in the usage message.
- 
-      The two positional	arguments are both strings, as is the
-      final list.  If we	were to	invoke the above script	with the
-      following command line:
- 	  cmdname  -v  input_file  output_file	file1  file2
- 
-      Then, after invoking parseargs, the following shell
-      variables would contain the following values:
- 	  $RepCount would evaluate to ``2''
- 
- 	  $Verbose would evaluate to ``TRUE''
- 	  $InFile would	evaluate to ``input_file''
- 
- 	  $OutFile would evaluate to ``output_file''
- 	  $Files would evaluate	to ``file1  file2''
- 
- 	  $XRated would	be unset and would evaluate to an empty
- 	  string (``'').
- 
- 
-      Now let's present a more complete example.	The following
-      page shows	a Bourne shell script which uses parseargs to
-      parse its command line, echoes the	settings of all	its
-      associated	command	line variables,	and then prints	its
-      command usage.
- 
- 
- 
- 
- Page 12
- 
- 
- 
- 
- 
- 
- PARSEARGS(1)					     PARSEARGS(1)
- 
- 
- 
-      #!/bin/sh
-      #	  test.sh - Bourne shell script	to test	out the	parseargs command!
-      #
-      NAME="`basename $0`";  DOT=".";
- 
-      ARGUMENTS="
-        '?', ARGHIDDEN, argUsage, NULL,	  'Help	: print	usage and exit',
-        'S', ARGVALOPT, argStr,	 string,  'STRing : optional string arg',
-        'g', ARGLIST,   argStr,	 groups,  'newsGROUPS :	groups to test',
-        'r', ARGOPT,    argInt,	 count,	  'REPcount <# to repeat each group>',
-        'd', ARGOPT,    argStr,	 dirname, 'DIRectory : working directory',
-        'x', ARGOPT,    argBool,	 xflag,	  'Xflag : turn	on X-mode',
-        'y', ARGOPT,    argUBool, yflag,	  'Yflag : turn	off Y-mode',
-        's', ARGOPT,    argChar,	 sepch,	  'SEPchar : field separator',
-        'f', ARGLIST,   argStr,	 files,	  'files : files to process',
-        'n', ARGREQ|ARGPOS, argStr, name,  'name	: name to use',
-        ' ', ARGLIST,   argStr,	 -- ,	  'argv	: any remaining	arguments',
-        ENDOFARGS
-      "
-      export ARGUMENTS
- 
-      yflag='TRUE'     ## set defaults (dir=".";	count=1; sepch=',') ##
- 
-      ##	parse command-line and save assignments	in a temporary file ##
-      parseargs -s sh -e	ARGUMENTS -u --	"$NAME"	"$@" >/tmp/tmp$$
-      if	[ $? -ne 0 ]
-        then rm -f /tmp/tmp$$; exit 2  ## non-zero status (usage	given)
-      fi
- 
-      ##	evaluate results from parseargs	and remove temporary file
-      $DOT /tmp/tmp$$;  rm -f /tmp/tmp$$
- 
-      ##	echo  the parsed arguments (use	defaults if not	defined)
-      echo "ARGUMENTS:"
-      echo "=========="
-      echo "Name='$name', Count='${count:-1}'"
-      echo "XFlag='$xflag', YFlag='$yflag'"
-      echo "Directory='${dirname:-"."}',	SepChar='${sepch:-","}'"
-      echo "Groups='$groups'"
-      echo "Files='$files'"
-      if	[ "$string_flag" ]
-        then string=${string:-"!string arg ommitted on cmd-line!"}
-        else string="default string"
-      fi
-      echo "String='$string'"
-      echo "New Positional Parameters='$*'"
- 
-      parseargs -a "$ARGUMENTS" -U "$NAME"     ## print usage ##
- 
- DIAGNOSTICS
-      Parseargs may exit	with one of the	following status codes:
- 
- 
- 
- 
- Page 13
- 
- 
- 
- 
- 
- 
- PARSEARGS(1)					     PARSEARGS(1)
- 
- 
- 
-      -1	  Some type of system error occurred during execution,
- 	  causing the program to exit prematurely.
- 
-      0	  Normal exit status (no problems were encountered).
- 
-      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
- 	  displayed.
- 
-      2	  A command line syntax	error was encountered by
- 	  parseargs. The offending command line	argument may have
- 	  been intended	for either parseargs or	for the	calling
- 	  program.
- 
-      3	  The environment variable that	was specified with the -e
- 	  option is either NULL	(has an	empty value) or	does not
- 	  exist. Perhaps the user specified a shell variable
- 	  and/or forgot	to export it.
- 
-      4	  A syntax error was encountered in the	argument
- 	  specification	string that was	specified to parseargs.
- 
- FILES
-      /usr/local/parseargs.pl
- 	  This file defines a perl function named parseargs to
- 	  parse	arguments more conveniently for	perl-scripts. The
- 	  function is both documented and implemented in this
- 	  file.	The user should	``require'' this file in his/her
- 	  perl-script before invoking the function.
- 
-      /usr/local/parseargs.awk
- 	  This file defines an awk function named parseargs to
- 	  parse	arguments more conveniently for	awk-scripts. The
- 	  function is both documented and implemented in this
- 	  file.	The user should	include	this file in his/her
- 	  awk-script before invoking the function.
- 
- SEE ALSO
-      argtype(3), parseargs(3), parsecntl(3)
- 
- CAVEATS
-      Because of	the way	argument parsing is implemented	under
-      UNIX, MS-DOS, and OS/2, option arguments which contain a
-      leading dash (`-')	(or whatever the option	prefix character
-      is	defined	to be) may not be specified as a separate
-      argument on the command line, it must be part of the same
-      argument. That is to say that if a	program	has a -f option
-      that requires a string argument, then the following:
- 	  -f-arg
- 
-      will properly assign the string ``-arg'' to the option
- 
- 
- 
- Page 14
- 
- 
- 
- 
- 
- 
- PARSEARGS(1)					     PARSEARGS(1)
- 
- 
- 
-      whereas the following:
- 	  -f -arg
- 
-      will be interpreted by parseargs as two option strings: the
-      first of which (``-f'') is	missing	a required argument and
-      the second	of which (``-arg'') will most likely be	flagged
-      as	an invalid option.
- 
-      Similarly,	if the user requires an	ARGLIST	option to take
-      multiple arguments	with leading dashes then the following
-      method must be used: It is	a ``feature'' of parseargs that
-      ARGLIST arguments are always appended to the current list of
-      arguments for the given option. Thus, if ``-f'' is	an option
-      taking a list of arguments, then the following are	all
-      equivalent:
- 	  -farg1 arg2
- 
- 	  -f arg1 arg2
- 	  -farg1 -farg2
- 
- 	  -f arg1 -f arg2
-      Hence multiple ``leading dash'' arguments may specified as
-      follows:
- 
- 	  -f-dash_arg1 -f-dash_arg2  ...
- 
- BUGS
-      It	does not make sense to use any arguments of type argTBool
-      since parseargs currently has no way of knowing what the
-      initial value of the variable is. For this	reason,	argTBool
-      is	not recognized as a valid argument type	(even though it
-      is	used by	parseargs(3)). By the same token, since	the user
-      cannot create their own arguments types on	the fly	from a
-      shell-script, ARGNOVAL is not recognized as a valid argument
-      flag.
- 
-      Commas will not be	interpreted properly if	any field in the
-      argument specification string contains double quotes that
-      are nested	inside of double quotes, or single quotes that
-      are nested	inside of single quotes.
- 
-      Inside the	argument specification string, any repeated
-      string of commas that does	not appear inside of double or
-      single quotes will	be treated as a	single comma.
- 
-      Text descriptions for argument entries are	automatically
-      formatted in usage	messages. Any attempt by the user to
-      include tabs and/or newlines in the description will cause
-      it	to be formatted	improperly.
- 
-      Parseargs cannot properly preserve	any newlines in	shell
-      variables if the eval command is used to read its output
- 
- 
- 
- Page 15
- 
- 
- 
- 
- 
- 
- PARSEARGS(1)					     PARSEARGS(1)
- 
- 
- 
-      (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
-      parseargs to a temporary file and use the source command in
-      csh or the	dot command (`.') 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 parseargs.
- 
- AUTHOR
-      Brad Appleton  (brad@ssd.csd.harris.com)
-      Harris Computer Systems, Fort Lauderdale, FL USA
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- Page 16
- 
- 
- 
--- 0 ----
diff -cNr ../patchlevel4/parseargs3.txt ./parseargs3.txt
*** ../patchlevel4/parseargs3.txt	Thu May  2 11:06:45 1991
--- ./parseargs3.txt	Wed Dec 31 18:00:00 1969
***************
*** 1,1254 ****
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- NAME
-      parseargs - parse command line argument vectors
- 
- SYNOPSIS
-      #include <parseargs.h>
- 
-      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;
- 
- DESCRIPTION
-      Given a vector of string-valued arguments such as that
-      passed to main and	a vector describing the	possible argu-
-      ments, parseargs matches actual arguments to possible argu-
-      ments, converts values to the desired type, and diagnoses
-      problems such as missing arguments, extra arguments, and
-      argument values that are syntactically incorrect.
- 
-      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).
- 
-      Given an ArgList and an argdesc array, lparseargs will parse
-      arguments in an ArgList in	the same manner	as parseargs.
- 
-      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
-      vector of whitespace separated tokens and then attempt to
-      parse the resultant vector	as if it were given as argv[] on
-      the command-line.	NO special treatment is	given to charac-
-      ters such as single-quotes, double-quotes,	or anything else.
-      Sparseargs	will always assume that	any whitespace characters
-      are intended as argument separators.
- 
-      Vparseargs	takes an argdesc array,	the number of arguments
-      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
- 
- 
- 
- Page 1
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      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).
- 
-      Given an argdesc array, usage will	print the usage	for the
-      given command in the format specified by the user's
-      USAGECNTL environment variable.
- 
-      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.
- 
- THE ARGUMENT STRUCTURE
-      The basic type used by the	parseargs library is the argument
-      descriptor	(or "argdesc" for short). An ARGDESC structure is
-      used to describe a	command-line argument. Each command line
-      argument contains various fields which need to be set and/or
-      queried by	the programmer.	 The individual	fields of an
-      ARGDESC structure are desribed below:
- 
-      char  ad_name;
- 	  This is a single character which corresponds to the
- 	  option-letter	(case-sensitive) from the command-line
- 	  that matches the argument described by this structure.
- 	  Positional-arguments are denoted by putting a	a space
- 	  character in this field.
- 
-      argMask_t	ad_flags;
- 	  This field contains the various bitflags that	describe
- 	  the semantics	of this	argument. See the ARGUMENT FLAGS
- 	  section for more information on the possible combina-
- 	  tions	of bitmasks for	this field.
- 
-      argTypePtr_t  ad_type;
- 	  This field is	a pointer to a type conversion function
- 	  (such	as the ones provided in	argtype(3)). The type
- 	  conversion function is responsible for verifying the
- 	  validity of the argument, allocating any necessary
- 	  storage for its internal representation, and converting
- 	  the command-line argument into its required internal
- 	  form.	The type conversion function used may be one of
- 	  the pre-defined argtype(3) functions.	The function is
- 	  given	three parameters: The first is a pointer to the
- 	  ARGDESC struct in question, the second is the	string-
- 	  value	(if any) supplied on the command-line, and the
- 	  third	is a boolean value that	is TRUE	only if	the
- 	  second parameter points to temporary storage (and hence
- 	  may need to be copied).  In the case of parseargs(1)
- 	  this field must correspond to	the name of one	of the
- 	  argument type	functions described in argtype(3).
- 
- 
- 
- Page 2
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      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.
- 
-      const char	 *ad_prompt;
- 	  This field contains the long-name of the argument and
- 	  an optional description (the description must	be
- 	  separated from the long-name by at least one whitespace
- 	  character and	may optionally be enclosed in a	set of
- 	  balanced delimiters (such as parentheses, curly-braces,
- 	  square-brackets, or angle-brackets). If the long-name
- 	  contains any uppercase characters, then the substring
- 	  of long-name consisting of 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
- 	  supplied). The long-name may be matched by supplying a
- 	  unique prefix	of either the argument keyword or the
- 	  argument name.
- 
- DEFINING ARGDESC ARRAYS
-      When defining an argdesc array, the first item in the list
-      should be the item	STARTOFARGS. Normal arguments (defined by
-      the programmer) may then be specified as documented in this
-      manual.  The list of arguments is terminated using
-      ENDOFARGS.
- 
-      For example, consider the description:
-        int  RepCount =	   2;
-        BOOL Verbose = FALSE;
-        char *InFile;
-        char *OutFile =	   CHARNULL;
-        BOOL XRated =  FALSE;
-        ArgList *Files =	   ARGLISTNULL;
- 
-        ARGDESC Args[] =
-        {
- 	 STARTOFARGS,
- 	 'c', ARGOPT,	 argInt,  __ &RepCount,	"REPcount {# of	repetitions}",
- 	 'v', ARGOPT,	 argBool, __ &Verbose,	"Verbose {set verbose mode}",
- 	 ' ', ARGREQ,	 argStr,  __ &InFile,	"INPUTfile {input file}",
- 	 ' ', ARGOPT,	 argStr,  __ &OutFile,	"OUTPUTfile {output file}",
- 	 'X', ARGHIDDEN, argBool, __ &XRated,	"XratedMODE {naughty stuff!}",
- 	 ' ', ARGLIST,	 listStr, __ &Files,	"File {files to	be read}",
- 	 ENDOFARGS
-        };
- 
- 
- 
- Page 3
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      This describes a program accepting	up to three flag argu-
-      ments and one or two positional arguments,	plus a list of
-      additional	file arguments.	 Only the first	positional argu-
-      ment is required.	The possible flags (in UNIX) are:
- 
-      -c	count  An integer repetition count.  This defaults to
- 	       two.
- 
-      -v	       A Boolean ``verbose'' flag.  It defaults	to FALSE.
- 
-      -X	       A Boolean ``X Rated'' flag.  This is not	printed
- 	       in the usage message.
- 
-      The two positional	arguments are both strings, as is the
-      final list.  In AmigaDOS, the options would be REP	count, V,
-      and XMODE.	 In VAX/VMS, the qualifiers would be /REP=count,
-      /V, and /XMODE.
- 
- ARGUMENT FLAGS
-      These are the possible bitmasks that may be turned	ON or OFF
-      in	the ad_flags field of an ARGDESC structure.
- 
-      ARGOPT
- 	  This flag is actually	a dummy	flag (i.e. it is the
- 	  default). This flag specifies	that the command-line
- 	  argument is optional (need not appear	on the command-
- 	  line). It is only needed if no other flags are used to
- 	  define the given argument.  If other flags are given
- 	  and ARGREQ is	NOT one	of them, then ARGOPT is	always
- 	  assumed.
- 
-      ARGREQ
- 	  The associated command argument is required on the
- 	  command-line.
- 
-      ARGPOS
- 	  The associated command argument is positonal.	The
- 	  difference between using this	flag to	indicate a posi-
- 	  tional argument and between using a blank in the
- 	  ad_name field	to indicate a positional arguments is the
- 	  following: If	this flag is set but the ad_name of the
- 	  argument is non-blank, then this argument may	be
- 	  matched either positionally or by keyword. If	the
- 	  ad_name field	is blank, then this argument may only be
- 	  matched positionally.
- 
-      ARGNOVAL
- 	  The associated command argument takes	no value (as in
- 	  "-x value"); Its mere	presence (or lack thereof) on the
- 	  command-line is sufficient to	determine the necessary
- 	  action(s) to take (as	in "-x").  Boolean argument types
- 	  and Pseudo-argument types automatically default to
- 
- 
- 
- Page 4
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  ARGNOVAL.
- 
-      ARGVALOPT
- 	  This flag is used to indicate	that the command-line
- 	  argument takes a value (as in	"-s string" or
- 	  "/str=string") but that the value to this command-line
- 	  argument is NOT required (hence simply "-s" or "/str"
- 	  is also permissable).
- 
-      ARGVALREQ
- 	  Another "dummy" flag.	Unless ARGNOVAL	or ARGVALOPT is
- 	  specified, ARGVALREQ is always assumed. This flag indi-
- 	  cates	that the value to a command-line argument is
- 	  required (hence "-s string" is okay but just "-s" is
- 	  not).
- 
-      ARGHIDDEN
- 	  Don't	display	this argument in usage messages	but still
- 	  attempt to match it against strings given on the
- 	  command-line.
- 
-      ARGLIST
- 	  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 "-l val1 val2 ..."). The
- 	  list of values must be stored	in an ArgList structure
- 	  (NOT a vector	structure), an the corresponding
- 	  argument-type	function should	be one of the listXxxx
- 	  functions.
- 
-      ARGVEC
- 	  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 in "-v val1 val2 ..."). The
- 	  list of values must be stored	in a vector structure
- 	  (NOT an ArgList structure).
- 
-      The following bitmasks may	also be	present, but, unlike the
-      above masks which must be specified by the	programmer at
-      initialization time, the following	masks must only	be read
-      (never set) by the	programmer. They may be	queried	by using
-      the pc_ARGFLAGS function code and the mode	pc_READ	with par-
-      secntl(3).
- 
-      ARGGIVEN
- 	  The argument WAS given on the	command-line.
- 
-      ARGVALGIVEN
- 	  The value for	this argument was given	on the command-
- 	  line.
- 
-      ARGVALSEP
- 
- 
- 
- Page 5
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  The value to this argument was supplied in a separate
- 	  argv element from the	argument itself	(as in "-x value"
- 	  as opposed to	"-xvalue").
- 
-      ARGKEYWORD
- 	  This argument	was matched as a keyword (long-form) on
- 	  the command-line and not as a	single character.
- 
-      ARGDESCRIBED
- 	  This argument	was given a description	by the programmer
- 	  at initialization.
- 
-      ARGCOPYF
- 	  This flag is only used for lists and vectors (mul-
- 	  tivalued arguments) and is used on a per-item	basis. If
- 	  it is	set, it	means that the corresponding value in the
- 	  vector/list required space to	be allocated (such as the
- 	  duplication of a temporary string).
- 
- ARGDESC	MACROS
-      The following macros are used to extract and query	the
-      attributes	of a pointer to	a preprocessed arg-descriptor:
- 
-      arg_cname(ad)
- 	  Return the single-character name of an argument.
- 
-      arg_flags(ad)
- 	  Return the argument flags of an argument.  The flags
- 	  themselves may be manipulated	using the BTEST, BSET,
- 	  and BCLEAR macros defined in <useful.h>.
- 
-      arg_type(ad)
- 	  Return the pointer to	the value-translation-routine of
- 	  an argument.
- 
-      arg_valp(ad)
- 	  Return the pointer to	the value of this argument.
- 
-      arg_sname(ad)
- 	  Return the string name of an argument.
- 
-      arg_sdesc(ad)
- 	  Return the description of an argument. If a description
- 	  was supplied,	the ARGDESCRIBED flag will be set and the
- 	  description will immediately follow the terminating
- 	  NULL byte of the string name.
- 
-      ARG_isDESCRIBED(ad)
- 	  Evaluates to TRUE only if an argument	description was
- 	  provided.
- 
-      arg_description(ad)
- 
- 
- 
- Page 6
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  Return the description string	(or an empty string if no
- 	  description was given) for this argument.
- 
-      ARG_isPOSITIONAL(ad)
- 	  Evaluates to TRUE if this argument may be positionally
- 	  matched.
- 
-      ARG_isPOSONLY(ad)
- 	  Evaluates to TRUE if this argument may only be posi-
- 	  tionally matched.
- 
-      ARG_isLIST(ad)
- 	  Evaluates to TRUE if this argument is	an arglist.
- 
-      ARG_isVEC(ad)
- 	  Evaluates to TRUE if this argument is	a vector.
- 
-      ARG_isMULTIVAL(ad)
- 	  Evaluates to TRUE if this argument is	an arglist or a
- 	  vector.
- 
-      ARG_isVALTAKEN(ad)
- 	  Evaluates to TRUE if this argument does NOT take a
- 	  value.
- 
-      ARG_isGIVEN(ad)
- 	  Evaluates to TRUE if this argument was given on the
- 	  command-line.
- 
-      ARG_isVALGIVEN(ad)
- 	  Evaluates to TRUE if the argument value was given on
- 	  the command-line.
- 
-      ARG_isREQUIRED(ad)
- 	  Evaluates to TRUE if this argument is	required.
- 
-      ARG_isVALOPTIONAL(ad)
- 	  Evaluates to TRUE if the argument value is optional.
- 
-      ARG_isVALSEPARATE(ad)
- 	  Evaluates to TRUE if the argument value is optional.
- 
-      ARG_isHIDDEN(ad)
- 	  Evaluates to TRUE if this argument is	omitted	from
- 	  usage	messages.
- 
- CMD MACROS
-      <parseargs.h> defines a set of macros to allow a more "self
-      documenting" approach to declaring	argument-descriptor
-      arrays. The "old-style" is	still accepted (but if used it is
-      recommended that the STARTOFARGS macro is used in conjunc-
-      tion with ENDOFARGS).  An example use of these macros
- 
- 
- 
- Page 7
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      (which, with one exception, all begin with	``CMD'') follows:
- 	  #include <parseargs.h>
- 
- 	  static BOOL bflag = FALSE;
- 	  static char *arg1 = CHARNULL;
- 	  static char *arg2 = CHARNULL;
- 
- 	  static
- 	     CMD_OBJECT
- 		MyCmd
- 
- 	     CMD_NAME
- 		"mycmd -- one line statement of	purpose"
- 
- 	     CMD_DESCRIPTION
- 		"Mycmd will try	really really hard to run without errors \
- 	  and do whatever the heck it is supposed to do. If (God forbid) \
- 	  something should actually go wrong it	will say so."
- 
- 	     CMD_ARGUMENTS
- 		'H', ARGOPT, argUsage, __ NULL,
- 		"Help -- display usage and quit",
- 
- 		'b', ARGOPT, argSBool, __ &bflag,
- 		"bflag -- turn on `b'-mode (whatever that is)",
- 
- 		' ', ARGREQ, argStr, __	&arg1,
- 		"arg1 -- first argument	to this	spiffy program",
- 
- 		' ', ARGOPT, argStr, __	&arg2,
- 		"arg2 -- optional second argument to this spiffy program",
- 
- 		END_ARGUMENTS
- 	     CMD_END
- 
- 	  main(	int argc, char *argv[] )
- 	  {
- 	     (void) parseargs( argv, MyCmd );
- 	     (void) dostuff();
- 	     exit( 0 );
- 	  }
- 
- DEFAULT	ARGUMENT DESCRIPTOR
-      Each argdesc-array	has an initial default argument	list
-      (which may	be reset using the pc_DEFARGS function code with
-      parsecntl). This initial default argument-list contains `?'
-      and `H' which may be used as single character keywords to
-      display command-usage for all command-line	styles.	 Simi-
-      larly, ``?'', ``H'', and ``Help'' may be used as long-
-      keywords to display command-usage for all command-line
-      styles.  In Addition, for VMS style commands, the qualifiers
-      /INPUT=file, /OUTPUT=file,	and /ERROR=file, may be	used to
- 
- 
- 
- Page 8
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      redirect stdin, stdout, and stderr	(respectively) to a file.
-      For AmigaDOS style	commands, the keyword ``ENDKWDS'' may be
-      used to disable parsing for any more keywords on the
-      command-line.
- 
- SUPPLYING DEFAULT ARGUMENTS
-      Programs that use parseargs may be	given default arguments
-      under UNIX	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	command	named
-      ``cmd'' then the environment variable ``CMD_ARGS''	will be
-      parsed for	any "default" arguments	before the command-line
-      is	parsed.	 The command-line will over-ride any options that
-      are specified in this environment variable	(except	that
-      ARGLISTs and ARGVECs set in ``CMD_ARGS'' will be appended
-      from the command-line if they are selected).
- 
-      It	is important to	note that the contents of the
-      ``CMD_ARGS'' environment variable are NOT expanded	by the
-      shell and hence any special characters (such as quotes or
-      back-slashes) will	NOT be escaped or removed by parseargs.
-      Furthermore, it will not be possible to try and use a tab,
-      space, or newline character in the	environment variable as
-      anything other than an argument separator.
- 
-      Lastly, parts of an option	specification in ``CMD_ARGS'' may
-      NOT be continued on the command-line. As an example, if -f
-      requires an argument and CMD_ARGS="-f", then the command-
-      line "cmd	bah" will NOT assign "bah" as the argument to -f
-      but will instead complain about a missing argument	for -f.
-      Similarly,	if -l takes a list of arguments	and CMD_ARGS="-l
-      item1 item2", then	the command-line "cmd  bah", will NOT
-      assign "bah" to the end of	the list containing "item1" and
-      "item2" but will instead treat "bah" as the first positional
-      parameter on the command-line.
- 
- PARSING	BEHAVIOR
-      The programmer may	control	parsing	behavior through the use
-      of	parsecntl(3).  The user	may set	his (or	her) own desired
-      parsing behavior through the use of the ``PARSECNTL''
-      environment variable.  By indicating any number of	flags
-      (possibly negated)	the user will directly modify the
-      behavior of the parseargs library.	Flags may be combined by
-      placing a `+' or `|' character in between flags. A	switch is
-      negated by	immediately preceding it with a	`!' or `-' char-
-      acter.  The possible ``flags'' are	given by the following
-      table. Flags are case-insensitive.
- 
-      Prompt
- 	  Prompt the user for any missing arguments that are
- 	  required on the command-line.	No special escaping or
- 	  quoting is performed on the user input. Required
- 
- 
- 
- Page 9
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  arguments that expect	a list of values will be repeat-
- 	  edly prompted	for (one item per line)	until a	blank
- 	  line (followed by a carriage return) is entered.
- 
-      Ignore
- 	  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 mes-
- 	  sage is printed program execution is terminated.
- 
-      OptsOnly
- 	  Under	UNIX, setting this flag	will disable the parsing
- 	  of long-option syntax. This will cause all arguments
- 	  starting with	`+' to always be treated as a positional
- 	  parameter (instead of	a long-option).
- 
-      KwdsOnly
- 	  Under	UNIX, setting this flag	disables the parsing of
- 	  single-character options.  This will cause all argu-
- 	  ments	starting with `-' to always be treated as a posi-
- 	  tional parameter (instead of an option).
- 
-      LoptsOnly
- 	  Same as KwdsOnly.
- 
-      Flags1st
- 	  Setting this flag causes the parseargs library to force
- 	  any and all 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	posi-
- 	  tional arguments (the	-x option will be unmatched).
- 
- 	  If this flag is UNSET, then both of the previous exam-
- 	  ples are considered to consist of one	option and one
- 	  positional argument.
- 
-      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
- 	  equivalent).
- 
-      If	the environment	variable ``PARSECNTL'' is empty	or unde-
-      fined, then the parsing behavior set by the programmer is
-      used.  If the programmer has not explicitly used par-
-      secntl(3) to modify the parsing behavior, then the	default
-      behavior will be ``Flags1st'' for Unix systems, ``!Prompt +
-      !Ignore'' for AmigaDOS systems, ``CaseIgnore'' for	MS-DOS
- 
- 
- 
- Page 10
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      and OS/2 systems, and ``Prompt'' for VMS systems.
- 
- USAGE MESSAGES
-      Through the use of	an environment variable	(or a VMS sym-
-      bol), the user may	control	the syntax and the verbosity of
-      the command-usage messages	that are printed by parseargs.
-      The desired level of verbosity may	be set by defining the
-      environment variable ``USAGECNTL" to be a combination of
-      strings (case insensitive). The value of each string con-
-      trols one of three	different ``modes'' of behavior	in the
-      displaying	of usage messages:  The	first ``mode'' is ``ver-
-      bose'' mode, which	controls whether or not	a detailed
-      description of each argument should accompany the usual
-      command-line sysnopsis. If	verbose	mode is	``off'', then
-      only a command-line synopsis is printed (this is also ref-
-      ferred to as ``terse'' mode). The other two ``modes'' con-
-      trol the displaying of option syntax and long-option 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 follow-
-      ing table.
- 
-      Quiet
- 	  No usage message of any kind is displayed.
- 
-      Silent
- 	  Same as Quiet.
- 
-      Paged
- 	  The usage message is piped to	a pager. The pager used
- 	  is named by the ``USAGE_PAGER'' environment variable.
- 	  If this variable is unset or empty (or is not	the name
- 	  of an	executable program) then the pager named by the
- 	  ``PAGER'' environment	variable us used.  If this vari-
- 	  able is unset	or empty (or is	not the	name of	an exe-
- 	  cutable program) then	/usr/ucb/more is used.
- 
-      Description
- 	  The command description is printed.
- 
-      Terse
- 	  Terse	mode, just print command-line synopsis.
- 
-      Verbose
- 	  Verbose mode,	print descriptions for each argument
- 
-      Options
- 	  Option syntax	is displayed.
- 
-      LongOpts
- 	  Long-option syntax is	displayed.
- 
- 
- 
- Page 11
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      KeyWords
- 	  Same as LongOpts.
- 
-      If	the environment	variable ``USAGECNTL'' is empty	or unde-
-      fined, then the default usage level (which	is presently
-      ``Verbose + Options'') will be used.
- 
- MULTI-VALUED ARGUMENTS
-      Parseargs supports	two different types of multi-valued argu-
-      ments: linked-lists and vectors. The linked-lists are called
-      argument lists (or	arg-lists) and are specified by	supplying
-      the ARGLIST flag along with an associated listXxxx
-      argument-translation routine. The value associated	with an
-      arg-list should be	a list structure of type ArgList. The
-      include file <parseargs.h>	defines	four macros for	manipu-
-      lating ArgList structures:	 ARGLISTNULL, L_NEXT, L_STRING,
-      and L_FLAGS.
- 
-      ARGLISTNULL is simply the NULL argument-list pointer.
-      L_NEXT and	L_STRING each take a pointer to	a non-NULL
-      ArgList structure.	L_NEXT returns the address of the next
-      item in the list and L_STRING returns the string-value of
-      the current list-item.  L_FLAGS return the	arg-flags for a
-      given item	in the list. With non-multivalued arguments, only
-      the flags in the argument descriptor are needed; lists and
-      vectors however need a set	of flags for each item they con-
-      tain. Once	an arg-list has	been created, it may be	deallo-
-      cated using the function listFree.	ListFree takes one param-
-      eter: the address of the first item in the	arg-list.
- 
-      An	alternative to argument-lists is argument vectors (or
-      arg-vectors).  Arg-vectors	use the	ARGVEC flag instead of
-      the ARGLIST flag and do not require a special listXxxx func-
-      tion for each vector-type.	 Each of the argXxxx 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 <parseargs.h>	which are used for arg-
-      vectors. ARGVEC_T may be used to declare a	vector structure
-      or	a vector type; ARGVEC_EMPTY may	be used	to initialize the
-      structure.	 It is strongly	recommended that ARGVEC_T be used
-      to	declare	vector types in	a typedef statement (particularly
-      if	one is using function prototypes) but for those	who
-      insist, it	may be used to directly	declare	a  structure.
-      String-vectors will always	have an	extra NULL-pointer at the
-      end such that:
- 
- 	  ( StrVec.array[ StrVec.count ] == (char *)NULL )
- 
-      is	always true, and character-vectors will	always have an
- 
- 
- 
- Page 12
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      extra NUL-character at the	end such that:
- 
- 	  ( CharVec.array[ CharVec.count ] == '\0' )
- 
-      is	always true. Integer and floating point	vectors	contain
-      no	extra "null" elements.
- 
-      Once created, arg-vectors may be deallocated by calling the
-      macro vecFree or the macro	vecDeepFree and	passing	it the
-      arg-vector	structure. The differemce between these	two mac-
-      ros is that the latter will also free each	item in	the vec-
-      tor that required space to	be allocated (at the expense of
-      traversing	the vector).  At this writing, the only	prede-
-      fined argument-types that would benefit from vecDeepFree is
-      argStr vectors.
- 
-      An	example	use of arg-lists, and of arg-vectors follows:
- 
- 	  #include <parseargs.h>
- 
- 	  typedef ARGVEC_T(char	*) strvec_t;
- 
- 	  static ArgList  *StringList =	ARGLISTNULL;
- 	  static strvec_t  StringVec = ARGVEC_EMPTY(char *);
- 	  static ARGVEC_T(int)	NumberVec = ARGVEC_EMPTY(int);
- 
- 	  static
- 	    CMD_OBJECT	Args
- 	    CMD_NAME	"foo --	do whatever foo	does"
- 	    CMD_DESCRIPTION  "put a brief paragraph here"
- 	    CMD_ARGUMENTS
- 	       'l', ARGLIST, listStr, __ &StrList, "LiSt {list of strings}",
- 	       's', ARGVEC,  argStr,  __ &StrVec,  "STRing {vector of strings}",
- 	       'i', ARGVEC,  argInt,  __ &NumVec,  "NUMber {vector of numbers}",
- 	       END_ARGUMENTS
- 	    CMD_END
- 
- 	  main(	int argc, char *argv[] )
- 	  {
- 	     int i, *ls;
- 
- 	     if	( parseargs(argv, Args)	)  syserr( "parseargs failed" );
- 
- 	     for ( ls =	StrList, i=1 ; ls ; ls = L_NEXT(ls), i++ )
- 		printf(	"List item %d=%s, flags=%x\n",
- 			i, L_STRING(ls), L_FLAGS(ls) );
- 
- 	     for ( i = 0 ; i < StrVec.count ; i++ )
- 		printf(	"String[%d]=%s,	flags=%x\n",
- 			i, StrVec.array[i], StrVec.flags[i] );
- 
- 	     for ( i = 0 ; i < NumVec.count ; i++ )
- 
- 
- 
- Page 13
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 		printf(	"Number[%d]=%s,	flags=%x\n",
- 			i, NumVec.array[i], NumVec.flags[i] );
- 
- 	     listFree( StrList );
- 	     StrList = ARGLISTNULL;
- 
- 	     vecDeepFree( StrVec, char * );
- 	     vecFree( NumVec, int );
- 
- 	     exit( 0 );
- 	  }
- 
- 
- ARGUMENT TYPE FUNCTIONS
-      The argument types	recognized by parseargs	can be extended
-      by	adding new type	functions.  Argument type functions are
-      declared as:
- 
- 	  BOOL	argXxx(	 ARGDESC *ad,  char *vp,  BOOL copyf  )
- 
-      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
-      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.
- 
-      If	the type function successfully converts	the value, and
-      uses the entire value, it should return TRUE.  If the type
-      function successfully converts the	value, and uses	only N
-      characters	of the value, it should	return -N.  Otherwise, it
-      should print a message using usrerr(3) and	return FALSE.
-      This message should be of the form	"invalid xxxx option
-      'yyyy' for	Zzzz", where xxxx is the type of the option, yyyy
-      is	the string passed in vp, and zzzz is the name (taken from
-      ad->ad_prompt).  The argXxxx function is responsible for
-      detecting if the given argument descriptor	is an ARGVEC
-      argument and for taking the appropriate action.
- 
-      For example, a type function that took a filename and stored
-      an	open file pointer might	be coded as:
- 
- 	  #define REALLOC(ptr,size)  ((! ptr) ?	malloc(size) : realloc(ptr, size))
- 	  typedef ARGVEC_T(FILE	*)  FILEvec_t;
- 
- 	  BOOL	argReadFile(  ARGDESC *ad,  char *vp,  BOOL copyf  )
- 
- 
- 
- Page 14
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  {
- 	       register	FILE *fp;
- 	       fp = fopen(vp, "r");
- 
- 	       if ( ! fp ) {
- 		    usrerr("cannot open	'%s' for reading", vp);
- 		    return (FALSE);
- 	       }
- 	       if ( BTEST(arg_flags(ad), ARGVEC) ) {
- 		    FILEvec_t  *vec = (FILEvec_t *) arg_valp(ad);
- 		    size_t  size  = (1 + vec->count) * (sizeof (FILE *));
- 
- 		    vec->array = (FILE **) REALLOC(vec->array, size);
- 		    if ( ! vec->array )
- 			 syserr( "(m|re)alloc failed in	argReadFile" );
- 		    vec->flags = (FILE **) REALLOC(vec->flags, size);
- 		    if ( ! vec->flags )
- 			 syserr( "(m|re)alloc failed in	argReadFile" );
- 
- 		    vec->flags[	vec->count ] = arg_flags(ad);
- 		    vec->array[	(vec->count)++ ] = fp;
- 	       }
- 	       else
- 		    *(FILE *) arg_valp(ad) = fp;
- 	       return (TRUE);
- 	  }
- 
- LONG OPTIONS
-      Under UNIX, MS-DOS, and OS/2, parseargs also allows for long
-      options in	addition to single character options.  Under
-      UNIX, long	options	are denoted by a `+' character.	 Under
-      MS-DOS, and OS/2, long options are	denoted	by the second
-      character in the SWITCHAR environment variable. If	there is
-      no	second character, then if the first character is `-',
-      then a `+'	is used, otherwise a `/' is used.  The keyword
-      that is used is the first word in the prompt field	of an
-      argument descriptor entry.	Long options are case insensi-
-      tive!  Under UNIX,	an argument to a long option may be
-      separated from the	long option by an equal	sign (`=') or by
-      one or more whitespace characters.	 Thus, if an entry looks
-      like:
- 
-      then ``-c4'', ``+repcount=4'', ``+count=4'', ``+rep-
-      count 4'',	and ``+count 4'' will all have the same	effect.
- 
-      The long option names for ``-?'' in the default argument
-      descriptor	are ``+help'' and ``+?'' (respectively). In addi-
-      tion, ``++'' may be used to indicate the end of options so
-      that all remaining	arguments will be interpreted as posi-
-      tional parameters (even if	one begins with	a `+' or a `-').
- 
- 
- 
- 
- 
- Page 15
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
-      Under MS-DOS, and OS/2, an	argument to a long-option must be
-      separated from the	long option by an equal	sign (`=')
-      (unless the first character of $SWITCHAR is a `-',	in which
-      case UNIX syntax is used).	 The long option names for ``/?''
-      in	the default argument descriptor	are ``/help'' and ``/?''
-      (respectively).
- 
-      Under VAX/VMS and AmigaDOS, single-character options are not
-      used and the ``long'' name	(in the	prompt field of	an argu-
-      ment descriptor) is always	used to	match for possible argu-
-      ments (or keywords, or qualifiers).
- 
-      For all supported operating systems, a long option	may be
-      matched in	one of two ways: it may	match all uppercase char-
-      acters in the prompt field, or it may match all characters
-      in	the prompt field (as in	``+count=4'' and ``+rep-
-      count=4'').
- 
-      Under all systems except AmigaDOS,	only the number	of char-
-      acters required to	uniquely identify the desired argument
-      are needed, but at	least two characters must be given
-      (unless the prompt	field is itself	less than two characters
-      long). This means that using the above example, that
-      ``+rep=4''	and ``+cou=4'' would also work but ``+c=4'' would
-      NOT (in other words, if you only want to use one character,
-      use ``-c4'' instead).
- 
-      Under VAX/VMS, the	possibilities using the	above example
-      would be:	``/REPCOUNT=4'', ``/COUNT=4'', ``/REP=4'', and
-      ``/COU=4'',
- 
-      Under AmigaDOS, no	``shortened'' keywords are accepted and
-      the possibilities using the above example would be:  ``REP-
-      COUNT 4'',	and ``COUNT 4''
- 
- RETURN VALUE
-      The functions in the parseargs library will return	a value
-      of	zero upon succesful completion.	They may however, return
-      any of the	following status codes (which are defined in
-      <parseargs.h>):
- 
-      pe_SYSTEM
- 	  A system error occurred. The global variable errno may
- 	  indicate the problem (then again, it may not).
- 
-      pe_SUCCESS
- 	  Success, no errors encountered (zero is returned).
- 
-      pe_SYNTAX
- 	  A command-line syntax	error was encountered
- 
-      pe_DEFARGS
- 
- 
- 
- Page 16
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- 	  An attempt (using parsecntl) was made	to change the
- 	  default arg-search list of a command to point	to an
- 	  argdesc-array	which already has the given command on
- 	  its default arg-search list (which would cause an
- 	  infinite loop	when attempting	to match an unknown
- 	  command-line argument).
- 
-      pe_NOMATCH
- 	  Unable to match the named argument. This occurs when
- 	  the argument keyword name passed to parsecntl	(using
- 	  the pc_ARGFLAGS functions code) was found in the given
- 	  argdesc-array	or in its default-list.
- 
-      pe_BADMODE
- 	  Bad mode for given command in	parsecntl. This	occurs
- 	  when pc_WRITE	or pc_RDWR mode	is passed to parsecntl in
- 	  conjunction with the pc_ARGFLAGS functions code.  Par-
- 	  secntl will not modify existing arguments.
- 
-      pe_BADCNTL
- 	  Bad command for parsecntl. This occurs if an unknown
- 	  function-code	was passed to parsecntl.
- 
- SIDE EFFECTS
-      Each of the functions in the parseargs library will set the
-      external character	string ProgName	to be the name of the
-      last command that was operated upon by any	of the library
-      routines.
- 
-      When an argument-descriptor array is first	encountered by
-      any of the	parseargs library routines, it is initially com-
-      piled into	an intermediate	form that is more convenient to
-      manipulate. As a direct result, it	is not advisable to
-      attempt to	index directly into the	array to manipulate one
-      of	the argument descriptors (because the argdesc that you
-      thought was there may actually be somewhere else).	After the
-      array has been given its initial value(s),	only parsecntl(3)
-      should be used to manipulate or query the attributes of an
-      argument descriptor.
- 
- DOCUMENTING YOUR COMMANDS
-      The commands that you write with parseargs(3) may be docu-
-      mented using parseargs(1).	Just copy the argument descriptor
-      array into	a separate file, and invoke parseargs(1) with the
-      -M	option and pass	it the command-name (dont forget to
-      redirect input to come from your newly created file). It is
-      important to note that the	only portion of	that argdesc
-      array to insert into your file is the portion starting with
-      the very first command-line argument, all the way down to
-      (and including) the ENDOFARGS or END_ARGUMENTS entry.
- 
- 
- 
- 
- 
- Page 17
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- FILES
-      /usr/local/lib/libparse.a
- 	  Link library for parseargs.
- 
-      /usr/local/include/parseargs.h
- 	  Include file for parseargs.
- 
-      /usr/local/include/useful.h
- 	  Include file for portability.
- 
- SEE ALSO
-      argtype(3), parseargs(1), parsecntl(3)
-      The ``C Advisor'' column in UNIX Review Vol. 7 No.	11.
- 
- CAVEATS
-      Because of	the way	argument parsing is implemented	under
-      UNIX, MS-DOS, and OS/2, option arguments which contain a
-      leading dash (`-')	(or whatever the option	prefix character
-      is	defined	to be) may not be specified as a separate argu-
-      ment on the command line, it must be part of the same argu-
-      ment. That	is to say that if a program has	a -f option that
-      requires a	string argument, then the following:
- 	  -f-arg
- 
-      will properly assign the string ``-arg'' to the option
-      whereas the following:
- 	  -f -arg
- 
-      will be interpreted by parseargs as two option strings: the
-      first of which (``-f'') is	missing	a required argument and
-      the second	of which (``-arg'') will most likely be	flagged
-      as	an invalid option.
- 
-      Similarly,	if the user requires an	ARGLIST	option to take
-      multiple arguments	with leading dashes then the following
-      method must be used: It is	a ``feature'' of parseargs that
-      ARGLIST arguments are always appended to the current list of
-      arguments for the given option. Thus, if ``-f'' is	an option
-      taking a list of arguments, then the following are	all
-      equivalent:
- 	  -farg1 arg2
- 
- 	  -f arg1 arg2
- 	  -farg1 -farg2
- 
- 	  -f arg1 -f arg2
-      Hence multiple ``leading dash'' arguments may specified as
-      follows:
- 
- 	  -f-dash_arg1 -f-dash_arg2  ...
- 
- 
- 
- 
- 
- Page 18
- 
- 
- 
- 
- 
- 
- PARSEARGS(3)					     PARSEARGS(3)
- 
- 
- 
- BUGS
-      When a non-multivalued argument appears more than once on
-      the command-line then only	the last value supplied	is used.
-      A problem occurs however in the following scenario: suppose
-      `-s' is an	option that takes an optional string argument
-      (and suppose `-x' is some boolean flag). Then if the follow-
-      ing command-line is issued:
- 
- 	  command  -s string  -x  -s
- 
-      then, the argument	flags will properly correspond to the
-      second instance of	the `-s' option	(namely	ARGGIVEN will be
-      set but ARGVALGIVEN will be unset)	but the	value associated
-      with the option will be ``string''	(because the first
-      instance overwrote	the default).  Because of this,	it may be
-      safest to reassign	the default value if ARGGIVEN is set but
-      ARGVALGIVEN is unset.
- 
- AUTHOR
-      Eric Allman, University of	California, Berkeley
- 
- MODIFICATIONS
-      Modified to accept	a vector of arguments, better error mes-
-      sages, Unix keyword matching, and AmigaDOS	version	by Peter
-      da	Silva.
- 
-      Rewritten by Brad Appleton.  Parseargs(1);	functions par-
-      secntl, sparseargs, fparseargs, lparseargs, and vparseargs;
-      argument types argUsage, argDummy,	argUBool, and argTBool;
-      argument flags ARGPOS, ARGVALOPT, ARGVALREQ, ARGVALGIVEN,
-      ARGNOVAL, and ARGVEC; and VAX/VMS version and IBM-PC version
-      by	Brad Appleton
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- 
- Page 19
- 
- 
- 
--- 0 ----
diff -cNr ../patchlevel4/parsecntl3.txt ./parsecntl3.txt
*** ../patchlevel4/parsecntl3.txt	Thu May  2 11:06:46 1991
--- ./parsecntl3.txt	Wed Dec 31 18:00:00 1969
***************
*** 1,594 ****
- 
- 
- 
- PARSECNTL(3)					     PARSECNTL(3)
- 
- 
- 
- NAME
-      parsecntl - get and set attributes	of an argument descriptor
-      array
- 
- SYNOPSIS
-      #include <parseargs.h>
- 
-      int  parsecntl( ARGDESC argd[],  parsecntl_t func,	 parsemode_t mode,  ...	);
- 
- 
- DESCRIPTION
-      Parsecntl will read and/or	write the desired attributes of
-      the given command-object. The attributes to be operated upon
-      are specified by the second parameter to parsecntl. The
-      desired mode (read, write,	or both) are specified by the
-      third parameter to	parsecntl. If the operation to be per-
-      formed is pc_ARGFLAGS, then the fourth argument to	parsecntl
-      should be the keyword name	of the argument	whose flags are
-      to	be retrieved.  The last	parameter to parsecntl is always
-      the object	to contain the attribute(s) to be read/written.
-      If	the attribute(s) are to	be read	(regardless of whether or
-      not they are also being changed) then the last argument
-      should be a pointer to an object, otherwise the last argu-
SHAR_EOF
true || echo 'restore of PATCH05 failed'
fi
echo 'End of  part 4'
echo 'File PATCH05 is continued in part 5'
echo 5 > _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.