From be1074b491b51e3fd4a413f530517e3ff847b022 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 7 Aug 2012 13:32:44 +0200 Subject: [PATCH] interactive: Fix wipe_bottom_line() on MacOS. Once readline has been initialized, writing more than 68 characters in one go to stderr using stdio causes interesting effects on Mac OS. Specifically, the terminal is completely messed up. To increase the anticipated weirdness level, writing the same string in smaller chunks just works fine. This patch adds such code to interactive.c. --- interactive.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/interactive.c b/interactive.c index f75e4be5..7768d36b 100644 --- a/interactive.c +++ b/interactive.c @@ -187,7 +187,26 @@ void i9e_attach_to_stdout(struct btr_node *producer) static void wipe_bottom_line(void) { - fprintf(i9ep->stderr_stream, "\r%s\r", i9ep->empty_line); + char x[] = " "; + int n = i9ep->num_columns; + + /* + * For reasons beyond my understanding, writing more than 68 characters + * here causes MacOS to mess up the terminal. Writing a line of spaces + * in smaller chunks works fine though. Weird. + */ + fprintf(i9ep->stderr_stream, "\r"); + while (n > 0) { + if (n >= sizeof(x)) { + fprintf(i9ep->stderr_stream, "%s", x); + n -= sizeof(x); + continue; + } + x[n] = '\0'; + fprintf(i9ep->stderr_stream, "%s", x); + break; + } + fprintf(i9ep->stderr_stream, "\r"); } /** -- 2.39.5