nasm/stdlib/vsnprintf.c
H. Peter Anvin 3ef4f00d5a lib: split library into stdlib and nasmlib; header handling fixes
Split lib/ into nasmlib/ (for nasm-specific functions) and stdlib/
(for replacements for C library functions which may be missing.)

Rename the ersatz inttypes.h to nasmint.h so we can use a simple test
in compiler.h instead of dealing with include path magic.

Remove tests in configure.in for ancient missing functions (which will
break the build anyway.)

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
2016-03-08 12:20:02 -08:00

50 lines
1 KiB
C

/*
* vsnprintf()
*
* Poor substitute for a real vsnprintf() function for systems
* that don't have them...
*/
#include "compiler.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include "nasmlib.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(ERR_NOFILE,
"vsnprintf: size (%d) > BUFFER_SIZE (%d)",
size, BUFFER_SIZE);
size = BUFFER_SIZE;
}
rv = vsprintf(snprintf_buffer, format, ap);
if (rv >= BUFFER_SIZE)
nasm_panic(ERR_NOFILE, "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