From: Junio C Hamano Date: Fri, 15 Feb 2013 00:06:14 +0000 (-0800) Subject: Merge branch 'ef/non-ascii-parse-options-error-diag' X-Git-Tag: v1.8.2-rc0~10 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/6bdecc8f56a06f085b4444dc29361a5aa80d9eef?hp=-c Merge branch 'ef/non-ascii-parse-options-error-diag' * ef/non-ascii-parse-options-error-diag: parse-options: report uncorrupted multi-byte options --- 6bdecc8f56a06f085b4444dc29361a5aa80d9eef diff --combined parse-options.c index a6ce9efb79,052bf72bb8..c2cbca25cc --- a/parse-options.c +++ b/parse-options.c @@@ -3,7 -3,6 +3,7 @@@ #include "cache.h" #include "commit.h" #include "color.h" +#include "utf8.h" static int parse_options_usage(struct parse_opt_ctx_t *ctx, const char * const *usagestr, @@@ -19,6 -18,15 +19,6 @@@ int optbug(const struct option *opt, co return error("BUG: switch '%c' %s", opt->short_name, reason); } -int opterror(const struct option *opt, const char *reason, int flags) -{ - if (flags & OPT_SHORT) - return error("switch `%c' %s", opt->short_name, reason); - if (flags & OPT_UNSET) - return error("option `no-%s' %s", opt->long_name, reason); - return error("option `%s' %s", opt->long_name, reason); -} - static int get_arg(struct parse_opt_ctx_t *p, const struct option *opt, int flags, const char **arg) { @@@ -462,8 -470,11 +462,11 @@@ int parse_options(int argc, const char default: /* PARSE_OPT_UNKNOWN */ if (ctx.argv[0][1] == '-') { error("unknown option `%s'", ctx.argv[0] + 2); - } else { + } else if (isascii(*ctx.opt)) { error("unknown switch `%c'", *ctx.opt); + } else { + error("unknown non-ascii option in string: `%s'", + ctx.argv[0]); } usage_with_options(usagestr, options); } @@@ -483,7 -494,7 +486,7 @@@ static int usage_argh(const struct opti s = literal ? "[%s]" : "[<%s>]"; else s = literal ? " %s" : " <%s>"; - return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("...")); + return utf8_fprintf(outfile, s, opts->argh ? _(opts->argh) : _("...")); } #define USAGE_OPTS_WIDTH 24 @@@ -542,7 -553,7 +545,7 @@@ static int usage_with_options_internal( if (opts->long_name) pos += fprintf(outfile, "--%s", opts->long_name); if (opts->type == OPTION_NUMBER) - pos += fprintf(outfile, "-NUM"); + pos += utf8_fprintf(outfile, _("-NUM")); if ((opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !(opts->flags & PARSE_OPT_NOARG)) @@@ -586,12 -597,3 +589,12 @@@ static int parse_options_usage(struct p return usage_with_options_internal(ctx, usagestr, opts, 0, err); } +#undef opterror +int opterror(const struct option *opt, const char *reason, int flags) +{ + if (flags & OPT_SHORT) + return error("switch `%c' %s", opt->short_name, reason); + if (flags & OPT_UNSET) + return error("option `no-%s' %s", opt->long_name, reason); + return error("option `%s' %s", opt->long_name, reason); +}