# HG changeset patch # User Michael Pavone # Date 1488682973 28800 # Node ID a344885e7c7942172d1afcba0537cccb0733fcc6 # Parent 555f2ac537e733b356291cb15cdde379201ae075 Fix info_message/warning/error functions to deal with limitations of vsnprintf on Windows diff -r 555f2ac537e7 -r a344885e7c79 util.c --- 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);