diff options
author | Eli Zaretskii <eliz@gnu.org> | 2015-01-31 10:47:14 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2015-01-31 10:47:14 +0200 |
commit | 312809f8838911dabff84d7ad3ccf341307d2b19 (patch) | |
tree | dda7c602c749573d5382b3b87f3943683f4ac855 /gdb/tui/tui-io.c | |
parent | b6577aab8a7e97470c5ff96000f3d0dbdb2c1ee1 (diff) | |
download | gdb-312809f8838911dabff84d7ad3ccf341307d2b19.zip gdb-312809f8838911dabff84d7ad3ccf341307d2b19.tar.gz gdb-312809f8838911dabff84d7ad3ccf341307d2b19.tar.bz2 |
Make sure TABs are expanded in TUI windows on MS-Windows.
gdb/
2015-01-31 Eli Zaretskii <eliz@gnu.org>
* tui/tui-io.c (tui_expand_tabs): New function.
(tui_puts, tui_redisplay_readline): Expand TABs into the
appropriate number of spaces.
* tui/tui-regs.c: Include tui-io.h.
(tui_register_format): Call tui_expand_tabs to expand TABs into
the appropriate number of spaces.
* tui/tui-io.h: Add prototype for tui_expand_tabs.
Diffstat (limited to 'gdb/tui/tui-io.c')
-rw-r--r-- | gdb/tui/tui-io.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index 7e8a3bc..19e9485 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -178,7 +178,20 @@ tui_puts (const char *string) else if (tui_skip_line != 1) { tui_skip_line = -1; - waddch (w, c); + /* Expand TABs, since ncurses on MS-Windows doesn't. */ + if (c == '\t') + { + int line, col; + + getyx (w, line, col); + do + { + waddch (w, ' '); + col++; + } while ((col % 8) != 0); + } + else + waddch (w, c); } else if (c == '\n') tui_skip_line = -1; @@ -256,6 +269,16 @@ tui_redisplay_readline (void) waddch (w, '^'); waddch (w, CTRL_CHAR (c) ? UNCTRL (c) : '?'); } + else if (c == '\t') + { + /* Expand TABs, since ncurses on MS-Windows doesn't. */ + getyx (w, line, col); + do + { + waddch (w, ' '); + col++; + } while ((col % 8) != 0); + } else { waddch (w, c); @@ -724,6 +747,59 @@ tui_getc (FILE *fp) return ch; } +/* Utility function to expand TABs in a STRING into spaces. STRING + will be displayed starting at column COL, and is assumed to include + no newlines. The returned expanded string is malloc'ed. */ + +char * +tui_expand_tabs (const char *string, int col) +{ + int n_adjust; + const char *s; + char *ret, *q; + + /* 1. How many additional characters do we need? */ + for (n_adjust = 0, s = string; s; ) + { + s = strpbrk (s, "\t"); + if (s) + { + col += (s - string) + n_adjust; + /* Adjustment for the next tab stop, minus one for the TAB + we replace with spaces. */ + n_adjust += 8 - (col % 8) - 1; + s++; + } + } + + /* Allocate the copy. */ + ret = q = xmalloc (strlen (string) + n_adjust + 1); + + /* 2. Copy the original string while replacing TABs with spaces. */ + for (s = string; s; ) + { + char *s1 = strpbrk (s, "\t"); + if (s1) + { + if (s1 > s) + { + strncpy (q, s, s1 - s); + q += s1 - s; + col += s1 - s; + } + do { + *q++ = ' '; + col++; + } while ((col % 8) != 0); + s1++; + } + else + strcpy (q, s); + s = s1; + } + + return ret; +} /* Cleanup when a resize has occured. Returns the character that must be processed. */ |