From a8df9b14ada72409625dead81936c7b2c0fcec64 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 29 Jan 2013 13:21:27 +0100 Subject: [PATCH] msvcrt: Use temporary buffers to speed up operations on stdout and stderr. --- dlls/msvcrt/file.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 8e2a0675cc2..fc4154c856c 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -595,6 +595,29 @@ static BOOL msvcrt_alloc_buffer(MSVCRT_FILE* file) return TRUE; } +/* INTERNAL: Allocate temporary buffer for stdout and stderr */ +static BOOL add_std_buffer(MSVCRT_FILE *file) +{ + static char buffers[2][MSVCRT_BUFSIZ]; + + if((file->_file!=MSVCRT_STDOUT_FILENO && file->_file!=MSVCRT_STDERR_FILENO) + || !MSVCRT__isatty(file->_file) || file->_bufsiz) + return FALSE; + + file->_ptr = file->_base = buffers[file->_file == MSVCRT_STDOUT_FILENO ? 0 : 1]; + file->_bufsiz = file->_cnt = MSVCRT_BUFSIZ; + return TRUE; +} + +/* INTERNAL: Removes temporary buffer from stdout or stderr */ +/* Only call this function when add_std_buffer returned TRUE */ +static void remove_std_buffer(MSVCRT_FILE *file) +{ + msvcrt_flush_buffer(file); + file->_ptr = file->_base = NULL; + file->_bufsiz = file->_cnt = 0; +} + /* INTERNAL: Convert integer to base32 string (0-9a-v), 0 becomes "" */ static int msvcrt_int_to_base32(int num, char *str) { @@ -3911,6 +3934,7 @@ int CDECL MSVCRT_fputs(const char *s, MSVCRT_FILE* file) int CDECL MSVCRT_fputws(const MSVCRT_wchar_t *s, MSVCRT_FILE* file) { MSVCRT_size_t i, len = strlenW(s); + BOOL tmp_buf; int ret; MSVCRT__lock_file(file); @@ -3919,13 +3943,17 @@ int CDECL MSVCRT_fputws(const MSVCRT_wchar_t *s, MSVCRT_FILE* file) MSVCRT__unlock_file(file); return ret; } + + tmp_buf = add_std_buffer(file); for (i=0; i