Skip to content

Commit

Permalink
Merge branch 'na/strtoimax'
Browse files Browse the repository at this point in the history
* na/strtoimax:
  Support sizes >=2G in various config options accepting 'g' sizes.
  Compatibility: declare strtoimax() under NO_STRTOUMAX
  Add strtoimax() compatibility function.
  • Loading branch information
gitster committed Dec 5, 2011
2 parents e72c1dd + ebaa1bd commit 5d6c53b
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 13 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ all::
#
# Define NO_STRLCPY if you don't have strlcpy.
#
# Define NO_STRTOUMAX if you don't have strtoumax in the C library.
# If your compiler also does not support long long or does not have
# Define NO_STRTOUMAX if you don't have both strtoimax and strtoumax in the
# C library. If your compiler also does not support long long or does not have
# strtoull, define NO_STRTOULL.
#
# Define NO_SETENV if you don't have setenv in the C library.
Expand Down Expand Up @@ -1478,7 +1478,7 @@ ifdef NO_STRLCPY
endif
ifdef NO_STRTOUMAX
COMPAT_CFLAGS += -DNO_STRTOUMAX
COMPAT_OBJS += compat/strtoumax.o
COMPAT_OBJS += compat/strtoumax.o compat/strtoimax.o
endif
ifdef NO_STRTOULL
COMPAT_CFLAGS += -DNO_STRTOULL
Expand Down
10 changes: 10 additions & 0 deletions compat/strtoimax.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "../git-compat-util.h"

intmax_t gitstrtoimax (const char *nptr, char **endptr, int base)
{
#if defined(NO_STRTOULL)
return strtol(nptr, endptr, base);
#else
return strtoll(nptr, endptr, base);
#endif
}
41 changes: 31 additions & 10 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ static int git_parse_file(config_fn_t fn, void *data)
die("bad config file line %d in %s", cf->linenr, cf->name);
}

static int parse_unit_factor(const char *end, unsigned long *val)
static int parse_unit_factor(const char *end, uintmax_t *val)
{
if (!*end)
return 1;
Expand All @@ -356,11 +356,23 @@ static int git_parse_long(const char *value, long *ret)
{
if (value && *value) {
char *end;
long val = strtol(value, &end, 0);
unsigned long factor = 1;
intmax_t val;
uintmax_t uval;
uintmax_t factor = 1;

errno = 0;
val = strtoimax(value, &end, 0);
if (errno == ERANGE)
return 0;
if (!parse_unit_factor(end, &factor))
return 0;
*ret = val * factor;
uval = abs(val);
uval *= factor;
if ((uval > maximum_signed_value_of_type(long)) ||
(abs(val) > uval))
return 0;
val *= factor;
*ret = val;
return 1;
}
return 0;
Expand All @@ -370,9 +382,19 @@ int git_parse_ulong(const char *value, unsigned long *ret)
{
if (value && *value) {
char *end;
unsigned long val = strtoul(value, &end, 0);
uintmax_t val;
uintmax_t oldval;

errno = 0;
val = strtoumax(value, &end, 0);
if (errno == ERANGE)
return 0;
oldval = val;
if (!parse_unit_factor(end, &val))
return 0;
if ((val > maximum_unsigned_value_of_type(long)) ||
(oldval > val))
return 0;
*ret = val;
return 1;
}
Expand Down Expand Up @@ -553,7 +575,7 @@ static int git_default_core_config(const char *var, const char *value)

if (!strcmp(var, "core.packedgitwindowsize")) {
int pgsz_x2 = getpagesize() * 2;
packed_git_window_size = git_config_int(var, value);
packed_git_window_size = git_config_ulong(var, value);

/* This value must be multiple of (pagesize * 2) */
packed_git_window_size /= pgsz_x2;
Expand All @@ -564,18 +586,17 @@ static int git_default_core_config(const char *var, const char *value)
}

if (!strcmp(var, "core.bigfilethreshold")) {
long n = git_config_int(var, value);
big_file_threshold = 0 < n ? n : 0;
big_file_threshold = git_config_ulong(var, value);
return 0;
}

if (!strcmp(var, "core.packedgitlimit")) {
packed_git_limit = git_config_int(var, value);
packed_git_limit = git_config_ulong(var, value);
return 0;
}

if (!strcmp(var, "core.deltabasecachelimit")) {
delta_base_cache_limit = git_config_int(var, value);
delta_base_cache_limit = git_config_ulong(var, value);
return 0;
}

Expand Down
2 changes: 2 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,8 @@ extern size_t gitstrlcpy(char *, const char *, size_t);
#ifdef NO_STRTOUMAX
#define strtoumax gitstrtoumax
extern uintmax_t gitstrtoumax(const char *, char **, int);
#define strtoimax gitstrtoimax
extern intmax_t gitstrtoimax(const char *, char **, int);
#endif

#ifdef NO_STRTOK_R
Expand Down

0 comments on commit 5d6c53b

Please sign in to comment.