Change tui_data_item_window::content to be a unique_xmalloc_ptr

This changes tui_data_item_window::content to be a unique_xmalloc_ptr
and fixes up the fallout.  It also removes a parameter from
tui_expand_tabs, as it was only ever given one value.

This also removes some tab-handling code from
tui_data_window::display_registers_from.  Because the content can only
be set by tui_register_format, and because that calls tui_expand_tabs,
it's not possible to see a tab here.

gdb/ChangeLog
2019-08-20  Tom Tromey  <tom@tromey.com>

	* tui/tui-regs.h (struct tui_data_item_window)
	<~tui_data_item_window>: Remove.
	<content>: Now a unique_xmalloc_ptr.
	* tui/tui-regs.c (tui_register_format): Return a
	unique_xmalloc_ptr.
	(tui_get_register): Update.
	(~tui_data_item_window): Remove.
	(tui_data_window::display_registers_from, tui_display_register):
	Update.
	* tui/tui-io.h (tui_expand_tabs): Update.
	* tui/tui-io.c (tui_expand_tabs): Return a unique_xmalloc_ptr.
	Remove "col" parameter.
This commit is contained in:
Tom Tromey 2019-07-13 16:01:34 -06:00
parent 8e114aab8b
commit b9ad36868f
5 changed files with 33 additions and 36 deletions

View File

@ -1,3 +1,18 @@
2019-08-20 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (struct tui_data_item_window)
<~tui_data_item_window>: Remove.
<content>: Now a unique_xmalloc_ptr.
* tui/tui-regs.c (tui_register_format): Return a
unique_xmalloc_ptr.
(tui_get_register): Update.
(~tui_data_item_window): Remove.
(tui_data_window::display_registers_from, tui_display_register):
Update.
* tui/tui-io.h (tui_expand_tabs): Update.
* tui/tui-io.c (tui_expand_tabs): Return a unique_xmalloc_ptr.
Remove "col" parameter.
2019-08-20 Tom Tromey <tom@tromey.com> 2019-08-20 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (struct tui_data_item_window) <value>: Remove * tui/tui-regs.h (struct tui_data_item_window) <value>: Remove

View File

