eac14f8909
Winansi.c has many static variables that are accessed and modified from
the [v][f]printf / fputs functions overridden in the file. This may cause
multi threaded git commands that print to the console to produce corrupted
output or even crash.
Additionally, winansi.c doesn't override all functions that can be used to
print to the console (e.g. fwrite, write, fputc are missing), so that ANSI
escapes don't work properly for some git commands (e.g. git-grep).
Instead of doing ANSI emulation in just a few wrapped functions on top of
the IO API, let's plug into the IO system and take advantage of the thread
safety inherent to the IO system.
Redirect stdout and stderr to a pipe if they point to the console. A
background thread reads from the pipe, handles ANSI escape sequences and
UTF-8 to UTF-16 conversion, then writes to the console.
The pipe-based stdout and stderr replacements must be set to unbuffered, as
MSVCRT doesn't support line buffering and fully buffered streams are
inappropriate for console output.
Due to the byte-oriented pipe, ANSI escape sequences and multi-byte UTF-8
sequences can no longer be expected to arrive in one piece. Replace the
string-based ansi_emulate() with a simple stateful parser (this also fixes
colored diff hunk headers, which were broken as of commit
|
||
---|---|---|
.. | ||
fnmatch | ||
nedmalloc | ||
poll | ||
regex | ||
vcbuild | ||
win32 | ||
apple-common-crypto.h | ||
basename.c | ||
bswap.h | ||
fopen.c | ||
gmtime.c | ||
hstrerror.c | ||
inet_ntop.c | ||
inet_pton.c | ||
memmem.c | ||
mingw.c | ||
mingw.h | ||
mkdir.c | ||
mkdtemp.c | ||
mmap.c | ||
msvc.c | ||
msvc.h | ||
obstack.c | ||
obstack.h | ||
pread.c | ||
precompose_utf8.c | ||
precompose_utf8.h | ||
qsort.c | ||
setenv.c | ||
snprintf.c | ||
strcasestr.c | ||
strlcpy.c | ||
strtoimax.c | ||
strtoumax.c | ||
terminal.c | ||
terminal.h | ||
unsetenv.c | ||
win32.h | ||
win32mmap.c | ||
winansi.c |