parseopt: add PARSE_OPT_NODASH
Add support for options that don't start with a dash. Initially, they don't accept arguments and can only be short options, i.e. consist of a single character. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									e0319ff5ed
								
							
						
					
					
						commit
						51a9949eda
					
				|  | @ -245,6 +245,25 @@ is_abbreviated: | |||
| 	return -2; | ||||
| } | ||||
|  | ||||
| static int parse_nodash_opt(struct parse_opt_ctx_t *p, const char *arg, | ||||
| 			    const struct option *options) | ||||
| { | ||||
| 	for (; options->type != OPTION_END; options++) { | ||||
| 		if (!(options->flags & PARSE_OPT_NODASH)) | ||||
| 			continue; | ||||
| 		if ((options->flags & PARSE_OPT_OPTARG) || | ||||
| 		    !(options->flags & PARSE_OPT_NOARG)) | ||||
| 			die("BUG: dashless options don't support arguments"); | ||||
| 		if (!(options->flags & PARSE_OPT_NONEG)) | ||||
| 			die("BUG: dashless options don't support negation"); | ||||
| 		if (options->long_name) | ||||
| 			die("BUG: dashless options can't be long"); | ||||
| 		if (options->short_name == arg[0] && arg[1] == '\0') | ||||
| 			return get_value(p, options, OPT_SHORT); | ||||
| 	} | ||||
| 	return -2; | ||||
| } | ||||
|  | ||||
| static void check_typos(const char *arg, const struct option *options) | ||||
| { | ||||
| 	if (strlen(arg) < 3) | ||||
|  | @ -295,6 +314,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, | |||
| 		const char *arg = ctx->argv[0]; | ||||
|  | ||||
| 		if (*arg != '-' || !arg[1]) { | ||||
| 			if (parse_nodash_opt(ctx, arg, options) == 0) | ||||
| 				continue; | ||||
| 			if (ctx->flags & PARSE_OPT_STOP_AT_NON_OPTION) | ||||
| 				break; | ||||
| 			ctx->out[ctx->cpidx++] = ctx->argv[0]; | ||||
|  | @ -427,8 +448,12 @@ int usage_with_options_internal(const char * const *usagestr, | |||
| 			continue; | ||||
|  | ||||
| 		pos = fprintf(stderr, "    "); | ||||
| 		if (opts->short_name) | ||||
| 			pos += fprintf(stderr, "-%c", opts->short_name); | ||||
| 		if (opts->short_name) { | ||||
| 			if (opts->flags & PARSE_OPT_NODASH) | ||||
| 				pos += fprintf(stderr, "%c", opts->short_name); | ||||
| 			else | ||||
| 				pos += fprintf(stderr, "-%c", opts->short_name); | ||||
| 		} | ||||
| 		if (opts->long_name && opts->short_name) | ||||
| 			pos += fprintf(stderr, ", "); | ||||
| 		if (opts->long_name) | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ enum parse_opt_option_flags { | |||
| 	PARSE_OPT_NONEG   = 4, | ||||
| 	PARSE_OPT_HIDDEN  = 8, | ||||
| 	PARSE_OPT_LASTARG_DEFAULT = 16, | ||||
| 	PARSE_OPT_NODASH = 32, | ||||
| }; | ||||
|  | ||||
| struct option; | ||||
|  | @ -66,8 +67,11 @@ typedef int parse_opt_cb(const struct option *, const char *arg, int unset); | |||
|  *   PARSE_OPT_OPTARG: says that the argument is optional (not for BOOLEANs) | ||||
|  *   PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs | ||||
|  *   PARSE_OPT_NONEG: says that this option cannot be negated | ||||
|  *   PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in | ||||
|  *                    the long one. | ||||
|  *   PARSE_OPT_HIDDEN: this option is skipped in the default usage, and | ||||
|  *                     shown only in the full usage. | ||||
|  *   PARSE_OPT_LASTARG_DEFAULT: if no argument is given, the default value | ||||
|  *                              is used. | ||||
|  *   PARSE_OPT_NODASH: this option doesn't start with a dash. | ||||
|  * | ||||
|  * `callback`:: | ||||
|  *   pointer to the callback to use for OPTION_CALLBACK. | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ String options | |||
| Magic arguments | ||||
|     --quux                means --quux | ||||
|     -NUM                  set integer to NUM | ||||
|     +                     same as -b | ||||
|  | ||||
| Standard options | ||||
|     --abbrev[=<n>]        use <n> digits to display SHA-1s | ||||
|  | @ -276,6 +277,12 @@ test_expect_success 'OPT_NEGBIT() works' ' | |||
| 	test_cmp expect output | ||||
| ' | ||||
|  | ||||
| test_expect_success 'OPT_BOOLEAN() with PARSE_OPT_NODASH works' ' | ||||
| 	test-parse-options + + + + + + > output 2> output.err && | ||||
| 	test ! -s output.err && | ||||
| 	test_cmp expect output | ||||
| ' | ||||
|  | ||||
| cat > expect <<EOF | ||||
| boolean: 0 | ||||
| integer: 12345 | ||||
|  |  | |||
|  | @ -54,6 +54,8 @@ int main(int argc, const char **argv) | |||
| 		OPT_ARGUMENT("quux", "means --quux"), | ||||
| 		OPT_NUMBER_CALLBACK(&integer, "set integer to NUM", | ||||
| 			number_callback), | ||||
| 		{ OPTION_BOOLEAN, '+', NULL, &boolean, NULL, "same as -b", | ||||
| 		  PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH }, | ||||
| 		OPT_GROUP("Standard options"), | ||||
| 		OPT__ABBREV(&abbrev), | ||||
| 		OPT__VERBOSE(&verbose), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 René Scharfe
						René Scharfe