Browse Source

Merge branch 'mr/compat-snprintf'

* mr/compat-snprintf:
  Add compat/snprintf.c for systems that return bogus
maint
Junio C Hamano 17 years ago
parent
commit
6e79a88585
  1. 8
      Makefile
  2. 40
      compat/snprintf.c
  3. 1
      config.mak.in
  4. 34
      configure.ac
  5. 9
      git-compat-util.h

8
Makefile

@ -3,6 +3,10 @@ all:: @@ -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 @@ -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

40
compat/snprintf.c

@ -0,0 +1,40 @@ @@ -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;
}

1
config.mak.in

@ -46,3 +46,4 @@ NO_MKDTEMP=@NO_MKDTEMP@ @@ -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

@ -326,6 +326,40 @@ else @@ -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.

9
git-compat-util.h

@ -209,6 +209,15 @@ void *gitmemmem(const void *haystack, size_t haystacklen, @@ -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

Loading…
Cancel
Save