aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main.c19
-rw-r--r--tests/testsuite.at4
2 files changed, 23 insertions, 0 deletions
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 <glib/gprintf.h>
#include <glib/gstdio.h>
+#ifdef G_OS_WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
#ifdef HAVE_SYS_CAPSICUM_H
#include <sys/capsicum.h>
#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");
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 3a2fc2e..3728723 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -232,6 +232,10 @@ AT_DATA([expout], [[1058
1058
]])
AT_CHECK([[printf "ТЕСТ" | $SCITECO -qe '<^TUa Qa:; Qa=>']], 0, expout, ignore)
+# Writing to stdout should not perform any unexpected EOL translations.
+# When using --stdin/--stdout, we can rely on the builtin EOL normalization.
+TE_CHECK([[10^T]], 0, stdout, ignore)
+TE_CHECK([[16,0ED @EB/stdout/ Z-1"N(0/0)' 0A-10"N(0/0)']], 0, ignore, ignore)
AT_CLEANUP
AT_SETUP([Convert between line and glyph positions])