/* You can use this directly to build tables, but the macros will ensure
* consistency and type safety. */
/* You can use this directly to build tables, but the macros will ensure
* consistency and type safety. */
OPT_NOARG = 1, /* -f/--foo */
OPT_HASARG = 2, /* -f arg/--foo=arg/--foo arg */
OPT_SUBTABLE = 4, /* Actually, longopt points to a subtable... */
OPT_NOARG = 1, /* -f/--foo */
OPT_HASARG = 2, /* -f arg/--foo=arg/--foo arg */
OPT_SUBTABLE = 4, /* Actually, longopt points to a subtable... */
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);
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.
* @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.
*
* 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 *)",
*
* 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 *)",
* returned string to form an error message for errlog(), free() the
* string and return false.
*
* 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.
+ *
-#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)
* @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
* @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
*
* This is a typesafe wrapper for intializing a struct opt_table. The callback
* is of type "char *cb(const char *, type *)",
*
* This is a typesafe wrapper for intializing a struct opt_table. The callback
* is of type "char *cb(const char *, type *)",
+ * 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.
* 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.
-#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_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)") },
- * "args...\nA silly test program."),
- * "Print this message." },
+ * "args...\nA silly test program.",
+ * "Print this message.") },
* 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.
* 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.
* @arg: the argument to hand to @cb.
* @desc: the verbose desction of the option (for opt_usage()), or NULL.
*
* @arg: the argument to hand to @cb.
* @desc: the verbose desction of the option (for opt_usage()), or NULL.
*
- * 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))
*/
#define opt_register_arg(names, cb, show, arg, desc) \
_opt_register((names), OPT_CB_ARG((cb), (show), (arg)), (desc))
char *(*cb)(void *arg),
char *(*cb_arg)(const char *optarg, void *arg),
void (*show)(char buf[OPT_SHOW_LEN], const void *arg),
char *(*cb)(void *arg),
char *(*cb_arg)(const char *optarg, void *arg),
void (*show)(char buf[OPT_SHOW_LEN], const void *arg),