Skip to content

Conversation

LowLevelLore
Copy link
Contributor

Description

This PR fixes incorrect line endings in ANSI-colored output when redirected or piped on Windows terminals. A possible fix for #3138.

Problem

When using fwrite() on Windows, the CRT applies text-mode translation, converting \n to \r\n. This results in an extra carriage return (\r) being injected, especially noticeable when ANSI-colored output is redirected or piped.

Solution

On Windows, replace fwrite() with a direct call to WriteFile() using the native file handle obtained from _get_osfhandle(_fileno(...)). This bypasses the CRT entirely, ensuring output is written exactly as intended, without automatic newline translation.

Code Change

#ifdef _WIN32
    DWORD bytes_written = 0;
    HANDLE h = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(target_file_)));
    // WriteFile bypasses the extra \r injection
    WriteFile(h, color_code.data(), static_cast<DWORD>(color_code.size()), &bytes_written, nullptr);
#else
    // existing fwrite() path
#endif

CMake

Also included ansicolor_sink-inl.h explicitly in the build to avoid linking issues (when linking to static library).

@LowLevelLore
Copy link
Contributor Author

@gabime any updates / recommendations on this ?

@LowLevelLore
Copy link
Contributor Author

@gabime Any progress here ?

@gabime
Copy link
Owner

gabime commented Aug 7, 2025

The ansicolor sink was never designed for windows. Why not use the wincolor sink

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants