Browse Source

Handle the case when MINGW32 vsnprintf returns -1

MINGW32 vsnprintf returns -1 if output is truncated.  Increased buffer
for vsnprintf in WinConsoleFile and fmt.
Tatsuhiro Tsujikawa 13 years ago
parent
commit
73b75186c7
2 changed files with 18 additions and 4 deletions
  1. 6 2
      src/WinConsoleFile.cc
  2. 12 2
      src/fmt.cc

+ 6 - 2
src/WinConsoleFile.cc

@@ -74,12 +74,16 @@ size_t WinConsoleFile::write(const char* str)
 
 int WinConsoleFile::printf(const char* format, ...)
 {
-  char buf[1024];
+  char buf[2048];
   va_list ap;
   va_start(ap, format);
   int r = vsnprintf(buf, sizeof(buf), format, ap);
   va_end(ap);
-  if(r <= 0) {
+  if(r == -1) {
+    // MINGW32 vsnprintf returns -1 if output is truncated.
+    r = strlen(buf);
+  } else if(r < 0) {
+    // Reachable?
     return 0;
   }
   DWORD written;

+ 12 - 2
src/fmt.cc

@@ -44,10 +44,20 @@ std::string fmt(const char* fmtTemplate, ...)
 {
   va_list ap;
   va_start(ap, fmtTemplate);
-  char buf[1024];
-  if(vsnprintf(buf, sizeof(buf), fmtTemplate, ap) <= 0) {
+  char buf[2048];
+  int rv;
+  rv = vsnprintf(buf, sizeof(buf), fmtTemplate, ap);
+#ifdef __MINGW32__
+  // MINGW32 vsnprintf returns -1 if output is truncated.
+  if(rv < 0 && rv != -1) {
+    // Reachable?
     buf[0] = '\0';
   }
+#else // !__MINGW32__
+  if(rv < 0) {
+    buf[0] = '\0';
+  }
+#endif // !__MINGW32__
   va_end(ap);
   return buf;
 }