summaryrefslogtreecommitdiff
path: root/Python/mysnprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/mysnprintf.c')
-rw-r--r--Python/mysnprintf.c96
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
+