Staging
v0.8.1
v0.8.1
swh:1:snp:635f4099902912592851108bcac178ff574f7c5f
Tip revision: f7adf2f473966ef33f6079ceb7115cb6cde3b521 authored by cvs2svn on 08 September 2001, 21:38:26 UTC
This commit was manufactured by cvs2svn to create tag 'r22a3'.
This commit was manufactured by cvs2svn to create tag 'r22a3'.
Tip revision: f7adf2f
mysnprintf.c
#include "Python.h"
/* snprintf() emulation for platforms which don't have it (yet).
Return value
The number of characters printed (not including the trailing
`\0' used to end output to strings) or a negative number in
case of an error.
PyOS_snprintf and PyOS_vsnprintf do not write more than size
bytes (including the trailing '\0').
If the output would have been truncated, they return the number
of characters (excluding the trailing '\0') which would have
been written to the final string if enough space had been
available. This is inline with the C99 standard.
*/
#include <ctype.h>
#ifndef HAVE_SNPRINTF
static
int myvsnprintf(char *str, size_t size, const char *format, va_list va)
{
char *buffer = PyMem_Malloc(size + 512);
int len;
if (buffer == NULL)
return -1;
len = vsprintf(buffer, format, va);
if (len < 0) {
PyMem_Free(buffer);
return len;
}
len++;
assert(len >= 0);
if ((size_t)len > size + 512)
Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");
if ((size_t)len > size) {
PyMem_Free(buffer);
return len - 1;
}
memcpy(str, buffer, len);
PyMem_Free(buffer);
return len - 1;
}
int PyOS_snprintf(char *str, size_t size, const char *format, ...)
{
int rc;
va_list va;
va_start(va, format);
rc = myvsnprintf(str, size, format, va);
va_end(va);
return rc;
}
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
{
return myvsnprintf(str, size, format, va);
}
#else
/* Make sure that a C API is included in the lib */
#ifdef PyOS_snprintf
# undef PyOS_snprintf
#endif
int PyOS_snprintf(char *str, size_t size, const char *format, ...)
{
int rc;
va_list va;
va_start(va, format);
rc = vsnprintf(str, size, format, va);
va_end(va);
return rc;
}
#ifdef PyOS_vsnprintf
# undef PyOS_vsnprintf
#endif
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
{
return vsnprintf(str, size, format, va);
}
#endif