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