2008-03-05 16:46:13 +01:00
|
|
|
#include "../git-compat-util.h"
|
|
|
|
|
2007-12-01 21:24:59 +01:00
|
|
|
/*
|
|
|
|
* The size parameter specifies the available space, i.e. includes
|
|
|
|
* the trailing NUL byte; but Windows's vsnprintf expects the
|
2009-08-22 00:13:21 +02:00
|
|
|
* number of characters to write, and does not necessarily write the
|
|
|
|
* trailing NUL.
|
2007-12-01 21:24:59 +01:00
|
|
|
*/
|
|
|
|
#ifndef SNPRINTF_SIZE_CORR
|
2009-05-31 18:15:15 +02:00
|
|
|
#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ < 4
|
|
|
|
#define SNPRINTF_SIZE_CORR 1
|
|
|
|
#else
|
2007-12-01 21:24:59 +01:00
|
|
|
#define SNPRINTF_SIZE_CORR 0
|
|
|
|
#endif
|
2009-05-31 18:15:15 +02:00
|
|
|
#endif
|
2007-12-01 21:24:59 +01:00
|
|
|
|
2008-03-05 16:46:13 +01:00
|
|
|
#undef vsnprintf
|
|
|
|
int git_vsnprintf(char *str, size_t maxsize, const char *format, va_list ap)
|
|
|
|
{
|
|
|
|
char *s;
|
2007-12-01 21:24:59 +01:00
|
|
|
int ret = -1;
|
2008-03-05 16:46:13 +01:00
|
|
|
|
2007-12-01 21:24:59 +01:00
|
|
|
if (maxsize > 0) {
|
|
|
|
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
2008-08-21 03:53:50 +02:00
|
|
|
if (ret == maxsize-1)
|
|
|
|
ret = -1;
|
2007-12-01 21:24:59 +01:00
|
|
|
/* Windows does not NUL-terminate if result fills buffer */
|
|
|
|
str[maxsize-1] = 0;
|
|
|
|
}
|
2008-03-05 16:46:13 +01:00
|
|
|
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;
|
2007-12-01 21:24:59 +01:00
|
|
|
ret = vsnprintf(str, maxsize-SNPRINTF_SIZE_CORR, format, ap);
|
2008-08-21 03:53:50 +02:00
|
|
|
if (ret == maxsize-1)
|
|
|
|
ret = -1;
|
2008-03-05 16:46:13 +01:00
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|