diff options
Diffstat (limited to 'src/WinConsoleFile.cc')
| -rw-r--r-- | src/WinConsoleFile.cc | 21 |
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; } |
