diff options
Diffstat (limited to 'gdb/tui/tui-io.c')
-rw-r--r-- | gdb/tui/tui-io.c | 75 |
1 files changed, 63 insertions, 12 deletions
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index 7698d79..1a2764e 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -435,6 +435,69 @@ tui_write (const char *buf, size_t length) tui_puts (copy.c_str ()); } +/* Print a string in the curses command window. The output is + buffered. It is up to the caller to refresh the screen if + necessary. */ + +void +tui_puts (const char *string, WINDOW *w) +{ + if (w == nullptr) + w = TUI_CMD_WIN->handle.get (); + + while (true) + { + const char *next = strpbrk (string, "\n\1\2\033\t"); + + /* Print the plain text prefix. */ + size_t n_chars = next == nullptr ? strlen (string) : next - string; + if (n_chars > 0) + waddnstr (w, string, n_chars); + + /* We finished. */ + if (next == nullptr) + break; + + char c = *next; + switch (c) + { + case '\1': + case '\2': + /* Ignore these, they are readline escape-marking + sequences. */ + ++next; + break; + + case '\n': + case '\t': + do_tui_putc (w, c); + ++next; + break; + + case '\033': + { + size_t bytes_read = apply_ansi_escape (w, next); + if (bytes_read > 0) + next += bytes_read; + else + { + /* Just drop the escape. */ + ++next; + } + } + break; + + default: + gdb_assert_not_reached ("missing case in tui_puts"); + } + + string = next; + } + + if (TUI_CMD_WIN != nullptr && w == TUI_CMD_WIN->handle.get ()) + update_cmdwin_start_line (); +} + static void tui_puts_internal (WINDOW *w, const char *string, int *height) { @@ -480,18 +543,6 @@ tui_puts_internal (WINDOW *w, const char *string, int *height) wrefresh (w); } -/* Print a string in the curses command window. The output is - buffered. It is up to the caller to refresh the screen if - necessary. */ - -void -tui_puts (const char *string, WINDOW *w) -{ - if (w == nullptr) - w = TUI_CMD_WIN->handle.get (); - tui_puts_internal (w, string, nullptr); -} - /* Readline callback. Redisplay the command line with its prompt after readline has changed the edited text. */ |