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.
This commit is contained in:
Eli Zaretskii 2015-01-31 10:47:14 +02:00
parent b6577aab8a
commit 312809f883
4 changed files with 94 additions and 2 deletions

View File

@ -1,3 +1,13 @@
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.
2015-01-30 Doug Evans <dje@google.com>
* NEWS: "info source" command now display producer string if present.

View File

@ -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. */

View File

@ -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;

View File

@ -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;