X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fopt%2Fopt.h;h=1e25cce370ad19b002587a2d59951ddd0236bd5b;hp=253d03c4098691988a8edf4ef4352d3b72931be5;hb=be6a5cdadeef4995cc935f2d2443f45f542ed125;hpb=d89e5744f30b584ac4909ce1164af1289c41359b;ds=sidebyside diff --git a/ccan/opt/opt.h b/ccan/opt/opt.h index 253d03c4..1e25cce3 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 *)", @@ -39,18 +40,23 @@ struct opt_table { * returned string to form an error message for errlog(), free() the * string and return false. * + * Any number of equivalent short or long options can be listed in @names, + * separated by '/'. Short options are a single hyphen followed by a single + * character, long options are two hypens followed by one or more characters. + * * 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) - * @names: the names of the option eg. "--foo", "-f" or "--foo/-f/--foobar". + * @names: the option names eg. "--foo=", "-f" or "-f/--foo ". * @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 *)", @@ -63,6 +69,12 @@ struct opt_table { * argument; unless it uses the entire OPT_SHOW_LEN bytes it should * nul-terminate that buffer. * + * Any number of equivalent short or long options can be listed in @names, + * separated by '/'. Short options are a single hyphen followed by a single + * character, long options are two hypens followed by one or more characters. + * A space or equals in @names is ignored for parsing, and only used + * for printing the usage. + * * If the @cb returns non-NULL, opt_parse() will stop parsing, use the * returned string to form an error message for errlog(), free() the * string and return false. @@ -70,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. @@ -276,7 +288,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),