diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 58f5a7b3b7..51f17145b1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2015-01-31 Eli Zaretskii + + * 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. + 2015-01-30 Doug Evans * NEWS: "info source" command now display producer string if present. diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index 7e8a3bc0d2..19e9485ea3 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. */ diff --git a/gdb/tui/tui-io.h b/gdb/tui/tui-io.h index 8f96cfe9e5..3154eeef98 100644 --- a/gdb/tui/tui-io.h +++ b/gdb/tui/tui-io.h @@ -41,6 +41,9 @@ extern int tui_getc (FILE *); changed the edited text. */ extern void tui_redisplay_readline (void); +/* Expand TABs into spaces. */ +extern char *tui_expand_tabs (const char *, int); + extern struct ui_out *tui_out; extern struct ui_out *tui_old_uiout; diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index b523e90afb..961491f112 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -36,6 +36,7 @@ #include "tui/tui-wingeneral.h" #include "tui/tui-file.h" #include "tui/tui-regs.h" +#include "tui/tui-io.h" #include "reggroups.h" #include "valprint.h" @@ -693,7 +694,9 @@ tui_register_format (struct frame_info *frame, int regnum) if (s && s[1] == 0) *s = 0; - ret = xstrdup (p); + /* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */ + ret = tui_expand_tabs (p, 0); + do_cleanups (cleanups); return ret;