diff options
Diffstat (limited to 'tools/lib/subcmd/parse-options.c')
| -rw-r--r-- | tools/lib/subcmd/parse-options.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/tools/lib/subcmd/parse-options.c b/tools/lib/subcmd/parse-options.c index 981bb4481fd5..3284bb14ae78 100644 --- a/tools/lib/subcmd/parse-options.c +++ b/tools/lib/subcmd/parse-options.c @@ -314,12 +314,19 @@ static int get_value(struct parse_opt_ctx_t *p,  static int parse_short_opt(struct parse_opt_ctx_t *p, const struct option *options)  { +retry:  	for (; options->type != OPTION_END; options++) {  		if (options->short_name == *p->opt) {  			p->opt = p->opt[1] ? p->opt + 1 : NULL;  			return get_value(p, options, OPT_SHORT);  		}  	} + +	if (options->parent) { +		options = options->parent; +		goto retry; +	} +  	return -2;  } @@ -333,6 +340,7 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,  	if (!arg_end)  		arg_end = arg + strlen(arg); +retry:  	for (; options->type != OPTION_END; options++) {  		const char *rest;  		int flags = 0; @@ -426,6 +434,12 @@ match:  	}  	if (abbrev_option)  		return get_value(p, abbrev_option, abbrev_flags); + +	if (options->parent) { +		options = options->parent; +		goto retry; +	} +  	return -2;  }  | 
