зеркало из https://github.com/microsoft/git.git
Merge branch 'mr/compat-snprintf'
* mr/compat-snprintf: Add compat/snprintf.c for systems that return bogus
This commit is contained in:
Коммит
6e79a88585
8
Makefile
8
Makefile
|
@ -3,6 +3,10 @@ all::
|
|||
|
||||
# Define V=1 to have a more verbose compile.
|
||||
#
|
||||
# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
|
||||
# or vsnprintf() return -1 instead of number of characters which would
|
||||
# have been written to the final string if enough space had been available.
|
||||
#
|
||||
# Define FREAD_READS_DIRECTORIES if your are on a system which succeeds
|
||||
# when attempting to read from an fopen'ed directory.
|
||||
#
|
||||
|
@ -630,6 +634,10 @@ endif
|
|||
ifdef NO_C99_FORMAT
|
||||
BASIC_CFLAGS += -DNO_C99_FORMAT
|
||||
endif
|
||||
ifdef SNPRINTF_RETURNS_BOGUS
|
||||
COMPAT_CFLAGS += -DSNPRINTF_RETURNS_BOGUS
|
||||
COMPAT_OBJS += compat/snprintf.o
|
||||
endif
|
||||
ifdef FREAD_READS_DIRECTORIES
|
||||
COMPAT_CFLAGS += -DFREAD_READS_DIRECTORIES
|
||||
COMPAT_OBJS += compat/fopen.o
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
#include "../git-compat-util.h"
|
||||
|
||||
#undef vsnprintf
|
||||
int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
|
||||
{
|
||||
char *s;
|
||||
int ret;
|
||||
|
||||
ret = vsnprintf(str, maxsize, format, ap);
|
||||
if (ret != -1)
|
||||
return ret;
|
||||
|
||||
s = NULL;
|
||||
if (maxsize < 128)
|
||||
maxsize = 128;
|
||||
|
||||
while (ret == -1) {
|
||||
maxsize *= 4;
|
||||
str = realloc(s, maxsize);
|
||||
if (! str)
|
||||
break;
|
||||
s = str;
|
||||
ret = vsnprintf(str, maxsize, format, ap);
|
||||
}
|
||||
free(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int git_snprintf(char *str, size_t maxsize, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int ret;
|
||||
|
||||
va_start(ap, format);
|
||||
ret = git_vsnprintf(str, maxsize, format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -46,3 +46,4 @@ NO_MKDTEMP=@NO_MKDTEMP@
|
|||
NO_ICONV=@NO_ICONV@
|
||||
OLD_ICONV=@OLD_ICONV@
|
||||
NO_DEFLATE_BOUND=@NO_DEFLATE_BOUND@
|
||||
SNPRINTF_RETURNS_BOGUS=@SNPRINTF_RETURNS_BOGUS@
|
||||
|
|
34
configure.ac
34
configure.ac
|
@ -326,6 +326,40 @@ else
|
|||
NO_C99_FORMAT=
|
||||
fi
|
||||
AC_SUBST(NO_C99_FORMAT)
|
||||
#
|
||||
# Define SNPRINTF_RETURNS_BOGUS if your are on a system which snprintf()
|
||||
# or vsnprintf() return -1 instead of number of characters which would
|
||||
# have been written to the final string if enough space had been available.
|
||||
AC_CACHE_CHECK([whether snprintf() and/or vsnprintf() return bogus value],
|
||||
[ac_cv_snprintf_returns_bogus],
|
||||
[
|
||||
AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
|
||||
#include "stdarg.h"
|
||||
|
||||
int test_vsnprintf(char *str, size_t maxsize, const char *format, ...)
|
||||
{
|
||||
int ret;
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
ret = vsnprintf(str, maxsize, format, ap);
|
||||
va_end(ap);
|
||||
return ret;
|
||||
}],
|
||||
[[char buf[6];
|
||||
if (test_vsnprintf(buf, 3, "%s", "12345") != 5
|
||||
|| strcmp(buf, "12")) return 1;
|
||||
if (snprintf(buf, 3, "%s", "12345") != 5
|
||||
|| strcmp(buf, "12")) return 1]])],
|
||||
[ac_cv_snprintf_returns_bogus=no],
|
||||
[ac_cv_snprintf_returns_bogus=yes])
|
||||
])
|
||||
if test $ac_cv_snprintf_returns_bogus = yes; then
|
||||
SNPRINTF_RETURNS_BOGUS=UnfortunatelyYes
|
||||
else
|
||||
SNPRINTF_RETURNS_BOGUS=
|
||||
fi
|
||||
AC_SUBST(SNPRINTF_RETURNS_BOGUS)
|
||||
|
||||
|
||||
## Checks for library functions.
|
||||
|
|
|
@ -209,6 +209,15 @@ void *gitmemmem(const void *haystack, size_t haystacklen,
|
|||
extern FILE *git_fopen(const char*, const char*);
|
||||
#endif
|
||||
|
||||
#ifdef SNPRINTF_RETURNS_BOGUS
|
||||
#define snprintf git_snprintf
|
||||
extern int git_snprintf(char *str, size_t maxsize,
|
||||
const char *format, ...);
|
||||
#define vsnprintf git_vsnprintf
|
||||
extern int git_vsnprintf(char *str, size_t maxsize,
|
||||
const char *format, va_list ap);
|
||||
#endif
|
||||
|
||||
#ifdef __GLIBC_PREREQ
|
||||
#if __GLIBC_PREREQ(2, 1)
|
||||
#define HAVE_STRCHRNUL
|
||||
|
|
Загрузка…
Ссылка в новой задаче