1#ifndef PARSE_OPTIONS_H 2#define PARSE_OPTIONS_H 3 4enum parse_opt_type { 5/* special types */ 6 OPTION_END, 7 OPTION_GROUP, 8/* options with no arguments */ 9 OPTION_BIT, 10 OPTION_BOOLEAN,/* _INCR would have been a better name */ 11 OPTION_SET_INT, 12 OPTION_SET_PTR, 13/* options with arguments (usually) */ 14 OPTION_STRING, 15 OPTION_INTEGER, 16 OPTION_CALLBACK, 17}; 18 19enum parse_opt_flags { 20 PARSE_OPT_KEEP_DASHDASH =1, 21}; 22 23enum parse_opt_option_flags { 24 PARSE_OPT_OPTARG =1, 25 PARSE_OPT_NOARG =2, 26 PARSE_OPT_NONEG =4, 27 PARSE_OPT_HIDDEN =8, 28}; 29 30struct option; 31typedefintparse_opt_cb(const struct option *,const char*arg,int unset); 32 33/* 34 * `type`:: 35 * holds the type of the option, you must have an OPTION_END last in your 36 * array. 37 * 38 * `short_name`:: 39 * the character to use as a short option name, '\0' if none. 40 * 41 * `long_name`:: 42 * the long option name, without the leading dashes, NULL if none. 43 * 44 * `value`:: 45 * stores pointers to the values to be filled. 46 * 47 * `argh`:: 48 * token to explain the kind of argument this option wants. Keep it 49 * homogenous across the repository. 50 * 51 * `help`:: 52 * the short help associated to what the option does. 53 * Must never be NULL (except for OPTION_END). 54 * OPTION_GROUP uses this pointer to store the group header. 55 * 56 * `flags`:: 57 * mask of parse_opt_option_flags. 58 * PARSE_OPT_OPTARG: says that the argument is optionnal (not for BOOLEANs) 59 * PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs 60 * PARSE_OPT_NONEG: says that this option cannot be negated 61 * PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in 62 * the long one. 63 * 64 * `callback`:: 65 * pointer to the callback to use for OPTION_CALLBACK. 66 * 67 * `defval`:: 68 * default value to fill (*->value) with for PARSE_OPT_OPTARG. 69 * OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in 70 * the value when met. 71 * CALLBACKS can use it like they want. 72 */ 73struct option { 74enum parse_opt_type type; 75int short_name; 76const char*long_name; 77void*value; 78const char*argh; 79const char*help; 80 81int flags; 82 parse_opt_cb *callback; 83intptr_t defval; 84}; 85 86#define OPT_END() { OPTION_END } 87#define OPT_GROUP(h) { OPTION_GROUP, 0, NULL, NULL, NULL, (h) } 88#define OPT_BIT(s, l, v, h, b) { OPTION_BIT, (s), (l), (v), NULL, (h), 0, NULL, (b) } 89#define OPT_BOOLEAN(s, l, v, h) { OPTION_BOOLEAN, (s), (l), (v), NULL, (h) } 90#define OPT_SET_INT(s, l, v, h, i) { OPTION_SET_INT, (s), (l), (v), NULL, (h), 0, NULL, (i) } 91#define OPT_SET_PTR(s, l, v, h, p) { OPTION_SET_PTR, (s), (l), (v), NULL, (h), 0, NULL, (p) } 92#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), NULL, (h) } 93#define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) } 94#define OPT_CALLBACK(s, l, v, a, h, f) \ 95 { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) } 96 97/* parse_options() will filter out the processed options and leave the 98 * non-option argments in argv[]. 99 * Returns the number of arguments left in argv[]. 100 */ 101externintparse_options(int argc,const char**argv, 102const struct option *options, 103const char*const usagestr[],int flags); 104 105extern NORETURN voidusage_with_options(const char*const*usagestr, 106const struct option *options); 107 108/*----- some often used options -----*/ 109externintparse_opt_abbrev_cb(const struct option *,const char*,int); 110 111#define OPT__VERBOSE(var) OPT_BOOLEAN('v',"verbose", (var),"be verbose") 112#define OPT__QUIET(var) OPT_BOOLEAN('q',"quiet", (var),"be quiet") 113#define OPT__DRY_RUN(var) OPT_BOOLEAN('n',"dry-run", (var),"dry run") 114#define OPT__ABBREV(var) \ 115 { OPTION_CALLBACK, 0,"abbrev", (var),"n", \ 116"use <n> digits to display SHA-1s", \ 117 PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 } 118 119#endif