interactive: Fix wipe_bottom_line() on MacOS.
authorAndre Noll <maan@systemlinux.org>
Tue, 7 Aug 2012 11:32:44 +0000 (13:32 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 18 Nov 2012 19:28:28 +0000 (20:28 +0100)
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

index f75e4be..7768d36 100644 (file)
@@ -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");
 }
 
 /**