diff options
author | David Vrabel <david.vrabel@citrix.com> | 2014-04-07 08:52:12 -0400 |
---|---|---|
committer | David Vrabel <david.vrabel@citrix.com> | 2014-04-07 08:52:12 -0400 |
commit | 2c5cb2770392fb9c5d8518688c8bc61986d70dc6 (patch) | |
tree | b19210e709de6ee0d22b67ef605a569500cf1a18 /tools/perf/util/parse-options.c | |
parent | cd979883b9ede90643e019f33cb317933eb867b4 (diff) | |
parent | 683b6c6f82a60fabf47012581c2cfbf1b037ab95 (diff) |
Merge commit '683b6c6f82a60fabf47012581c2cfbf1b037ab95' into stable/for-linus-3.15
This merge of the irq-core-for-linus branch broke the ARM build when
Xen is enabled.
Conflicts:
drivers/xen/events/events_base.c
Diffstat (limited to 'tools/perf/util/parse-options.c')
-rw-r--r-- | tools/perf/util/parse-options.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c index d22e3f8017dc..bf48092983c6 100644 --- a/tools/perf/util/parse-options.c +++ b/tools/perf/util/parse-options.c | |||
@@ -407,7 +407,9 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, | |||
407 | if (internal_help && !strcmp(arg + 2, "help")) | 407 | if (internal_help && !strcmp(arg + 2, "help")) |
408 | return usage_with_options_internal(usagestr, options, 0); | 408 | return usage_with_options_internal(usagestr, options, 0); |
409 | if (!strcmp(arg + 2, "list-opts")) | 409 | if (!strcmp(arg + 2, "list-opts")) |
410 | return PARSE_OPT_LIST; | 410 | return PARSE_OPT_LIST_OPTS; |
411 | if (!strcmp(arg + 2, "list-cmds")) | ||
412 | return PARSE_OPT_LIST_SUBCMDS; | ||
411 | switch (parse_long_opt(ctx, arg + 2, options)) { | 413 | switch (parse_long_opt(ctx, arg + 2, options)) { |
412 | case -1: | 414 | case -1: |
413 | return parse_options_usage(usagestr, options, arg + 2, 0); | 415 | return parse_options_usage(usagestr, options, arg + 2, 0); |
@@ -433,25 +435,45 @@ int parse_options_end(struct parse_opt_ctx_t *ctx) | |||
433 | return ctx->cpidx + ctx->argc; | 435 | return ctx->cpidx + ctx->argc; |
434 | } | 436 | } |
435 | 437 | ||
436 | int parse_options(int argc, const char **argv, const struct option *options, | 438 | int parse_options_subcommand(int argc, const char **argv, const struct option *options, |
437 | const char * const usagestr[], int flags) | 439 | const char *const subcommands[], const char *usagestr[], int flags) |
438 | { | 440 | { |
439 | struct parse_opt_ctx_t ctx; | 441 | struct parse_opt_ctx_t ctx; |
440 | 442 | ||
441 | perf_header__set_cmdline(argc, argv); | 443 | perf_header__set_cmdline(argc, argv); |
442 | 444 | ||
445 | /* build usage string if it's not provided */ | ||
446 | if (subcommands && !usagestr[0]) { | ||
447 | struct strbuf buf = STRBUF_INIT; | ||
448 | |||
449 | strbuf_addf(&buf, "perf %s [<options>] {", argv[0]); | ||
450 | for (int i = 0; subcommands[i]; i++) { | ||
451 | if (i) | ||
452 | strbuf_addstr(&buf, "|"); | ||
453 | strbuf_addstr(&buf, subcommands[i]); | ||
454 | } | ||
455 | strbuf_addstr(&buf, "}"); | ||
456 | |||
457 | usagestr[0] = strdup(buf.buf); | ||
458 | strbuf_release(&buf); | ||
459 | } | ||
460 | |||
443 | parse_options_start(&ctx, argc, argv, flags); | 461 | parse_options_start(&ctx, argc, argv, flags); |
444 | switch (parse_options_step(&ctx, options, usagestr)) { | 462 | switch (parse_options_step(&ctx, options, usagestr)) { |
445 | case PARSE_OPT_HELP: | 463 | case PARSE_OPT_HELP: |
446 | exit(129); | 464 | exit(129); |
447 | case PARSE_OPT_DONE: | 465 | case PARSE_OPT_DONE: |
448 | break; | 466 | break; |
449 | case PARSE_OPT_LIST: | 467 | case PARSE_OPT_LIST_OPTS: |
450 | while (options->type != OPTION_END) { | 468 | while (options->type != OPTION_END) { |
451 | printf("--%s ", options->long_name); | 469 | printf("--%s ", options->long_name); |
452 | options++; | 470 | options++; |
453 | } | 471 | } |
454 | exit(130); | 472 | exit(130); |
473 | case PARSE_OPT_LIST_SUBCMDS: | ||
474 | for (int i = 0; subcommands[i]; i++) | ||
475 | printf("%s ", subcommands[i]); | ||
476 | exit(130); | ||
455 | default: /* PARSE_OPT_UNKNOWN */ | 477 | default: /* PARSE_OPT_UNKNOWN */ |
456 | if (ctx.argv[0][1] == '-') { | 478 | if (ctx.argv[0][1] == '-') { |
457 | error("unknown option `%s'", ctx.argv[0] + 2); | 479 | error("unknown option `%s'", ctx.argv[0] + 2); |
@@ -464,6 +486,13 @@ int parse_options(int argc, const char **argv, const struct option *options, | |||
464 | return parse_options_end(&ctx); | 486 | return parse_options_end(&ctx); |
465 | } | 487 | } |
466 | 488 | ||
489 | int parse_options(int argc, const char **argv, const struct option *options, | ||
490 | const char * const usagestr[], int flags) | ||
491 | { | ||
492 | return parse_options_subcommand(argc, argv, options, NULL, | ||
493 | (const char **) usagestr, flags); | ||
494 | } | ||
495 | |||
467 | #define USAGE_OPTS_WIDTH 24 | 496 | #define USAGE_OPTS_WIDTH 24 |
468 | #define USAGE_GAP 2 | 497 | #define USAGE_GAP 2 |
469 | 498 | ||