Man Linux: Main Page and Category List

NAME

       ParseArgv - process command-line options

SYNOPSIS

       #include <ParseArgv.h>

       int
       ParseArgv(argcPtr, argv, argTable, flags)

ARGUMENTS

       int        argcPtr     (in/out)  Pointer  to  number  of  arguments  in
                                        argv;  gets modified to hold number of
                                        unprocessed   arguments   that  remain
                                        after the call.

       char       **argv      (in/out)  Command line arguments passed to  main
                                        program.  Modified to hold unprocessed
                                        arguments that remain after the  call.

       ArgvInfo   *argTable   (in)      Array    of    argument   descriptors,
                                        terminated  by   element   with   type
                                        ARGV_END.

       int        flags       (in)      If  non-zero, then it specifies one or
                                        more flags that control the parsing of
                                        arguments.   Different  flags  may  be
                                        OR’ed together.  The flags currently
                                        defined are ARGV_DONT_SKIP_FIRST_ARG,
                                        ARGV_NO_ABBREV, ARGV_NO_LEFTOVERS,
                                        ARGV_NO_DEFAULTS and ARGV_NO_PRINT.
______________________________________________________________________________

DESCRIPTION

       ParseArgv  processes  an array of command-line arguments according to a
       table describing the kinds of arguments that are expected.  Each of the
       arguments  in  argv  is  processed  in  turn:  if it matches one of the
       entries in argTable, the argument is processed according to that  entry
       and  discarded.   The  arguments that do not match anything in argTable
       are copied down to the beginning  of  argv  (retaining  their  original
       order)  and  returned  to the caller.  At the end of the call ParseArgv
       sets *argcPtr to hold the number of arguments that are  left  in  argv,
       and  argv[*argcPtr]  will  hold  the  value  NULL.  Normally, ParseArgv
       assumes that argv[0] is a command  name,  so  it  is  treated  like  an
       argument  that  doesn’t  match  argTable  and  returned  to the caller;
       however, if the ARGV_DONT_SKIP_FIRST_ARG  bit  is  set  in  flags  then
       argv[0] will be processed just like the other elements of argv.

       ParseArgv  normally  returns  the  value FALSE (0).  If an error occurs
       while parsing the arguments, then TRUE (1) is  returned  and  ParseArgv
       will print an error message on stderr. In the event of an error return,
       *argvPtr will  not  have  been  modified,  but  argv  could  have  been
       partially modified.  The possible causes of errors are explained below.

       The argTable array specifies the kinds of arguments that are  expected;
       each of its entries has the following structure:

              typedef struct {
                  char*key;
                  int type;
                  char*src;
                  char*dst;
                  char*help;
              } ArgvInfo;

       The  key  field  is  a  string  such as ‘‘-display’’ or ‘‘-bg’’ that is
       compared with the values in argv.  Type indicates  how  to  process  an
       argument  that  matches  key  (more  on  this  below).  Src and dst are
       additional values used in processing the argument.  Their  exact  usage
       depends  on type, but typically src indicates a value and dst indicates
       where to store the value.  The char * declarations for src and dst  are
       placeholders:   the  actual  types may be different.  Lastly, help is a
       string giving a brief description  of  this  option;   this  string  is
       printed when users ask for help about command-line options.

       When processing an argument in argv, ParseArgv compares the argument to
       each of the key’s in argTable.  ParseArgv selects the  first  specifier
       whose  key  matches  the  argument exactly, if such a specifier exists.
       Otherwise ParseArgv selects a specifier for which  the  argument  is  a
       unique abbreviation.  If the argument is a unique abbreviation for more
       than one specifier, then an error is returned.  If there is no matching
       entry  in  argTable,  then  the argument is skipped and returned to the
       caller.

       Once a matching argument specifier is found,  ParseArgv  processes  the
       argument  according  to  the type field of the specifier.  The argument
       that  matched  key  is  called  ‘‘the  matching   argument’’   in   the
       descriptions  below.  As part of the processing, ParseArgv may also use
       the next argument in argv after the matching argument, which is  called
       ‘‘the  following  argument’’.   The  legal  values  for  type,  and the
       processing that they cause, are as follows:

       ARGV_END
              Marks the end of the table.  The last  entry  in  argTable  must
              have this type;  all of its other fields are ignored and it will
              never match any arguments.

       ARGV_CONSTANT
              Src is treated as an integer and dst is treated as a pointer  to
              an  integer.   Src  is stored at *dst.  The matching argument is
              discarded.

       ARGV_INT
              The following argument must contain an  integer  string  in  the
              format accepted by strtol (e.g. ‘‘0’’ and ‘‘0x’’ prefixes may be
              used to specify octal  or  hexadecimal  numbers,  respectively).
              Dst  is  treated  as  a  pointer  to  an integer;  the following
              argument is converted to an integer value and  stored  at  *dst.
              Src is treated as an integer count: if its value is greater than
              1, then that many arguments are processed and Dst is treated  as
              an  array  pointer.   The  matching  and following arguments are
              discarded from argv.

       ARGV_FLOAT
              The following argument must contain a floating-point  number  in
              the format accepted by strtol.  Dst is treated as the address of
              an  double-precision  floating  point  value;    the   following
              argument  is converted to a double-precision value and stored at
              *dst.  Src is treated as an  integer  count:  if  its  value  is
              greater  than  1, then that many arguments are processed and Dst
              is treated as an array  pointer.   The  matching  and  following
              arguments are discarded from argv.

       ARGV_STRING
              In  this  form,  dst  is  treated  as  a  pointer to a (char *);
              ParseArgv stores at *dst a pointer to  the  following  argument,
              and  discards  the  matching  and following arguments from argv.
              Src is treated as an integer count: if its value is greater than
              1,  then that many arguments are processed and Dst is treated as
              an array pointer.

       ARGV_HELP
              When this kind of option is encountered, ParseArgv uses the help
              fields  of argTable to format a message describing all the valid
              arguments.  The message  is  written  on  stderr  and  ParseArgv
              returns  TRUE.   When  this happens, the caller normally aborts.
              If the key field of a ARGV_HELP  specifier  is  NULL,  then  the
              specifier  will  never  match  any  arguments;  in this case the
              specifier simply provides extra  documentation,  which  will  be
              included when some other ARGV_HELP entry causes help information
              to be returned.

       ARGV_REST
              This option is used by programs or commands that allow the  last
              several  of their options to be the name and/or options for some
              other program.  If a ARGV_REST argument is found, then ParseArgv
              doesn’t process any of the remaining arguments;  it returns them
              all at the beginning of argv (along with any  other  unprocessed
              arguments).  In addition, ParseArgv treats dst as the address of
              an integer value, and stores at *dst the index of the  first  of
              the  ARGV_REST  options  in  the returned argv.  This allows the
              program  to  distinguish  the  ARGV_REST  options   from   other
              unprocessed options that preceeded the ARGV_REST.

       ARGV_FUNC
              For  this  kind  of argument, src is treated as the address of a
              procedure, which is invoked to process the  following  argument.
              The procedure should have the following structure:

              int
              func(dst, key, nextArg)
                  char    *dst;
                  char    *key;
                  char    *nextArg;
              {
              }

              The dst and key parameters will contain the corresponding fields
              from the argTable entry, and nextArg will point to the following
              argument  from  argv (or NULL if there aren’t any more arguments
              left in argv).  If func uses nextArg (so that  ParseArgv  should
              discard  it),  then  it  should  return  1.  Otherwise it should
              return 0 and TkParseArgv will process the following argument  in
              the  normal  fashion.   In either event the matching argument is
              discarded.

       ARGV_GENFUNC
              This form provides a more general procedural escape.  It  treats
              src as the address of a procedure, and passes that procedure all
              of the remaining  arguments.   The  procedure  should  have  the
              following form:

              int
              genfunc(dst, key, argc, argv)
                  char    *dst;
                  char    *key;
                  int argc;
                  char    **argv;
              {
              }

              The dst and key parameters will contain the corresponding fields
              from the argTable entry.  Argc and argv  refer  to  all  of  the
              options  after  the  matching  one.   Genfunc should behave in a
              fashion similar to ParseArgv:  parse as many  of  the  remaining
              arguments as it can, then return any that are left by compacting
              them to the beginning of argv (starting  at  argv[0]).   Genfunc
              should  return  a  count of how many arguments are left in argv;
              ParseArgv will process them.  If  genfunc  encounters  an  error
              then  it should print an error message on stderr, and return -1;
              when this happens ParseArgv will abort its processing and return
              TRUE.

