summaryrefslogtreecommitdiff
path: root/vere/ext/nasm/stdlib/vsnprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'vere/ext/nasm/stdlib/vsnprintf.c')
-rw-r--r--vere/ext/nasm/stdlib/vsnprintf.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/vere/ext/nasm/stdlib/vsnprintf.c b/vere/ext/nasm/stdlib/vsnprintf.c
new file mode 100644
index 0000000..58de651
--- /dev/null
+++ b/vere/ext/nasm/stdlib/vsnprintf.c
@@ -0,0 +1,46 @@
+/*
+ * vsnprintf()
+ *
+ * Poor substitute for a real vsnprintf() function for systems
+ * that don't have them...
+ */
+
+#include "compiler.h"
+
+
+#include "nasmlib.h"
+#include "error.h"
+
+#if !defined(HAVE_VSNPRINTF) && !defined(HAVE__VSNPRINTF)
+
+#define BUFFER_SIZE 65536 /* Bigger than any string we might print... */
+
+static char snprintf_buffer[BUFFER_SIZE];
+
+int vsnprintf(char *str, size_t size, const char *format, va_list ap)
+{
+ int rv, bytes;
+
+ if (size > BUFFER_SIZE) {
+ nasm_panic("vsnprintf: size (%llu) > BUFFER_SIZE (%d)",
+ (unsigned long long)size, BUFFER_SIZE);
+ size = BUFFER_SIZE;
+ }
+
+ rv = vsprintf(snprintf_buffer, format, ap);
+ if (rv >= BUFFER_SIZE)
+ nasm_panic("vsnprintf buffer overflow");
+
+ if (size > 0) {
+ if ((size_t)rv < size-1)
+ bytes = rv;
+ else
+ bytes = size-1;
+ memcpy(str, snprintf_buffer, bytes);
+ str[bytes] = '\0';
+ }
+
+ return rv;
+}
+
+#endif