diff --git a/platform/windows/windows_terminal_logger.cpp b/platform/windows/windows_terminal_logger.cpp index 6fc33afe996..6c54faa13af 100644 --- a/platform/windows/windows_terminal_logger.cpp +++ b/platform/windows/windows_terminal_logger.cpp @@ -42,20 +42,30 @@ void WindowsTerminalLogger::logv(const char *p_format, va_list p_list, bool p_er return; } - const unsigned int BUFFER_SIZE = 16384; - char buf[BUFFER_SIZE + 1]; // +1 for the terminating character - int len = vsnprintf(buf, BUFFER_SIZE, p_format, p_list); - if (len <= 0) { + const int static_buffer_size = 1024; + char static_buf[static_buffer_size]; + char *buf = static_buf; + va_list list_copy; + va_copy(list_copy, p_list); + int len = vsnprintf(buf, static_buffer_size, p_format, p_list); + if (len >= static_buffer_size) { + buf = (char *)memalloc(len + 1); + len = vsnprintf(buf, len + 1, p_format, list_copy); + } + va_end(list_copy); + + String str_buf = String::utf8(buf, len).replace("\r\n", "\n").replace("\n", "\r\n"); + if (len >= static_buffer_size) { + memfree(buf); + } + CharString cstr_buf = str_buf.utf8(); + if (cstr_buf.length() == 0) { return; } - if ((unsigned int)len >= BUFFER_SIZE) { - len = BUFFER_SIZE; // Output is too big, will be truncated - } - buf[len] = 0; DWORD written = 0; HANDLE h = p_err ? GetStdHandle(STD_ERROR_HANDLE) : GetStdHandle(STD_OUTPUT_HANDLE); - WriteFile(h, &buf[0], len, &written, nullptr); + WriteFile(h, cstr_buf.ptr(), cstr_buf.length(), &written, nullptr); #ifdef DEBUG_ENABLED FlushFileBuffers(h);