blob: 7581e931da13151473739036a89d9d19303eb18b [file] [log] [blame]
Pierre Habouzit4a59fd12007-10-15 01:35:37 +02001#ifndef PARSE_OPTIONS_H
2#define PARSE_OPTIONS_H
3
4enum parse_opt_type {
Pierre Habouzitdb7244b2007-11-07 11:20:27 +01005 /* special types */
Pierre Habouzit4a59fd12007-10-15 01:35:37 +02006 OPTION_END,
Pierre Habouzit580d5bf2008-03-02 11:35:56 +01007 OPTION_ARGUMENT,
Pierre Habouzitd7a38c52007-10-15 01:38:30 +02008 OPTION_GROUP,
René Scharfee0319ff2009-05-07 21:45:08 +02009 OPTION_NUMBER,
Pierre Habouzitdb7244b2007-11-07 11:20:27 +010010 /* options with no arguments */
11 OPTION_BIT,
René Scharfe2f4b97f2009-05-07 21:44:17 +020012 OPTION_NEGBIT,
Pierre Habouzitdb7244b2007-11-07 11:20:27 +010013 OPTION_BOOLEAN, /* _INCR would have been a better name */
14 OPTION_SET_INT,
15 OPTION_SET_PTR,
16 /* options with arguments (usually) */
Pierre Habouzit4a59fd12007-10-15 01:35:37 +020017 OPTION_STRING,
18 OPTION_INTEGER,
Pierre Habouzitffe659f2007-10-15 01:45:45 +020019 OPTION_CALLBACK,
Stephen Boyddf217ed2009-05-23 11:53:13 -070020 OPTION_FILENAME
Pierre Habouzit4a59fd12007-10-15 01:35:37 +020021};
22
23enum parse_opt_flags {
24 PARSE_OPT_KEEP_DASHDASH = 1,
Johannes Schindelina0ec9d22008-02-29 01:45:09 +000025 PARSE_OPT_STOP_AT_NON_OPTION = 2,
Pierre Habouzita32a4ea2008-06-24 00:31:31 +020026 PARSE_OPT_KEEP_ARGV0 = 4,
René Scharfeb5ce3a52009-03-08 19:12:47 +010027 PARSE_OPT_KEEP_UNKNOWN = 8,
René Scharfeb92891f2009-03-08 19:15:08 +010028 PARSE_OPT_NO_INTERNAL_HELP = 16,
Pierre Habouzit4a59fd12007-10-15 01:35:37 +020029};
30
Pierre Habouzitffe659f2007-10-15 01:45:45 +020031enum parse_opt_option_flags {
32 PARSE_OPT_OPTARG = 1,
Pierre Habouzitf481e222007-10-16 00:32:38 +020033 PARSE_OPT_NOARG = 2,
Pierre Habouzitdb7244b2007-11-07 11:20:27 +010034 PARSE_OPT_NONEG = 4,
Pierre Habouzitdd3bf0f2007-11-19 10:21:44 +010035 PARSE_OPT_HIDDEN = 8,
Pierre Habouzit1cc69852008-07-08 12:34:08 +020036 PARSE_OPT_LASTARG_DEFAULT = 16,
René Scharfe51a99492009-05-07 21:45:42 +020037 PARSE_OPT_NODASH = 32,
Stephen Boyd29f25d42009-05-21 00:33:17 -070038 PARSE_OPT_LITERAL_ARGHELP = 64,
Johannes Schindelin86b5efb2009-07-27 20:49:56 +020039 PARSE_OPT_NEGHELP = 128,
Pierre Habouzitffe659f2007-10-15 01:45:45 +020040};
41
42struct option;
43typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
44
Pierre Habouzit9b3beb52007-11-05 13:03:22 +010045/*
46 * `type`::
47 * holds the type of the option, you must have an OPTION_END last in your
48 * array.
49 *
50 * `short_name`::
51 * the character to use as a short option name, '\0' if none.
52 *
53 * `long_name`::
54 * the long option name, without the leading dashes, NULL if none.
55 *
56 * `value`::
57 * stores pointers to the values to be filled.
58 *
59 * `argh`::
60 * token to explain the kind of argument this option wants. Keep it
Mike Ralphson3ea3c212009-04-17 19:13:30 +010061 * homogeneous across the repository.
Pierre Habouzit9b3beb52007-11-05 13:03:22 +010062 *
63 * `help`::
64 * the short help associated to what the option does.
65 * Must never be NULL (except for OPTION_END).
66 * OPTION_GROUP uses this pointer to store the group header.
67 *
68 * `flags`::
69 * mask of parse_opt_option_flags.
Mike Ralphson3ea3c212009-04-17 19:13:30 +010070 * PARSE_OPT_OPTARG: says that the argument is optional (not for BOOLEANs)
Stephen Boyd34aec9f2009-06-04 16:43:57 -070071 * PARSE_OPT_NOARG: says that this option takes no argument
Pierre Habouzitdb7244b2007-11-07 11:20:27 +010072 * PARSE_OPT_NONEG: says that this option cannot be negated
René Scharfe51a99492009-05-07 21:45:42 +020073 * PARSE_OPT_HIDDEN: this option is skipped in the default usage, and
74 * shown only in the full usage.
Stephen Boyde169b972009-06-07 16:39:15 -070075 * PARSE_OPT_LASTARG_DEFAULT: says that this option will take the default
76 * value if no argument is given when the option
77 * is last on the command line. If the option is
78 * not last it will require an argument.
79 * Should not be used with PARSE_OPT_OPTARG.
René Scharfe51a99492009-05-07 21:45:42 +020080 * PARSE_OPT_NODASH: this option doesn't start with a dash.
Stephen Boyd29f25d42009-05-21 00:33:17 -070081 * PARSE_OPT_LITERAL_ARGHELP: says that argh shouldn't be enclosed in brackets
82 * (i.e. '<argh>') in the help message.
83 * Useful for options with multiple parameters.
Johannes Schindelin86b5efb2009-07-27 20:49:56 +020084 * PARSE_OPT_NEGHELP: says that the long option should always be shown with
85 * the --no prefix in the usage message. Sometimes
86 * useful for users of OPTION_NEGBIT.
Pierre Habouzit9b3beb52007-11-05 13:03:22 +010087 *
88 * `callback`::
89 * pointer to the callback to use for OPTION_CALLBACK.
90 *
91 * `defval`::
92 * default value to fill (*->value) with for PARSE_OPT_OPTARG.
Pierre Habouzitdb7244b2007-11-07 11:20:27 +010093 * OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in
94 * the value when met.
Pierre Habouzit9b3beb52007-11-05 13:03:22 +010095 * CALLBACKS can use it like they want.
96 */
Pierre Habouzit4a59fd12007-10-15 01:35:37 +020097struct option {
98 enum parse_opt_type type;
99 int short_name;
100 const char *long_name;
101 void *value;
Pierre Habouzitd7a38c52007-10-15 01:38:30 +0200102 const char *argh;
103 const char *help;
Pierre Habouzitffe659f2007-10-15 01:45:45 +0200104
105 int flags;
106 parse_opt_cb *callback;
Pierre Habouzitffe659f2007-10-15 01:45:45 +0200107 intptr_t defval;
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200108};
109
110#define OPT_END() { OPTION_END }
Stephen Boyd34aec9f2009-06-04 16:43:57 -0700111#define OPT_ARGUMENT(l, h) { OPTION_ARGUMENT, 0, (l), NULL, NULL, \
112 (h), PARSE_OPT_NOARG}
Pierre Habouzitd7a38c52007-10-15 01:38:30 +0200113#define OPT_GROUP(h) { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
Stephen Boyd34aec9f2009-06-04 16:43:57 -0700114#define OPT_BIT(s, l, v, h, b) { OPTION_BIT, (s), (l), (v), NULL, (h), \
115 PARSE_OPT_NOARG, NULL, (b) }
116#define OPT_NEGBIT(s, l, v, h, b) { OPTION_NEGBIT, (s), (l), (v), NULL, \
117 (h), PARSE_OPT_NOARG, NULL, (b) }
118#define OPT_BOOLEAN(s, l, v, h) { OPTION_BOOLEAN, (s), (l), (v), NULL, \
119 (h), PARSE_OPT_NOARG }
120#define OPT_SET_INT(s, l, v, h, i) { OPTION_SET_INT, (s), (l), (v), NULL, \
121 (h), PARSE_OPT_NOARG, NULL, (i) }
122#define OPT_SET_PTR(s, l, v, h, p) { OPTION_SET_PTR, (s), (l), (v), NULL, \
123 (h), PARSE_OPT_NOARG, NULL, (p) }
Stephen Boyde3a0ca82009-06-04 16:43:56 -0700124#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), "n", (h) }
Pierre Habouzitd7a38c52007-10-15 01:38:30 +0200125#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) }
Junio C Hamanocb6020b2009-12-04 00:20:48 -0800126#define OPT_UYN(s, l, v, h) { OPTION_CALLBACK, (s), (l), (v), NULL, \
127 (h), PARSE_OPT_NOARG, &parse_opt_tertiary }
Michele Ballabio1f4a7112008-03-24 15:02:21 +0100128#define OPT_DATE(s, l, v, h) \
129 { OPTION_CALLBACK, (s), (l), (v), "time",(h), 0, \
130 parse_opt_approxidate_cb }
Pierre Habouzitffe659f2007-10-15 01:45:45 +0200131#define OPT_CALLBACK(s, l, v, a, h, f) \
132 { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
René Scharfee0319ff2009-05-07 21:45:08 +0200133#define OPT_NUMBER_CALLBACK(v, h, f) \
134 { OPTION_NUMBER, 0, NULL, (v), NULL, (h), \
135 PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) }
Stephen Boyddf217ed2009-05-23 11:53:13 -0700136#define OPT_FILENAME(s, l, v, h) { OPTION_FILENAME, (s), (l), (v), \
137 "FILE", (h) }
Mark Lodato73e9da02010-02-16 23:55:58 -0500138#define OPT_COLOR_FLAG(s, l, v, h) \
139 { OPTION_CALLBACK, (s), (l), (v), "when", (h), PARSE_OPT_OPTARG, \
140 parse_opt_color_flag_cb, (intptr_t)"always" }
141
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200142
143/* parse_options() will filter out the processed options and leave the
Mike Ralphson3ea3c212009-04-17 19:13:30 +0100144 * non-option arguments in argv[].
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200145 * Returns the number of arguments left in argv[].
146 */
Stephen Boyd37782922009-05-23 11:53:12 -0700147extern int parse_options(int argc, const char **argv, const char *prefix,
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200148 const struct option *options,
Pierre Habouzitd7a38c52007-10-15 01:38:30 +0200149 const char * const usagestr[], int flags);
150
151extern NORETURN void usage_with_options(const char * const *usagestr,
152 const struct option *options);
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200153
Christian Couder451bb212009-02-02 06:12:58 +0100154extern NORETURN void usage_msg_opt(const char *msg,
155 const char * const *usagestr,
156 const struct option *options);
157
Mike Ralphson3ea3c212009-04-17 19:13:30 +0100158/*----- incremental advanced APIs -----*/
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200159
Pierre Habouzitee68b872008-06-23 22:28:04 +0200160enum {
161 PARSE_OPT_HELP = -1,
162 PARSE_OPT_DONE,
163 PARSE_OPT_UNKNOWN,
164};
165
Pierre Habouzit26141b52008-06-23 22:55:11 +0200166/*
167 * It's okay for the caller to consume argv/argc in the usual way.
168 * Other fields of that structure are private to parse-options and should not
169 * be modified in any way.
170 */
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200171struct parse_opt_ctx_t {
172 const char **argv;
173 const char **out;
174 int argc, cpidx;
175 const char *opt;
176 int flags;
Stephen Boyd37782922009-05-23 11:53:12 -0700177 const char *prefix;
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200178};
179
180extern void parse_options_start(struct parse_opt_ctx_t *ctx,
Stephen Boyd37782922009-05-23 11:53:12 -0700181 int argc, const char **argv, const char *prefix,
182 int flags);
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200183
Pierre Habouzitff43ec32008-06-23 22:38:58 +0200184extern int parse_options_step(struct parse_opt_ctx_t *ctx,
185 const struct option *options,
186 const char * const usagestr[]);
187
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200188extern int parse_options_end(struct parse_opt_ctx_t *ctx);
189
Junio C Hamano8b74d752010-03-06 21:34:40 +0100190extern int parse_options_concat(struct option *dst, size_t, struct option *src);
Pierre Habouzit7e7bbcb2008-06-23 21:59:37 +0200191
Pierre Habouzit0ce865b2007-10-14 11:05:12 +0200192/*----- some often used options -----*/
193extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
Michele Ballabio1f4a7112008-03-24 15:02:21 +0100194extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
Mark Lodato73e9da02010-02-16 23:55:58 -0500195extern int parse_opt_color_flag_cb(const struct option *, const char *, int);
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100196extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
Jake Goulding269defd2009-01-26 09:13:23 -0500197extern int parse_opt_with_commit(const struct option *, const char *, int);
Junio C Hamanocb6020b2009-12-04 00:20:48 -0800198extern int parse_opt_tertiary(const struct option *, const char *, int);
Pierre Habouzit0ce865b2007-10-14 11:05:12 +0200199
200#define OPT__VERBOSE(var) OPT_BOOLEAN('v', "verbose", (var), "be verbose")
201#define OPT__QUIET(var) OPT_BOOLEAN('q', "quiet", (var), "be quiet")
Tuncer Ayaz7f87aff2008-11-15 01:14:24 +0100202#define OPT__VERBOSITY(var) \
203 { OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \
204 PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
205 { OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \
206 PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
Pierre Habouzit0ce865b2007-10-14 11:05:12 +0200207#define OPT__DRY_RUN(var) OPT_BOOLEAN('n', "dry-run", (var), "dry run")
208#define OPT__ABBREV(var) \
209 { OPTION_CALLBACK, 0, "abbrev", (var), "n", \
210 "use <n> digits to display SHA-1s", \
211 PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
Mark Lodato73e9da02010-02-16 23:55:58 -0500212#define OPT__COLOR(var, h) \
213 OPT_COLOR_FLAG(0, "color", (var), (h))
Pierre Habouzit0ce865b2007-10-14 11:05:12 +0200214
Pierre Habouzit4a59fd12007-10-15 01:35:37 +0200215#endif