1 #ifndef PARSE_OPTIONS_H
 
   2 #define PARSE_OPTIONS_H
 
  10         /* options with no arguments */
 
  16         /* options with arguments (usually) */
 
  20         OPTION_LOWLEVEL_CALLBACK,
 
  24 /* Deprecated synonym */
 
  25 #define OPTION_BOOLEAN OPTION_COUNTUP
 
  27 enum parse_opt_flags {
 
  28         PARSE_OPT_KEEP_DASHDASH = 1,
 
  29         PARSE_OPT_STOP_AT_NON_OPTION = 2,
 
  30         PARSE_OPT_KEEP_ARGV0 = 4,
 
  31         PARSE_OPT_KEEP_UNKNOWN = 8,
 
  32         PARSE_OPT_NO_INTERNAL_HELP = 16
 
  35 enum parse_opt_option_flags {
 
  40         PARSE_OPT_LASTARG_DEFAULT = 16,
 
  41         PARSE_OPT_NODASH = 32,
 
  42         PARSE_OPT_LITERAL_ARGHELP = 64,
 
  43         PARSE_OPT_NEGHELP = 128,
 
  44         PARSE_OPT_SHELL_EVAL = 256
 
  48 typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
 
  50 struct parse_opt_ctx_t;
 
  51 typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
 
  52                                 const struct option *opt, int unset);
 
  56  *   holds the type of the option, you must have an OPTION_END last in your
 
  60  *   the character to use as a short option name, '\0' if none.
 
  63  *   the long option name, without the leading dashes, NULL if none.
 
  66  *   stores pointers to the values to be filled.
 
  69  *   token to explain the kind of argument this option wants. Keep it
 
  70  *   homogeneous across the repository.
 
  73  *   the short help associated to what the option does.
 
  74  *   Must never be NULL (except for OPTION_END).
 
  75  *   OPTION_GROUP uses this pointer to store the group header.
 
  78  *   mask of parse_opt_option_flags.
 
  79  *   PARSE_OPT_OPTARG: says that the argument is optional (not for BOOLEANs)
 
  80  *   PARSE_OPT_NOARG: says that this option does not take an argument
 
  81  *   PARSE_OPT_NONEG: says that this option cannot be negated
 
  82  *   PARSE_OPT_HIDDEN: this option is skipped in the default usage, and
 
  83  *                     shown only in the full usage.
 
  84  *   PARSE_OPT_LASTARG_DEFAULT: says that this option will take the default
 
  85  *                              value if no argument is given when the option
 
  86  *                              is last on the command line. If the option is
 
  87  *                              not last it will require an argument.
 
  88  *                              Should not be used with PARSE_OPT_OPTARG.
 
  89  *   PARSE_OPT_NODASH: this option doesn't start with a dash.
 
  90  *   PARSE_OPT_LITERAL_ARGHELP: says that argh shouldn't be enclosed in brackets
 
  91  *                              (i.e. '<argh>') in the help message.
 
  92  *                              Useful for options with multiple parameters.
 
  93  *   PARSE_OPT_NEGHELP: says that the long option should always be shown with
 
  94  *                              the --no prefix in the usage message. Sometimes
 
  95  *                              useful for users of OPTION_NEGBIT.
 
  98  *   pointer to the callback to use for OPTION_CALLBACK or
 
  99  *   OPTION_LOWLEVEL_CALLBACK.
 
 102  *   default value to fill (*->value) with for PARSE_OPT_OPTARG.
 
 103  *   OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in
 
 104  *   the value when met.
 
 105  *   CALLBACKS can use it like they want.
 
 108         enum parse_opt_type type;
 
 110         const char *long_name;
 
 116         parse_opt_cb *callback;
 
 120 #define OPT_END()                   { OPTION_END }
 
 121 #define OPT_ARGUMENT(l, h)          { OPTION_ARGUMENT, 0, (l), NULL, NULL, \
 
 122                                       (h), PARSE_OPT_NOARG}
 
 123 #define OPT_GROUP(h)                { OPTION_GROUP, 0, NULL, NULL, NULL, (h) }
 
 124 #define OPT_BIT(s, l, v, h, b)      { OPTION_BIT, (s), (l), (v), NULL, (h), \
 
 125                                       PARSE_OPT_NOARG, NULL, (b) }
 
 126 #define OPT_NEGBIT(s, l, v, h, b)   { OPTION_NEGBIT, (s), (l), (v), NULL, \
 
 127                                       (h), PARSE_OPT_NOARG, NULL, (b) }
 
 128 #define OPT_COUNTUP(s, l, v, h)     { OPTION_COUNTUP, (s), (l), (v), NULL, \
 
 129                                       (h), PARSE_OPT_NOARG }
 
 130 #define OPT_SET_INT(s, l, v, h, i)  { OPTION_SET_INT, (s), (l), (v), NULL, \
 
 131                                       (h), PARSE_OPT_NOARG, NULL, (i) }
 
 132 #define OPT_BOOL(s, l, v, h)        OPT_SET_INT(s, l, v, h, 1)
 
 133 #define OPT_SET_PTR(s, l, v, h, p)  { OPTION_SET_PTR, (s), (l), (v), NULL, \
 
 134                                       (h), PARSE_OPT_NOARG, NULL, (p) }
 
 135 #define OPT_INTEGER(s, l, v, h)     { OPTION_INTEGER, (s), (l), (v), "n", (h) }
 
 136 #define OPT_STRING(s, l, v, a, h)   { OPTION_STRING,  (s), (l), (v), (a), (h) }
 
 137 #define OPT_STRING_LIST(s, l, v, a, h) \
 
 138                                     { OPTION_CALLBACK, (s), (l), (v), (a), \
 
 139                                       (h), 0, &parse_opt_string_list }
 
 140 #define OPT_UYN(s, l, v, h)         { OPTION_CALLBACK, (s), (l), (v), NULL, \
 
 141                                       (h), PARSE_OPT_NOARG, &parse_opt_tertiary }
 
 142 #define OPT_DATE(s, l, v, h) \
 
 143         { OPTION_CALLBACK, (s), (l), (v), "time",(h), 0, \
 
 144           parse_opt_approxidate_cb }
 
 145 #define OPT_CALLBACK(s, l, v, a, h, f) \
 
 146         { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
 
 147 #define OPT_NUMBER_CALLBACK(v, h, f) \
 
 148         { OPTION_NUMBER, 0, NULL, (v), NULL, (h), \
 
 149           PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) }
 
 150 #define OPT_FILENAME(s, l, v, h)    { OPTION_FILENAME, (s), (l), (v), \
 
 152 #define OPT_COLOR_FLAG(s, l, v, h) \
 
 153         { OPTION_CALLBACK, (s), (l), (v), "when", (h), PARSE_OPT_OPTARG, \
 
 154                 parse_opt_color_flag_cb, (intptr_t)"always" }
 
 156 #define OPT_NOOP_NOARG(s, l) \
 
 157         { OPTION_CALLBACK, (s), (l), NULL, NULL, \
 
 158           "no-op (backward compatibility)", \
 
 159           PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb }
 
 161 /* Deprecated synonym */
 
 162 #define OPT_BOOLEAN OPT_COUNTUP
 
 164 /* parse_options() will filter out the processed options and leave the
 
 165  * non-option arguments in argv[].
 
 166  * Returns the number of arguments left in argv[].
 
 168 extern int parse_options(int argc, const char **argv, const char *prefix,
 
 169                          const struct option *options,
 
 170                          const char * const usagestr[], int flags);
 
 172 extern NORETURN void usage_with_options(const char * const *usagestr,
 
 173                                         const struct option *options);
 
 175 extern NORETURN void usage_msg_opt(const char *msg,
 
 176                                    const char * const *usagestr,
 
 177                                    const struct option *options);
 
 179 extern int optbug(const struct option *opt, const char *reason);
 
 180 extern int opterror(const struct option *opt, const char *reason, int flags);
 
 181 /*----- incremental advanced APIs -----*/
 
 186         PARSE_OPT_NON_OPTION,
 
 191  * It's okay for the caller to consume argv/argc in the usual way.
 
 192  * Other fields of that structure are private to parse-options and should not
 
 193  * be modified in any way.
 
 195 struct parse_opt_ctx_t {
 
 204 extern void parse_options_start(struct parse_opt_ctx_t *ctx,
 
 205                                 int argc, const char **argv, const char *prefix,
 
 206                                 const struct option *options, int flags);
 
 208 extern int parse_options_step(struct parse_opt_ctx_t *ctx,
 
 209                               const struct option *options,
 
 210                               const char * const usagestr[]);
 
 212 extern int parse_options_end(struct parse_opt_ctx_t *ctx);
 
 214 extern int parse_options_concat(struct option *dst, size_t, struct option *src);
 
 216 /*----- some often used options -----*/
 
 217 extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
 
 218 extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
 
 219 extern int parse_opt_color_flag_cb(const struct option *, const char *, int);
 
 220 extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
 
 221 extern int parse_opt_with_commit(const struct option *, const char *, int);
 
 222 extern int parse_opt_tertiary(const struct option *, const char *, int);
 
 223 extern int parse_opt_string_list(const struct option *, const char *, int);
 
 224 extern int parse_opt_noop_cb(const struct option *, const char *, int);
 
 226 #define OPT__VERBOSE(var, h)  OPT_BOOLEAN('v', "verbose", (var), (h))
 
 227 #define OPT__QUIET(var, h)    OPT_BOOLEAN('q', "quiet",   (var), (h))
 
 228 #define OPT__VERBOSITY(var) \
 
 229         { OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \
 
 230           PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
 
 231         { OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \
 
 232           PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
 
 233 #define OPT__DRY_RUN(var, h)  OPT_BOOLEAN('n', "dry-run", (var), (h))
 
 234 #define OPT__FORCE(var, h)    OPT_BOOLEAN('f', "force",   (var), (h))
 
 235 #define OPT__ABBREV(var)  \
 
 236         { OPTION_CALLBACK, 0, "abbrev", (var), "n", \
 
 237           "use <n> digits to display SHA-1s", \
 
 238           PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
 
 239 #define OPT__COLOR(var, h) \
 
 240         OPT_COLOR_FLAG(0, "color", (var), (h))