parse-options provides a variety of option behaviors, including OPTION_CALLBACK, which should take care of just about any sane behavior. All supported behaviors obey the following constraint: A --foo option can only accept (and base its behavior on) one argument, which would be the following command-line argument in the "unsticked" form. Alas, some existing git commands have options that do not obey that constraint. For example, update-index --cacheinfo takes three arguments, and update-index --resolve takes all later parameters as arguments. Introduce a new option type (OPTION_LOWLEVEL_CALLBACK) to support such unusual options. parse_options() callers can implement an arbitrary custom get_value() function to override the usual one and pass it through the callback field for options of interest. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- parse-options.c | 6 +++--- parse-options.h | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/parse-options.c b/parse-options.c index 0fa79bc..7907306 100644 --- a/parse-options.c +++ b/parse-options.c @@ -8,9 +8,6 @@ static int parse_options_usage(struct parse_opt_ctx_t *ctx, const char * const *usagestr, const struct option *opts, int err); -#define OPT_SHORT 1 -#define OPT_UNSET 2 - static int opterror(const struct option *opt, const char *reason, int flags) { if (flags & OPT_SHORT) @@ -51,6 +48,9 @@ static int get_value(struct parse_opt_ctx_t *p, const int unset = flags & OPT_UNSET; int err; + if (opt->type == OPTION_LOWLEVEL_CALLBACK) + return (*(parse_opt_ll_cb *)opt->callback)(p, opt, flags); + if (unset && p->opt) return opterror(opt, "takes no value", flags); if (unset && (opt->flags & PARSE_OPT_NONEG)) diff --git a/parse-options.h b/parse-options.h index d982f0f..fa400da 100644 --- a/parse-options.h +++ b/parse-options.h @@ -17,6 +17,7 @@ enum parse_opt_type { OPTION_STRING, OPTION_INTEGER, OPTION_CALLBACK, + OPTION_LOWLEVEL_CALLBACK, OPTION_FILENAME }; @@ -40,8 +41,16 @@ enum parse_opt_option_flags { PARSE_OPT_SHELL_EVAL = 256 }; +enum parse_opt_ll_flags { + OPT_SHORT = 1, + OPT_UNSET = 2 +}; + struct option; +struct parse_opt_ctx_t; typedef int parse_opt_cb(const struct option *, const char *arg, int unset); +typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx, + const struct option *opt, int flags); /* * `type`:: -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html