From 26a1f54837da021aeeb72680acb2feb4ea1e02da Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Tue, 8 Jan 2019 15:20:21 +0000 Subject: win32: implement vsnprintf(2) The Microsoft C runtime may include a defective version of vsnprintf. Implement a standards-compliant replacement. --- win32/winansi.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'win32') diff --git a/win32/winansi.c b/win32/winansi.c index 167b4b0b1..9e7d10a56 100644 --- a/win32/winansi.c +++ b/win32/winansi.c @@ -552,6 +552,27 @@ int winansi_fputs(const char *str, FILE *stream) return ansi_emulate(str, stream) == EOF ? EOF : 0; } +#if !defined(__USE_MINGW_ANSI_STDIO) || !__USE_MINGW_ANSI_STDIO +/* + * Prior to Windows 10 vsnprintf was incompatible with the C99 standard. + * Implement a replacement using _vsnprintf. + */ +int winansi_vsnprintf(char *buf, size_t size, const char *format, va_list list) +{ + size_t len; + va_list list2; + + va_copy(list2, list); + len = _vsnprintf(NULL, 0, format, list2); + if (len < 0) + return -1; + + _vsnprintf(buf, size, format, list); + buf[size-1] = '\0'; + return len; +} +#endif + int winansi_vfprintf(FILE *stream, const char *format, va_list list) { int len, rv; -- cgit v1.2.3-55-g6feb