diff options
Diffstat (limited to 'Python/mysnprintf.c')
-rw-r--r-- | Python/mysnprintf.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/Python/mysnprintf.c b/Python/mysnprintf.c new file mode 100644 index 0000000000..e6c3fcedc6 --- /dev/null +++ b/Python/mysnprintf.c @@ -0,0 +1,96 @@ + +#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++; + if (len > size + 512) + Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf"); + if (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 + |