blob: 58de6515d1222254a1c757595a4c1e04229692e8 [file] [log] [blame]
H. Peter Anvin304b6052007-09-28 10:50:20 -07001/*
2 * vsnprintf()
3 *
4 * Poor substitute for a real vsnprintf() function for systems
5 * that don't have them...
6 */
7
H. Peter Anvinfe501952007-10-02 21:53:51 -07008#include "compiler.h"
9
H. Peter Anvin304b6052007-09-28 10:50:20 -070010
11#include "nasmlib.h"
H. Peter Anvinb20bc732017-03-07 19:23:03 -080012#include "error.h"
H. Peter Anvin304b6052007-09-28 10:50:20 -070013
H. Peter Anvincc147f72016-03-08 02:06:39 -080014#if !defined(HAVE_VSNPRINTF) && !defined(HAVE__VSNPRINTF)
15
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040016#define BUFFER_SIZE 65536 /* Bigger than any string we might print... */
H. Peter Anvin304b6052007-09-28 10:50:20 -070017
18static char snprintf_buffer[BUFFER_SIZE];
19
20int vsnprintf(char *str, size_t size, const char *format, va_list ap)
21{
22 int rv, bytes;
23
24 if (size > BUFFER_SIZE) {
H. Peter Anvin (Intel)2850da72020-07-09 17:44:21 -070025 nasm_panic("vsnprintf: size (%llu) > BUFFER_SIZE (%d)",
26 (unsigned long long)size, BUFFER_SIZE);
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040027 size = BUFFER_SIZE;
H. Peter Anvin304b6052007-09-28 10:50:20 -070028 }
29
30 rv = vsprintf(snprintf_buffer, format, ap);
Cyrill Gorcunovcdcd1f72010-04-01 01:17:00 +040031 if (rv >= BUFFER_SIZE)
H. Peter Anvinc5136902018-06-15 18:20:17 -070032 nasm_panic("vsnprintf buffer overflow");
H. Peter Anvin304b6052007-09-28 10:50:20 -070033
H. Peter Anvin304b6052007-09-28 10:50:20 -070034 if (size > 0) {
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040035 if ((size_t)rv < size-1)
36 bytes = rv;
37 else
38 bytes = size-1;
39 memcpy(str, snprintf_buffer, bytes);
40 str[bytes] = '\0';
H. Peter Anvin304b6052007-09-28 10:50:20 -070041 }
42
43 return rv;
44}
H. Peter Anvincc147f72016-03-08 02:06:39 -080045
46#endif