Provided by: minc-tools_2.2.00-3_amd64 bug

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)