parse-options: allow -h as a short option
Let callers provide their own handler for the short option -h even without the flag PARSE_OPT_NO_INTERNAL_HELP, but call the internal handler (showing usage information) if that is the only parameter. Implement the first part by checking for -h only if parse_short_opt() can't find it and returns -2. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Jeff King <peff@peff.net>
This commit is contained in:
parent
d3d1f8c46f
commit
5ad0d3d526
@ -410,7 +410,7 @@ void parse_options_start(struct parse_opt_ctx_t *ctx,
|
|||||||
const struct option *options, int flags)
|
const struct option *options, int flags)
|
||||||
{
|
{
|
||||||
memset(ctx, 0, sizeof(*ctx));
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
ctx->argc = argc - 1;
|
ctx->argc = ctx->total = argc - 1;
|
||||||
ctx->argv = argv + 1;
|
ctx->argv = argv + 1;
|
||||||
ctx->out = argv;
|
ctx->out = argv;
|
||||||
ctx->prefix = prefix;
|
ctx->prefix = prefix;
|
||||||
@ -448,27 +448,32 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* lone -h asks for help */
|
||||||
|
if (internal_help && ctx->total == 1 && !strcmp(arg + 1, "h"))
|
||||||
|
goto show_usage;
|
||||||
|
|
||||||
if (arg[1] != '-') {
|
if (arg[1] != '-') {
|
||||||
ctx->opt = arg + 1;
|
ctx->opt = arg + 1;
|
||||||
if (internal_help && *ctx->opt == 'h')
|
|
||||||
goto show_usage;
|
|
||||||
switch (parse_short_opt(ctx, options)) {
|
switch (parse_short_opt(ctx, options)) {
|
||||||
case -1:
|
case -1:
|
||||||
goto show_usage_error;
|
goto show_usage_error;
|
||||||
case -2:
|
case -2:
|
||||||
if (ctx->opt)
|
if (ctx->opt)
|
||||||
check_typos(arg + 1, options);
|
check_typos(arg + 1, options);
|
||||||
|
if (internal_help && *ctx->opt == 'h')
|
||||||
|
goto show_usage;
|
||||||
goto unknown;
|
goto unknown;
|
||||||
}
|
}
|
||||||
if (ctx->opt)
|
if (ctx->opt)
|
||||||
check_typos(arg + 1, options);
|
check_typos(arg + 1, options);
|
||||||
while (ctx->opt) {
|
while (ctx->opt) {
|
||||||
if (internal_help && *ctx->opt == 'h')
|
|
||||||
goto show_usage;
|
|
||||||
switch (parse_short_opt(ctx, options)) {
|
switch (parse_short_opt(ctx, options)) {
|
||||||
case -1:
|
case -1:
|
||||||
goto show_usage_error;
|
goto show_usage_error;
|
||||||
case -2:
|
case -2:
|
||||||
|
if (internal_help && *ctx->opt == 'h')
|
||||||
|
goto show_usage;
|
||||||
|
|
||||||
/* fake a short option thing to hide the fact that we may have
|
/* fake a short option thing to hide the fact that we may have
|
||||||
* started to parse aggregated stuff
|
* started to parse aggregated stuff
|
||||||
*
|
*
|
||||||
|
@ -199,7 +199,7 @@ enum {
|
|||||||
struct parse_opt_ctx_t {
|
struct parse_opt_ctx_t {
|
||||||
const char **argv;
|
const char **argv;
|
||||||
const char **out;
|
const char **out;
|
||||||
int argc, cpidx;
|
int argc, cpidx, total;
|
||||||
const char *opt;
|
const char *opt;
|
||||||
int flags;
|
int flags;
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
|
Loading…
Reference in New Issue
Block a user