changeset 1265:a344885e7c79

Fix info_message/warning/error functions to deal with limitations of vsnprintf on Windows
author Michael Pavone <pavone@retrodev.com>
date Sat, 04 Mar 2017 19:02:53 -0800
parents 555f2ac537e7
children a4fa897c99ce
files util.c
diffstat 1 files changed, 30 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/util.c	Sat Mar 04 12:00:42 2017 -0800
+++ b/util.c	Sat Mar 04 19:02:53 2017 -0800
@@ -192,11 +192,17 @@
 	va_start(args, format);
 	if (!headless) {
 		//take a guess at the final size
-		size_t size = strlen(format) * 2;
+		int32_t size = strlen(format) * 2;
 		char *buf = malloc(size);
-		size_t actual = vsnprintf(buf, size, format, args);
-		if (actual >= size) {
-			actual++;
+		int32_t actual = vsnprintf(buf, size, format, args);
+		if (actual >= size || actual < 0) {
+			if (actual < 0) {
+				//seems on windows, vsnprintf is returning -1 when the buffer is too small
+				//since we don't know the proper size, a generous multiplier will hopefully suffice
+				actual = size * 4;
+			} else {
+				actual++;
+			}
 			free(buf);
 			buf = malloc(actual);
 			va_end(args);
@@ -222,11 +228,17 @@
 		warning_printf(format, args);
 	} else {
 #endif
-		size_t size = strlen(format) * 2;
+		int32_t size = strlen(format) * 2;
 		char *buf = malloc(size);
-		size_t actual = vsnprintf(buf, size, format, args);
-		if (actual >= size) {
-			actual++;
+		int32_t actual = vsnprintf(buf, size, format, args);
+		if (actual >= size || actual < 0) {
+			if (actual < 0) {
+				//seems on windows, vsnprintf is returning -1 when the buffer is too small
+				//since we don't know the proper size, a generous multiplier will hopefully suffice
+				actual = size * 4;
+			} else {
+				actual++;
+			}
 			free(buf);
 			buf = malloc(actual);
 			va_end(args);
@@ -251,11 +263,17 @@
 		info_printf(format, args);
 	} else {
 #endif
-		size_t size = strlen(format) * 2;
+		int32_t size = strlen(format) * 2;
 		char *buf = malloc(size);
-		size_t actual = vsnprintf(buf, size, format, args);
-		if (actual >= size) {
-			actual++;
+		int32_t actual = vsnprintf(buf, size, format, args);
+		if (actual >= size || actual < 0) {
+			if (actual < 0) {
+				//seems on windows, vsnprintf is returning -1 when the buffer is too small
+				//since we don't know the proper size, a generous multiplier will hopefully suffice
+				actual = size * 4;
+			} else {
+				actual++;
+			}
 			free(buf);
 			buf = malloc(actual);
 			va_end(args);