FLAGS

       ARGV_DONT_SKIP_FIRST_ARG
              ParseArgv  normally treats argv[0] as a program or command name,
              and returns it to the  caller  just  as  if  it  hadn’t  matched
              argTable.   If  this  flag  is  given, then argv[0] is not given
              special treatment.

       ARGV_NO_ABBREV
              Normally, ParseArgv accepts unique abbreviations for key  values
              in argTable.  If this flag is given then only exact matches will
              be acceptable.

       ARGV_NO_LEFTOVERS
              Normally,  ParseArgv  returns  unrecognized  arguments  to   the
              caller.   If this bit is set in flags then ParseArgv will return
              an error if  it  encounters  any  argument  that  doesn’t  match
              argTable.   The  only  exception  to this rule is argv[0], which
              will be returned to  the  caller  with  no  errors  as  long  as
              ARGV_DONT_SKIP_FIRST_ARG isn’t specified.

       ARGV_NO_DEFAULTS
              Normally,  ParseArgv  searches  an  internal  table  of standard
              argument specifiers in addition to argTable.  If this bit is set
              in  flags,  then  ParseArgv  will  use only argTable and not its
              default table.

       ARGV_NO_PRINT
              Normally, ParseArgv prints error message on stderr. If this  bit
              is  set  in  flags,  then  ParseArgv  will  not  print any error
              messages.

