From acae72517bc892911bf9b0f261ef41356e7e2c44 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Sat, 9 Aug 2025 19:45:56 +0300 Subject: Win32: avoid any automatic LF to CRLF conversions when writing to stdout * At least the MSVCRT does this by default, i.e. the translation mode of stdout is not _O_BINARY. * This broke piping through SciTECO with --stdin --stdout, as this relies on SciTECO's builtin EOL normalization. Instead, you would get DOS linebreaks on output even if the source stream contains only UNIX linebreaks. * It would also break binary filters. * It seems to be safe to print only LF also for regular stdio (help and error messages), so I simply disaply the stdout (and stdin and stderr) EOL translation globally. * Also fixes Troff warnings due to the .in preprocessor writing output with DOS linebreaks. * Added a test case. All future platforms shouldn't perform any unexpected EOL translations on output. --- src/main.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src') diff --git a/src/main.c b/src/main.c index 3ad4333..a4ee7bd 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,11 @@ #include #include +#ifdef G_OS_WIN32 +#include +#include +#endif + #ifdef HAVE_SYS_CAPSICUM_H #include #endif @@ -362,6 +367,20 @@ main(int argc, char **argv) g_autoptr(GError) error = NULL; teco_int_t ret = EXIT_SUCCESS; +#ifdef G_OS_WIN32 + /* + * Windows might by default perform EOL translations, especially + * when writing to stdout, i.e. translate LF to CRLF. + * This would break at the very least --stdout, where you are + * expected to get the linebreaks configured on the current buffer via EL. + * It would also break binary filters on Windows. + * Since printing LF to the console is safe nowadays, we just do that + * globally. + */ + for (gint fd = 0; fd <= 2; fd++) + _setmode(fd, _O_BINARY); +#endif + #ifdef DEBUG_PAUSE /* Windows debugging hack (see above) */ system("pause"); -- cgit v1.2.3