path: root/parse-options.h
diff options
authorPierre Habouzit <>2007-10-14 23:45:45 (GMT)
committerJunio C Hamano <>2007-10-30 04:03:30 (GMT)
commitffe659f94d793375fca97dd296422fc10c155016 (patch)
tree8cd20e4bf38a001e60fbc1356dfa9d2ede346ea9 /parse-options.h
parentf389c808b6774fb0a1fc54cf2563a7b3038dd1d4 (diff)
parse-options: make some arguments optional, add callbacks.
* add the possibility to use callbacks to parse some options, this can help implementing new options kinds with great flexibility. struct option gains a callback pointer and a `defval' where callbacks user can put either integers or pointers. callbacks also can use the `value' pointer for anything, preferably to the pointer to the final storage for the value though. * add a `flag' member to struct option to make explicit that this option may have an optional argument. The semantics depends on the option type. For INTEGERS, it means that if the switch is not used in its --long-form=<value> form, and that there is no token after it or that the token does not starts with a digit, then it's assumed that the switch has no argument. For STRING or CALLBACK it works the same, except that the condition is that the next atom starts with a dash. This is needed to implement backward compatible behaviour with existing ways to parse the command line. Its use for new options is discouraged. Signed-off-by: Pierre Habouzit <> Signed-off-by: Shawn O. Pearce <>
Diffstat (limited to 'parse-options.h')
1 files changed, 16 insertions, 0 deletions
diff --git a/parse-options.h b/parse-options.h
index 3006a76..2b8e762 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -7,12 +7,20 @@ enum parse_opt_type {
enum parse_opt_flags {
+enum parse_opt_option_flags {
+struct option;
+typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
struct option {
enum parse_opt_type type;
int short_name;
@@ -20,6 +28,12 @@ struct option {
void *value;
const char *argh;
const char *help;
+ int flags;
+ parse_opt_cb *callback;
+ /* holds default value for PARSE_OPT_OPTARG,
+ though callbacks can use it like they want */
+ intptr_t defval;
#define OPT_END() { OPTION_END }
@@ -27,6 +41,8 @@ struct option {
#define OPT_BOOLEAN(s, l, v, h) { OPTION_BOOLEAN, (s), (l), (v), NULL, (h) }
#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), NULL, (h) }
#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) }
+#define OPT_CALLBACK(s, l, v, a, h, f) \
+ { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
/* parse_options() will filter out the processed options and leave the
* non-option argments in argv[].