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