aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Habouzit <madcoder@debian.org>2007-10-16 00:32:38 +0200
committerJunio C Hamano <gitster@pobox.com>2007-10-29 21:03:31 -0700
commitf481e22a145ed17e85b68bf8ce2de4b80dfa4323 (patch)
treeac9ae1c08508c0802794bfdb511c6a3d85a46706
parent7f275b91520d31bfbe43ec5a9bbaf8ac6e663ce0 (diff)
downloadgit-f481e22a145ed17e85b68bf8ce2de4b80dfa4323.tar.gz
git-f481e22a145ed17e85b68bf8ce2de4b80dfa4323.tar.xz
parse-options: allow callbacks to take no arguments at all.
Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--parse-options.c10
-rw-r--r--parse-options.h1
2 files changed, 10 insertions, 1 deletions
diff --git a/parse-options.c b/parse-options.c
index b4a3b63e9..cc09c98ec 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -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);
diff --git a/parse-options.h b/parse-options.h
index 2558e00a7..3a470e5eb 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -16,6 +16,7 @@ enum parse_opt_flags {
enum parse_opt_option_flags {
PARSE_OPT_OPTARG = 1,
+ PARSE_OPT_NOARG = 2,
};
struct option;