diff options
| author | René Scharfe <l.s.r@web.de> | 2025-07-09 11:46:28 +0200 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-07-09 08:40:32 -0700 |
| commit | c1e616c39b31e78acc595790bf3a9553a022a19d (patch) | |
| tree | 67d9e6bfefea0605c5d5e77e958a6e75a76e49ac /parse-options.c | |
| parent | parse-options: add precision handling for OPTION_BITOP (diff) | |
| download | git-c1e616c39b31e78acc595790bf3a9553a022a19d.tar.gz git-c1e616c39b31e78acc595790bf3a9553a022a19d.zip | |
parse-options: add precision handling for OPTION_COUNTUP
Similar to 09705696f7 (parse-options: introduce precision handling for
`OPTION_INTEGER`, 2025-04-17) support value variables of different sizes
for OPTION_COUNTUP. 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 <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'parse-options.c')
| -rw-r--r-- | parse-options.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/parse-options.c b/parse-options.c index a813511b1b..5224203ffe 100644 --- a/parse-options.c +++ b/parse-options.c @@ -177,10 +177,22 @@ static enum parse_opt_result do_get_value(struct parse_opt_ctx_t *p, } case OPTION_COUNTUP: - if (*(int *)opt->value < 0) - *(int *)opt->value = 0; - *(int *)opt->value = unset ? 0 : *(int *)opt->value + 1; - return 0; + { + size_t bits = CHAR_BIT * opt->precision; + intmax_t upper_bound = INTMAX_MAX >> (bitsizeof(intmax_t) - bits); + intmax_t value = get_int_value(opt, flags); + + if (value < 0) + value = 0; + if (unset) + value = 0; + else if (value < upper_bound) + value++; + else + return error(_("value for %s exceeds %"PRIdMAX), + optname(opt, flags), upper_bound); + return set_int_value(opt, flags, value); + } case OPTION_SET_INT: return set_int_value(opt, flags, unset ? 0 : opt->defval); @@ -651,10 +663,10 @@ static void parse_options_check(const struct option *opts) case OPTION_BIT: case OPTION_NEGBIT: case OPTION_BITOP: + case OPTION_COUNTUP: if (!signed_int_fits(opts->defval, opts->precision)) optbug(opts, "has invalid defval"); /* fallthru */ - case OPTION_COUNTUP: case OPTION_NUMBER: if ((opts->flags & PARSE_OPT_OPTARG) || !(opts->flags & PARSE_OPT_NOARG)) |
