From: René Scharfe Date: Wed, 9 Jul 2025 09:45:53 +0000 (+0200) Subject: parse-options: add precision handling for OPTION_NEGBIT X-Git-Tag: v2.51.0-rc0~59^2~2 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=feeebbf1b7d5ed8761355d354e9529c791b77e7d;p=thirdparty%2Fgit.git parse-options: add precision handling for OPTION_NEGBIT Similar to 09705696f7 (parse-options: introduce precision handling for `OPTION_INTEGER`, 2025-04-17) support value variables of different sizes for OPTION_NEGBIT. Do that by requiring their "precision" to be set, casting their "value" pointer accordingly and checking whether the value fits. Signed-off-by: René Scharfe Signed-off-by: Junio C Hamano --- diff --git a/builtin/rebase.c b/builtin/rebase.c index 2e8c4ee678..e90562a3b8 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -1128,6 +1128,7 @@ int cmd_rebase(int argc, .short_name = 'n', .long_name = "no-stat", .value = &options.flags, + .precision = sizeof(options.flags), .help = N_("do not show diffstat of what changed upstream"), .flags = PARSE_OPT_NOARG, .defval = REBASE_DIFFSTAT, diff --git a/parse-options.c b/parse-options.c index b5c877d5e1..ba89dc4d09 100644 --- a/parse-options.c +++ b/parse-options.c @@ -157,11 +157,14 @@ static enum parse_opt_result do_get_value(struct parse_opt_ctx_t *p, } case OPTION_NEGBIT: + { + intmax_t value = get_int_value(opt, flags); if (unset) - *(int *)opt->value |= opt->defval; + value |= opt->defval; else - *(int *)opt->value &= ~opt->defval; - return 0; + value &= ~opt->defval; + return set_int_value(opt, flags, value); + } case OPTION_BITOP: if (unset) @@ -643,11 +646,11 @@ static void parse_options_check(const struct option *opts) switch (opts->type) { case OPTION_SET_INT: case OPTION_BIT: + case OPTION_NEGBIT: if (!signed_int_fits(opts->defval, opts->precision)) optbug(opts, "has invalid defval"); /* fallthru */ case OPTION_COUNTUP: - case OPTION_NEGBIT: case OPTION_NUMBER: case OPTION_BITOP: if ((opts->flags & PARSE_OPT_OPTARG) || diff --git a/parse-options.h b/parse-options.h index 6501ca3c27..076f88b384 100644 --- a/parse-options.h +++ b/parse-options.h @@ -250,6 +250,7 @@ struct option { .short_name = (s), \ .long_name = (l), \ .value = (v), \ + .precision = sizeof(*v), \ .help = (h), \ .flags = PARSE_OPT_NOARG, \ .defval = (b), \