@ -1050,19 +1050,17 @@ tui_getc (FILE *fp)
return ch; return ch;
} }
/* Utility function to expand TABs in a STRING into spaces. STRING /* See tui-io.h. */
will be displayed starting at column COL, and is assumed to include
no newlines. The returned expanded string is malloc'ed. */
char * gdb::unique_xmalloc_ptr<char>
tui_expand_tabs (const char *string, int col) tui_expand_tabs (const char *string)
{ {
int n_adjust, ncol; int n_adjust, ncol;
const char *s; const char *s;
char *ret, *q; char *ret, *q;
/* 1. How many additional characters do we need? */ /* 1. How many additional characters do we need? */
for (ncol = col, n_adjust = 0, s = string; s; ) for (ncol = 0, n_adjust = 0, s = string; s; )
{ {
s = strpbrk (s, "\t"); s = strpbrk (s, "\t");
if (s) if (s)
@ -1079,7 +1077,7 @@ tui_expand_tabs (const char *string, int col)
ret = q = (char *) xmalloc (strlen (string) + n_adjust + 1); ret = q = (char *) xmalloc (strlen (string) + n_adjust + 1);
/* 2. Copy the original string while replacing TABs with spaces. */ /* 2. Copy the original string while replacing TABs with spaces. */
for (ncol = col, s = string; s; ) for (ncol = 0, s = string; s; )
{ {
const char *s1 = strpbrk (s, "\t"); const char *s1 = strpbrk (s, "\t");
if (s1) if (s1)
@ -1101,5 +1099,5 @@ tui_expand_tabs (const char *string, int col)
s = s1; s = s1;
} }
return ret; return gdb::unique_xmalloc_ptr<char> (ret);
} }

View File

@ -46,7 +46,7 @@ extern void tui_initialize_io (void);
extern void tui_redisplay_readline (void); extern void tui_redisplay_readline (void);
/* Expand TABs into spaces. */ /* Expand TABs into spaces. */
extern char *tui_expand_tabs (const char *, int); extern gdb::unique_xmalloc_ptr<char> tui_expand_tabs (const char *);
/* Enter/leave reverse video mode. */ /* Enter/leave reverse video mode. */
extern void tui_set_reverse_mode (WINDOW *w, bool reverse); extern void tui_set_reverse_mode (WINDOW *w, bool reverse);

View File

@ -52,7 +52,7 @@ static void tui_show_register_group (tui_data_window *win_info,
/* Get the register from the frame and return a printable /* Get the register from the frame and return a printable
representation of it. */ representation of it. */
static char * static gdb::unique_xmalloc_ptr<char>
tui_register_format (struct frame_info *frame, int regnum) tui_register_format (struct frame_info *frame, int regnum)
{ {
struct gdbarch *gdbarch = get_frame_arch (frame); struct gdbarch *gdbarch = get_frame_arch (frame);
@ -72,7 +72,7 @@ tui_register_format (struct frame_info *frame, int regnum)
str.resize (str.size () - 1); str.resize (str.size () - 1);
/* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */ /* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */
return tui_expand_tabs (str.c_str (), 0); return tui_expand_tabs (str.c_str ());
} }
/* Get the register value from the given frame and format it for the /* Get the register value from the given frame and format it for the
@ -87,27 +87,19 @@ tui_get_register (struct frame_info *frame,
*changedp = false; *changedp = false;
if (target_has_registers) if (target_has_registers)
{ {
char *prev_content = data->content; gdb::unique_xmalloc_ptr<char> new_content
= tui_register_format (frame, regnum);
data->content = tui_register_format (frame, regnum);
if (changedp != NULL if (changedp != NULL
&& strcmp (prev_content, data->content) != 0) && strcmp (data->content.get (), new_content.get ()) != 0)
*changedp = true; *changedp = true;
xfree (prev_content); data->content = std::move (new_content);
} }
} }
/* See tui-regs.h. */ /* See tui-regs.h. */
tui_data_item_window::~tui_data_item_window ()
{
xfree (content);
}
/* See tui-regs.h. */
int int
tui_data_window::last_regs_line_no () const tui_data_window::last_regs_line_no () const
{ {
@ -309,19 +301,13 @@ tui_data_window::display_registers_from (int start_element_no)
int max_len = 0; int max_len = 0;
for (auto &&data_item_win : regs_content) for (auto &&data_item_win : regs_content)
{ {
char *p; const char *p;
int len; int len;
len = 0; len = 0;
p = data_item_win->content; p = data_item_win->content.get ();
if (p != 0) if (p != 0)
while (*p) len = strlen (p);
{
if (*p++ == '\t')
len = 8 * ((len / 8) + 1);
else
len++;
}
if (len > max_len) if (len > max_len)
max_len = len; max_len = len;
@ -641,7 +627,7 @@ tui_display_register (struct tui_data_item_window *data)
waddch (data->handle, ' '); waddch (data->handle, ' ');
wmove (data->handle, 0, 0); wmove (data->handle, 0, 0);
if (data->content) if (data->content)
waddstr (data->handle, data->content); waddstr (data->handle, data->content.get ());
if (data->highlight) if (data->highlight)
/* We ignore the return value, casting it to void in order to avoid /* We ignore the return value, casting it to void in order to avoid

View File

@ -33,13 +33,11 @@ struct tui_data_item_window : public tui_gen_win_info
{ {
} }
~tui_data_item_window () override;
const char *name = nullptr; const char *name = nullptr;
/* The register number, or data display number. */ /* The register number, or data display number. */
int item_no = -1; int item_no = -1;
bool highlight = false; bool highlight = false;
char *content = nullptr; gdb::unique_xmalloc_ptr<char> content;
}; };
/* The TUI registers window. */ /* The TUI registers window. */