зеркало из https://github.com/microsoft/git.git
Merge branch 'na/strtoimax'
* na/strtoimax: Support sizes >=2G in various config options accepting 'g' sizes. Compatibility: declare strtoimax() under NO_STRTOUMAX Add strtoimax() compatibility function.
This commit is contained in:
Коммит
5d6c53bb23
6
Makefile
6
Makefile
|
@ -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.
|
||||
|
@ -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
|
||||
|
|
|
@ -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
config.c
41
config.c
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче