summaryrefslogtreecommitdiff
path: root/src/WinConsoleFile.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/WinConsoleFile.cc')
-rw-r--r--src/WinConsoleFile.cc21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/WinConsoleFile.cc b/src/WinConsoleFile.cc
index 0938d89d..157a2e36 100644
--- a/src/WinConsoleFile.cc
+++ b/src/WinConsoleFile.cc
@@ -72,18 +72,16 @@ size_t WinConsoleFile::write(const char* str)
return written;
}
-int WinConsoleFile::printf(const char* format, ...)
+int WinConsoleFile::vprintf(const char* format, va_list va)
{
- char buf[2048];
- va_list ap;
- va_start(ap, format);
- int r = vsnprintf(buf, sizeof(buf), format, ap);
- va_end(ap);
- if(r == -1) {
- // MINGW32 vsnprintf returns -1 if output is truncated.
- r = strlen(buf);
- } else if(r < 0) {
- // Reachable?
+ ssize_t r = _vscprintf(format, va);
+ if (r <= 0) {
+ return 0;
+ }
+ char *buf = new char[++r];
+ r = vsnprintf(buf, r, format, va);
+ if (r < 0) {
+ delete [] buf;
return 0;
}
DWORD written;
@@ -95,6 +93,7 @@ int WinConsoleFile::printf(const char* format, ...)
WriteFile(GetStdHandle(stdHandle_),
buf, r, &written, 0);
}
+ delete [] buf;
return written;
}