Show 103 quoted lines
> ---8<------>8-----
> Subject: [PATCH] parse-options: Don't call parse_options_check() so much
>
> parse_options_check() is being called for each invocation of
> parse_options_step() which can be quite a bit for some commands. The
> commit introducing this function cb9d398 (parse-options: add
> parse_options_check to validate option specs., 2009-06-09) had the
> correct motivation and explicitly states that parse_options_check()
> should be called from parse_options_start(). However, the implementation
> differs from the motivation. Fix it.
>
> Signed-off-by: Stephen Boyd <bebarino@gmail.com>
> ---
> builtin/blame.c | 2 +-
> builtin/shortlog.c | 2 +-
> parse-options.c | 7 +++----
> parse-options.h | 2 +-
> 4 files changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/builtin/blame.c b/builtin/blame.c
> index f5fccc1..19a2ebf 100644
> --- a/builtin/blame.c
> +++ b/builtin/blame.c
> @@ -2310,7 +2310,7 @@ int cmd_blame(int argc, const char **argv, const
> char *prefix)
> dashdash_pos = 0;
>
> parse_options_start(&ctx, argc, argv, prefix, PARSE_OPT_KEEP_DASHDASH |
> - PARSE_OPT_KEEP_ARGV0);
> + PARSE_OPT_KEEP_ARGV0, options);
> for (;;) {
> switch (parse_options_step(&ctx, options, blame_opt_usage)) {
> case PARSE_OPT_HELP:
> diff --git a/builtin/shortlog.c b/builtin/shortlog.c
> index 2135b0d..8473391 100644
> --- a/builtin/shortlog.c
> +++ b/builtin/shortlog.c
> @@ -269,7 +269,7 @@ int cmd_shortlog(int argc, const char **argv, const
> char *prefix)
> shortlog_init(&log);
> init_revisions(&rev, prefix);
> parse_options_start(&ctx, argc, argv, prefix, PARSE_OPT_KEEP_DASHDASH |
> - PARSE_OPT_KEEP_ARGV0);
> + PARSE_OPT_KEEP_ARGV0, options);
>
> for (;;) {
> switch (parse_options_step(&ctx, options, shortlog_usage)) {
> diff --git a/parse-options.c b/parse-options.c
> index 0fa79bc..196ba71 100644
> --- a/parse-options.c
> +++ b/parse-options.c
> @@ -338,7 +338,7 @@ static void parse_options_check(const struct option
> *opts)
>
> void parse_options_start(struct parse_opt_ctx_t *ctx,
> int argc, const char **argv, const char *prefix,
> - int flags)
> + int flags, const struct option *options)
> {
> memset(ctx, 0, sizeof(*ctx));
> ctx->argc = argc - 1;
> @@ -350,6 +350,7 @@ void parse_options_start(struct parse_opt_ctx_t *ctx,
> if ((flags & PARSE_OPT_KEEP_UNKNOWN) &&
> (flags & PARSE_OPT_STOP_AT_NON_OPTION))
> die("STOP_AT_NON_OPTION and KEEP_UNKNOWN don't go together");
> + parse_options_check(options);
> }
>
> static int usage_with_options_internal(struct parse_opt_ctx_t *,
> @@ -362,8 +363,6 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
> {
> int internal_help = !(ctx->flags & PARSE_OPT_NO_INTERNAL_HELP);
>
> - parse_options_check(options);
> -
> /* we must reset ->opt, unknown short option leave it dangling */
> ctx->opt = NULL;
>
> @@ -452,7 +451,7 @@ int parse_options(int argc, const char **argv, const
> char *prefix,
> {
> struct parse_opt_ctx_t ctx;
>
> - parse_options_start(&ctx, argc, argv, prefix, flags);
> + parse_options_start(&ctx, argc, argv, prefix, flags, options);
> switch (parse_options_step(&ctx, options, usagestr)) {
> case PARSE_OPT_HELP:
> exit(129);
> diff --git a/parse-options.h b/parse-options.h
> index ae8647d..828c056 100644
> --- a/parse-options.h
> +++ b/parse-options.h
> @@ -180,7 +180,7 @@ struct parse_opt_ctx_t {
>
> extern void parse_options_start(struct parse_opt_ctx_t *ctx,
> int argc, const char **argv, const char *prefix,
> - int flags);
> + int flags, const struct option *options);
>
> extern int parse_options_step(struct parse_opt_ctx_t *ctx,
> const struct option *options,
> --
> 1.7.3.2.614.g03864