document arg_collect
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@7185 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -65,7 +65,8 @@ struct getargs{
|
|||||||
arg_flag,
|
arg_flag,
|
||||||
arg_negative_flag,
|
arg_negative_flag,
|
||||||
arg_strings,
|
arg_strings,
|
||||||
arg_double
|
arg_double,
|
||||||
|
arg_collect
|
||||||
} type;
|
} type;
|
||||||
void *value;
|
void *value;
|
||||||
const char *help;
|
const char *help;
|
||||||
@@ -131,6 +132,76 @@ argument is a double precision floating point value, and
|
|||||||
.Fa value
|
.Fa value
|
||||||
should point to a
|
should point to a
|
||||||
.Fa double .
|
.Fa double .
|
||||||
|
.It Fa arg_collect
|
||||||
|
allows more fine-grained control of the option parsing process.
|
||||||
|
.Fa value
|
||||||
|
should be a pointer to a
|
||||||
|
.Fa getarg_collect_info
|
||||||
|
structure:
|
||||||
|
.Bd -literal
|
||||||
|
typedef int (*getarg_collect_func)(int short_opt,
|
||||||
|
int argc,
|
||||||
|
char **argv,
|
||||||
|
int *optind,
|
||||||
|
int *optarg,
|
||||||
|
void *data);
|
||||||
|
|
||||||
|
typedef struct getarg_collect_info {
|
||||||
|
getarg_collect_func func;
|
||||||
|
void *data;
|
||||||
|
} getarg_collect_info;
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
With the
|
||||||
|
.Fa func
|
||||||
|
member set to a function to call, and
|
||||||
|
.Fa data
|
||||||
|
to some application specific data. The parameters to the collect function are:
|
||||||
|
.Bl -inset
|
||||||
|
.It Fa short_flag
|
||||||
|
non-zero if this call is via a short option flag, zero otherwise
|
||||||
|
.It Fa argc , argv
|
||||||
|
the whole argument list
|
||||||
|
.It Fa optind
|
||||||
|
pointer to the index in argv where the flag is
|
||||||
|
.It Fa optarg
|
||||||
|
pointer to the index in argv[*optind] where the flag name starts
|
||||||
|
.It Fa data
|
||||||
|
application specific data
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
You can modify
|
||||||
|
.Fa *optind ,
|
||||||
|
and
|
||||||
|
.Fa *optarg ,
|
||||||
|
but to do this correct you (more or less) have to know about the inner
|
||||||
|
workings of getarg.
|
||||||
|
|
||||||
|
You can skip parts of arguments by increasing
|
||||||
|
.Fa *optarg
|
||||||
|
(you could
|
||||||
|
implement the
|
||||||
|
.Fl z Ns Ar 3
|
||||||
|
set of flags from
|
||||||
|
.Nm gzip
|
||||||
|
with this), or whole argument strings by increasing
|
||||||
|
.Fa *optind
|
||||||
|
(let's say you want a flag
|
||||||
|
.Fl c Ar x y z
|
||||||
|
to specify a coordinate); if you also have to set
|
||||||
|
.Fa *optarg
|
||||||
|
to a sane value.
|
||||||
|
.Pp
|
||||||
|
The collect function should return one of
|
||||||
|
.Dv ARG_ERR_NO_MATCH , ARG_ERR_BAD_ARG , ARG_ERR_NO_ARG
|
||||||
|
on error, zero otherwise.
|
||||||
|
.Pp
|
||||||
|
For your convenience there is a function,
|
||||||
|
.Fn getarg_optarg ,
|
||||||
|
that returns the traditional argument string, and you pass it all
|
||||||
|
arguments, sans data, that where given to the collection function.
|
||||||
|
.Pp
|
||||||
|
Don't use this more this unless you absolutely have to.
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
Option parsing is similar to what
|
Option parsing is similar to what
|
||||||
|
Reference in New Issue
Block a user