EXAMPLE

       Here is an example definition of an argTable and  some  sample  command
       lines  that  use  the  options.   Note  the  effect  on  argc and argv;
       arguments processed by ParseArgv are eliminated from argv, and argc  is
       updated to reflect reduced number of arguments.

              /*
               * Define and set default values for globals.
               */
              int debugFlag = 0;
              int numReps = 100;
              char defaultFileName[] = "out";
              char *fileName = defaultFileName;
              Boolean exec = FALSE;

              /*
               * Define option descriptions.
               */
              ArgvInfo argTable[] = {
                  {"-X", ARGV_CONSTANT, (char *) 1, (char *) &debugFlag,
                      "Turn on debugging printfs"},
                  {"-N", ARGV_INT, (char *) NULL, (char *) &numReps,
                      "Number of repetitions"},
                  {"-of", ARGV_STRING, (char *) NULL, (char *) &fileName,
                      "Name of file for output"},
                  {"x", ARGV_REST, (char *) NULL, (char *) &exec,
                      "File to exec, followed by any arguments (must be last argument)."},
                  {(char *) NULL, ARGV_END, (char *) NULL, (char *) NULL,
                      (char *) NULL}
              };

              main(argc, argv)
                  int argc;
                  char *argv[];
              {
                  ...

                  if (ParseArgv(&argc, argv, argTable, 0)) {
                      exit(1);
                  }

                  /*
                   * Remainder of the program.
                   */
              }

       Note  that  default  values  can  be  assigned  to  variables  named in
       argTable:  the variables will only be  overwritten  if  the  particular
       arguments are present in argv.  Here are some example command lines and
       their effects.

              prog -N 200 infile      # just sets the numReps variable to 200
              prog -of out200 infile  # sets fileName to reference "out200"
              prog -XN 10 infile      # sets the debug flag, also sets numReps
       In all of the above examples, argc will  be  set  by  ParseArgv  to  2,
       argv[0]  will be ‘‘prog’’, argv[1] will be ‘‘infile’’, and argv[2] will
       be NULL.

KEYWORDS

       arguments, command line, options

                                                                  ParseArgv(3)