/* 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... */
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);
* @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 *)",
* 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)
* @cb: the callback when the option is found (along with <arg>).
* @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 *)",
* 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.
* 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("--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." },
+ * "args...\nA silly test program.",
+ * "Print this message.") },
* OPT_ENDTABLE
* };
*
* 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.
*
* @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))
* 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], "<args>..."));
* exit(1);
* }
(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),