parse-options: allow callbacks to take no arguments at all.
authorPierre Habouzit <madcoder@debian.org>
Mon, 15 Oct 2007 22:32:38 +0000 (00:32 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Oct 2007 04:03:31 +0000 (21:03 -0700)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
parse-options.c
parse-options.h

index b4a3b63e9f33b9f2af40fd8cf17dd2aeff312a35..cc09c98ec3fe19d6f9f5f7a58a3c5956bd7c0578 100644 (file)
@@ -72,6 +72,11 @@ static int get_value(struct optparse_t *p,
        case OPTION_CALLBACK:
                if (flags & OPT_UNSET)
                        return (*opt->callback)(opt, NULL, 1);
+               if (opt->flags & PARSE_OPT_NOARG) {
+                       if (p->opt && !(flags & OPT_SHORT))
+                               return opterror(opt, "takes no value", flags);
+                       return (*opt->callback)(opt, NULL, 0);
+               }
                if (opt->flags & PARSE_OPT_OPTARG && (!arg || *arg == '-'))
                        return (*opt->callback)(opt, NULL, 0);
                if (!arg)
@@ -261,8 +266,11 @@ void usage_with_options(const char * const *usagestr,
                        else
                                pos += fprintf(stderr, " <n>");
                        break;
-               case OPTION_STRING:
                case OPTION_CALLBACK:
+                       if (opts->flags & PARSE_OPT_NOARG)
+                               break;
+                       /* FALLTHROUGH */
+               case OPTION_STRING:
                        if (opts->argh) {
                                if (opts->flags & PARSE_OPT_OPTARG)
                                        pos += fprintf(stderr, " [<%s>]", opts->argh);
index 2558e00a7c0eb12a028f4d2e88f2a8f255716604..3a470e5eb8b1fe5597403487d85484fb0e52e5b9 100644 (file)
@@ -16,6 +16,7 @@ enum parse_opt_flags {
 
 enum parse_opt_option_flags {
        PARSE_OPT_OPTARG  = 1,
+       PARSE_OPT_NOARG   = 2,
 };
 
 struct option;