aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui/tui-io.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2015-01-31 10:47:14 +0200
committerEli Zaretskii <eliz@gnu.org>2015-01-31 10:47:14 +0200
commit312809f8838911dabff84d7ad3ccf341307d2b19 (patch)
treedda7c602c749573d5382b3b87f3943683f4ac855 /gdb/tui/tui-io.c
parentb6577aab8a7e97470c5ff96000f3d0dbdb2c1ee1 (diff)
downloadgdb-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.c78
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. */