X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fopt%2Fopt.h;h=879833652d320cd1f4e0fd67d0dea3521f78a5fc;hb=e0e921b9feaa32212fe151970686daf120e81b21;hp=65008091a0861ade804d06e8fc302bcf74a6aa51;hpb=f4b1f445a7b21b1599530afb897ef54efe15479d;p=ccan diff --git a/ccan/opt/opt.h b/ccan/opt/opt.h index 65008091..87983365 100644 --- a/ccan/opt/opt.h +++ b/ccan/opt/opt.h @@ -5,7 +5,7 @@ /* You can use this directly to build tables, but the macros will ensure * consistency and type safety. */ -enum opt_flags { +enum opt_type { OPT_NOARG = 1, /* -f/--foo */ OPT_HASARG = 2, /* -f arg/--foo=arg/--foo arg */ OPT_SUBTABLE = 4, /* Actually, longopt points to a subtable... */ @@ -17,7 +17,7 @@ enum opt_flags { struct opt_table { const char *names; /* slash-separated names, --longopt or -s */ - enum opt_flags flags; + enum opt_type type; char *(*cb)(void *arg); /* OPT_NOARG */ char *(*cb_arg)(const char *optarg, void *arg); /* OPT_HASARG */ void (*show)(char buf[OPT_SHOW_LEN], const void *arg); @@ -30,6 +30,7 @@ struct opt_table { * @names: the names of the option eg. "--foo", "-f" or "--foo/-f/--foobar". * @cb: the callback when the option is found. * @arg: the argument to hand to @cb. + * @desc: the description for opt_usage(), or opt_hidden. * * This is a typesafe wrapper for intializing a struct opt_table. The callback * of type "char *cb(type *)", "char *cb(const type *)" or "char *cb(void *)", @@ -46,8 +47,8 @@ struct opt_table { * See Also: * OPT_WITH_ARG() */ -#define OPT_WITHOUT_ARG(names, cb, arg) \ - (names), OPT_CB_NOARG((cb), (arg)) +#define OPT_WITHOUT_ARG(names, cb, arg, desc) \ + { (names), OPT_CB_NOARG((cb), (arg)), (desc) } /** * OPT_WITH_ARG() - macro for initializing long and short option (with arg) @@ -55,6 +56,7 @@ struct opt_table { * @cb: the callback when the option is found (along with ). * @show: the callback to print the value in get_usage (or NULL) * @arg: the argument to hand to @cb and @show + * @desc: the description for opt_usage(), or opt_hidden. * * This is a typesafe wrapper for intializing a struct opt_table. The callback * is of type "char *cb(const char *, type *)", @@ -80,8 +82,8 @@ struct opt_table { * See Also: * OPT_WITHOUT_ARG() */ -#define OPT_WITH_ARG(name, cb, show, arg) \ - (name), OPT_CB_ARG((cb), (show), (arg)) +#define OPT_WITH_ARG(name, cb, show, arg, desc) \ + { (name), OPT_CB_ARG((cb), (show), (arg)), (desc) } /** * OPT_SUBTABLE() - macro for including another table inside a table. @@ -107,14 +109,15 @@ struct opt_table { * The table must be terminated by OPT_ENDTABLE. * * Example: + * static int verbose = 0; * static struct opt_table opts[] = { - * { OPT_WITHOUT_ARG("--verbose", opt_inc_intval, &verbose), - * "Verbose mode (can be specified more than once)" }, - * { OPT_WITHOUT_ARG("-v", opt_inc_intval, &verbose), - * "Verbose mode (can be specified more than once)" }, - * { OPT_WITHOUT_ARG("--usage", opt_usage_and_exit, - * "args...\nA silly test program."), - * "Print this message." }, + * OPT_WITHOUT_ARG("--verbose", opt_inc_intval, &verbose, + * "Verbose mode (can be specified more than once)"), + * OPT_WITHOUT_ARG("-v", opt_inc_intval, &verbose, + * "Verbose mode (can be specified more than once)"), + * OPT_WITHOUT_ARG("--usage", opt_usage_and_exit, + * "args...\nA silly test program.", + * "Print this message."), * OPT_ENDTABLE * }; * @@ -148,7 +151,7 @@ void opt_register_table(const struct opt_table table[], const char *desc); * opt_register_arg - register an option with an arguments * @names: the names of the option eg. "--foo", "-f" or "--foo/-f/--foobar". * @cb: the callback when the option is found. - * @show: the callback when the option is found. + * @show: the callback to print the value in get_usage (or NULL) * @arg: the argument to hand to @cb. * @desc: the verbose desction of the option (for opt_usage()), or NULL. * @@ -164,8 +167,12 @@ void opt_register_table(const struct opt_table table[], const char *desc); * @cb returns false, opt_parse() will stop parsing and return false. * * Example: - * opt_register_arg("--explode", explode_cb, NULL, - * "Make the machine explode (developers only)"); + * static char *explode(const char *optarg, void *unused) + * { + * errx(1, "BOOM! %s", optarg); + * } + * ... + * opt_register_arg("--explode/--boom", explode, NULL, NULL, opt_hidden); */ #define opt_register_arg(names, cb, show, arg, desc) \ _opt_register((names), OPT_CB_ARG((cb), (show), (arg)), (desc)) @@ -185,7 +192,7 @@ void opt_register_table(const struct opt_table table[], const char *desc); * remain, and true is returned. * * Example: - * if (!opt_parse(argc, argv, opt_log_stderr)) { + * if (!opt_parse(&argc, argv, opt_log_stderr)) { * printf("%s", opt_usage(argv[0], "...")); * exit(1); * } @@ -286,7 +293,7 @@ char *opt_usage_and_exit(const char *extra); (arg) /* Non-typesafe register function. */ -void _opt_register(const char *names, enum opt_flags flags, +void _opt_register(const char *names, enum opt_type type, char *(*cb)(void *arg), char *(*cb_arg)(const char *optarg, void *arg), void (*show)(char buf[OPT_SHOW_LEN], const void *arg),