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 +  | 
