blob: ecca3e661ab244543806de1cf089ff56de89b26e [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#include <stdio.h>
11#include <stdlib.h>
12#include <stdarg.h>
13#include <string.h>
14
15#include "nasmlib.h"
16
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040017#define BUFFER_SIZE 65536 /* Bigger than any string we might print... */
H. Peter Anvin304b6052007-09-28 10:50:20 -070018
19static char snprintf_buffer[BUFFER_SIZE];
20
21int vsnprintf(char *str, size_t size, const char *format, va_list ap)
22{
23 int rv, bytes;
24
25 if (size > BUFFER_SIZE) {
H. Peter Anvin41087062016-03-03 14:27:34 -080026 nasm_panic(ERR_NOFILE,
Cyrill Gorcunovcdcd1f72010-04-01 01:17:00 +040027 "vsnprintf: size (%d) > BUFFER_SIZE (%d)",
28 size, BUFFER_SIZE);
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040029 size = BUFFER_SIZE;
H. Peter Anvin304b6052007-09-28 10:50:20 -070030 }
31
32 rv = vsprintf(snprintf_buffer, format, ap);
Cyrill Gorcunovcdcd1f72010-04-01 01:17:00 +040033 if (rv >= BUFFER_SIZE)
H. Peter Anvin41087062016-03-03 14:27:34 -080034 nasm_panic(ERR_NOFILE, "vsnprintf buffer overflow");
H. Peter Anvin304b6052007-09-28 10:50:20 -070035
H. Peter Anvin304b6052007-09-28 10:50:20 -070036 if (size > 0) {
Cyrill Gorcunov5d269782010-04-01 01:09:35 +040037 if ((size_t)rv < size-1)
38 bytes = rv;
39 else
40 bytes = size-1;
41 memcpy(str, snprintf_buffer, bytes);
42 str[bytes] = '\0';
H. Peter Anvin304b6052007-09-28 10:50:20 -070043 }
44
45 return rv;
46}