Options::Parse( int &, char ** &, const char *, int, const ErrorId &, Error * )
Manipulate argc and argv to extract command
line arguments and associated values.
|
Virtual? |
No |
|
|
Class |
||
|
Arguments |
|
Number of arguments |
|
|
An array of arguments to parse |
|
|
|
The list of valid options to extract |
|
|
|
A flag indicating how many arguments are expected to remain when parsing is complete |
|
|
|
An error message containing usage tips |
|
|
|
The |
|
|
Returns |
|
Notes
You must bypass argv[0\] (that is, the name of the calling
program) before calling Options::Parse(). This is
most easily done by decrementing argc and incrementing
argv.
An argument by be of the form -avalue or -avalue. Although
an argument of the form -avalue is passed as two entries in
argv, the Options::Parse() method
parses it as one logical argument.
As arguments are scanned from the caller’s argv, the
caller’s argc and argv are modified to reflect
the arguments scanned. Scanning stops when the next argument either:
- does not begin with a
-, or - is a
-only, or - is not in the array of expected options.
Once scanning has stopped, argc and argv are
returned "as-is"; that is, they are returned as they were when scanning
stopped. There is no "shuffling" of arguments.
The opts argument is a format string indicating which
options are to be scanned, and whether these options are to have
associated values supplied by the user. Flags with associated values must
be followed by a colon (“:”) or a period (“.”) in the format string.
Using a colon allows arguments to be specified in the form -avalue
or -avalue; using a period allows only the -avalue
form.
If, based on the expectation set in the format string, the actual option
string in argv does not provide a value where one is
expected, an error is generated.
For instance, the p4 Command Line Client’s -V and -?
flags are expected to be supplied without values, but the -p flag is
expected to be accompanied with a setting for P4PORT.
This is the format string used by the p4 Command Line
Client:
"?c:C:d:GRhH:p:P:l:L:su:v:Vx:z:Z:"
Characters followed by colons (c, C,
and so on) are command line flags that take values; all characters not
followed by colons (?, G,
R, h, s, and
V) represent command line flags that require no
values.
There is a limit of 20 options per command line, as defined in
options.h by the constant N_OPTS.
The flag argument should be one of the following values
(defined in options.h):
| Argument | Value | Meaning |
|---|---|---|
|
|
|
Exactly one argument is expected to remain after parsing |
|
|
|
Exactly two arguments are expected to remain after parsing |
|
|
|
Exactly three arguments are expected to remain after parsing |
|
|
|
More than two arguments (three or more) are to remain after parsing |
|
|
|
Require that zero arguments remain after parsing; if arguments remain after parsing, set an error. |
|
|
|
If no arguments remain after parsing, create one that points to
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
See also
Options::GetValue() Options::operator[]()
Example
The following code and examples illustrate how Options::Parse() works.
#include <stdhdrs.h>
#include <strbuf.h>
#include <error.h>
#include <options.h>
int main( int argc, char **argv )
{
// Parse options.
Error *e = new Error();
ErrorId usage = { E_FAILED, "Usage: parse optionstring flag args" };
Options opts;
// strip out the program name before parsing
argc--;
argv;
// next argument is options to be parsed
char *ParseOpts = argv[ 0 ];
argc--;
argv;
// next argument is number of arguments remaining after parse
int flag = strtol( argv[ 0 ], NULL, 0 );
argc--;
argv;
// Echo pre-parse values
int iargv;
printf( "Prior to Options::Parse call:\n" );
printf( " ParseOpts is %s\n", ParseOpts );
printf( " flag is 0x%2.2X\n", flag );
printf( " argc is %d\n", argc );
for ( iargv = 0; iargv < argc; iargv )
{
printf( " argv[ %d ] is %s\n", iargv, argv[ iargv ] );
}
printf( "\n" );
opts.Parse( argc, argv, ParseOpts, flag, usage, e );
if ( e->Test() )
{
// See example for Error::Fmt()
StrBuf msg;
e->Fmt( &msg );
printf( "ERROR:\n%s\n", msg.Text() );
}
char *iParseOpts = ParseOpts;
int isubopt;
StrPtr *s;
// Print values for options.
while( *iParseOpts != '\0' )
{
if ( *iParseOpts != ':' )
{
isubopt = 0;
while( s = opts.GetValue( *iParseOpts, isubopt ) )
{
printf( "opts.GetValue( %c, %d ) value is %s\n",
*iParseOpts, isubopt, s->Text() );
isubopt;
}
}
iParseOpts;
}
// Echo post-parse values
printf( "\n" );
printf( "After Options::Parse call:\n" );
printf( " argc is %d\n", argc );
for ( iargv = 0; iargv < argc; iargv++ )
{
printf( " argv[ %d ] is %s\n", iargv, argv[ iargv ] );
}
return 0;
}
Invoke parsedemo with a format string, a flag (as defined
in options.h) to specify the number of options expected, and
a series of arguments.
For instance, to allow arguments -a, -b and -c, where -a and -b take
values, but -c does not take a value, and to use a flag of
OPT_NONE (0x10) to require that no options
remain unparsed after the call to Options::Parse(), invoke
parsedemo as follows.
$ parsedemo a:b:c 0x10 -a vala -b valb -c
Arguments of the form -c one are passed as two entries in
argv, but parsed as one logical argument:
$ parsedemo ha:b:c:d:e: 0x10 -cone Prior to Options::Parse call: ParseOpts is ha:b:c:d:e: flag is 0x10 argc is 1 argv[ 0 ] is -cone opts.GetValue( c, 0 ) value is one After Options::Parse call: argc is 0 $ parsedemo ha:b:c:d:e: 0x10 -c one Prior to Options::Parse call: ParseOpts is ha:b:c:d:e: flag is 0x10 argc is 2 argv[ 0 ] is -c argv[ 1 ] is one opts.GetValue( c, 0 ) value is one After Options::Parse call: argc is 0
Use of a period in the options string disallows the -c one
form for the c option:
$ parsedemo ha:b:c.d:e: 0x10 -c one Prior to Options::Parse call: ParseOpts is ha:b:c.d:e: flag is 0x10 argc is 2 argv[ 0 ] is -c argv[ 1 ] is one ERROR: Usage: parse optionstring flag args Unexpected arguments. opts.GetValue( c, 0 ) value is After Options::Parse call: argc is 1 argv[ 0 ] is one
Arguments not in the format string are permitted or rejected with the
use of different flag values; OPT_NONE (0x10)
requires that no arguments remain after the call to Options::Parse(), while
OPT_ONE (0x01) requires that one argument
remain.
$ parsedemo ha:b:c:d:e: 0x10 -c one two Prior to Options::Parse call: ParseOpts is ha:b:c:d:e: flag is 0x10 argc is 3 argv[ 0 ] is -c argv[ 1 ] is one argv[ 2 ] is two ERROR: Usage: parse optionstring flag args Unexpected arguments. opts.GetValue( c, 0 ) value is one $ parse ha:b:c:d:e: 0x01 -c one two Prior to Options::Parse call: ParseOpts is ha:b:c:d:e: flag is 0x01 argc is 3 argv[ 0 ] is -c argv[ 1 ] is one argv[ 2 ] is two opts.GetValue( c, 0 ) value is one After Options::Parse call: argc is 1 argv[ 0 ] is two






