From 7a02bab704afdc2c46e056da166eaaa025ff4b03 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 1 Jul 2020 21:21:12 -0600 Subject: [PATCH] Remove tui_expand_tabs tui_expand_tabs only has a single caller. This patch removes this function, in favor of a tab-expanding variant of string_file. This simplifies the code somewhat. gdb/ChangeLog 2020-07-01 Tom Tromey * tui/tui-regs.h (struct tui_data_item_window) : Now a std::string. * tui/tui-regs.c (class tab_expansion_file): New. (tab_expansion_file::write): New method. (tui_register_format): Change return type. Use tab_expansion_file. (tui_get_register, tui_data_window::display_registers_from) (tui_data_item_window::rerender): Update. * tui/tui-io.h (tui_expand_tabs): Don't declare. * tui/tui-io.c (tui_expand_tabs): Remove. --- gdb/ChangeLog | 13 ++++++++++ gdb/tui/tui-io.c | 52 ------------------------------------- gdb/tui/tui-io.h | 3 --- gdb/tui/tui-regs.c | 64 ++++++++++++++++++++++++++++++++++------------ gdb/tui/tui-regs.h | 2 +- 5 files changed, 61 insertions(+), 73 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6a6260d49e..9efd8b6eaa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2020-07-01 Tom Tromey + + * tui/tui-regs.h (struct tui_data_item_window) : Now a + std::string. + * tui/tui-regs.c (class tab_expansion_file): New. + (tab_expansion_file::write): New method. + (tui_register_format): Change return type. Use + tab_expansion_file. + (tui_get_register, tui_data_window::display_registers_from) + (tui_data_item_window::rerender): Update. + * tui/tui-io.h (tui_expand_tabs): Don't declare. + * tui/tui-io.c (tui_expand_tabs): Remove. + 2020-07-01 Tom Tromey * tui/tui-regs.c (tui_reggroup_completer): Use complete_on_enum. diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index 277b560af4..7698d7903f 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -1050,55 +1050,3 @@ tui_getc (FILE *fp) return 0; } } - -/* See tui-io.h. */ - -gdb::unique_xmalloc_ptr -tui_expand_tabs (const char *string) -{ - int n_adjust, ncol; - const char *s; - char *ret, *q; - - /* 1. How many additional characters do we need? */ - for (ncol = 0, n_adjust = 0, s = string; s; ) - { - s = strpbrk (s, "\t"); - if (s) - { - ncol += (s - string) + n_adjust; - /* Adjustment for the next tab stop, minus one for the TAB - we replace with spaces. */ - n_adjust += 8 - (ncol % 8) - 1; - s++; - } - } - - /* Allocate the copy. */ - ret = q = (char *) xmalloc (strlen (string) + n_adjust + 1); - - /* 2. Copy the original string while replacing TABs with spaces. */ - for (ncol = 0, s = string; s; ) - { - const char *s1 = strpbrk (s, "\t"); - if (s1) - { - if (s1 > s) - { - strncpy (q, s, s1 - s); - q += s1 - s; - ncol += s1 - s; - } - do { - *q++ = ' '; - ncol++; - } while ((ncol % 8) != 0); - s1++; - } - else - strcpy (q, s); - s = s1; - } - - return gdb::unique_xmalloc_ptr (ret); -} diff --git a/gdb/tui/tui-io.h b/gdb/tui/tui-io.h index f28cf4e12d..2cc47ba4be 100644 --- a/gdb/tui/tui-io.h +++ b/gdb/tui/tui-io.h @@ -45,9 +45,6 @@ extern void tui_initialize_io (void); changed the edited text. */ extern void tui_redisplay_readline (void); -/* Expand TABs into spaces. */ -extern gdb::unique_xmalloc_ptr tui_expand_tabs (const char *); - /* Enter/leave reverse video mode. */ extern void tui_set_reverse_mode (WINDOW *w, bool reverse); diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index b99e29972d..15ce7a0222 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -42,15 +42,55 @@ #include "gdb_curses.h" +/* A subclass of string_file that expands tab characters. */ +class tab_expansion_file : public string_file +{ +public: + + tab_expansion_file () = default; + + void write (const char *buf, long length_buf) override; + +private: + + int m_column = 0; +}; + +void +tab_expansion_file::write (const char *buf, long length_buf) +{ + for (long i = 0; i < length_buf; ++i) + { + if (buf[i] == '\t') + { + do + { + string_file::write (" ", 1); + ++m_column; + } + while ((m_column % 8) != 0); + } + else + { + string_file::write (&buf[i], 1); + if (buf[i] == '\n') + m_column = 0; + else + ++m_column; + } + } +} + /* Get the register from the frame and return a printable representation of it. */ -static gdb::unique_xmalloc_ptr +static std::string tui_register_format (struct frame_info *frame, int regnum) { struct gdbarch *gdbarch = get_frame_arch (frame); - string_file stream; + /* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */ + tab_expansion_file stream; scoped_restore save_pagination = make_scoped_restore (&pagination_enabled, 0); @@ -64,8 +104,7 @@ tui_register_format (struct frame_info *frame, int regnum) if (!str.empty () && str.back () == '\n') str.resize (str.size () - 1); - /* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */ - return tui_expand_tabs (str.c_str ()); + return str; } /* Get the register value from the given frame and format it for the @@ -80,11 +119,9 @@ tui_get_register (struct frame_info *frame, *changedp = false; if (target_has_registers) { - gdb::unique_xmalloc_ptr new_content - = tui_register_format (frame, regnum); + std::string new_content = tui_register_format (frame, regnum); - if (changedp != NULL - && strcmp (data->content.get (), new_content.get ()) != 0) + if (changedp != NULL && data->content != new_content) *changedp = true; data->content = std::move (new_content); @@ -244,13 +281,7 @@ tui_data_window::display_registers_from (int start_element_no) int max_len = 0; for (auto &&data_item_win : m_regs_content) { - const char *p; - int len; - - len = 0; - p = data_item_win.content.get (); - if (p != 0) - len = strlen (p); + int len = data_item_win.content.size (); if (len > max_len) max_len = len; @@ -488,8 +519,7 @@ tui_data_item_window::rerender () for (i = 1; i < width; i++) waddch (handle.get (), ' '); wmove (handle.get (), 0, 0); - if (content) - waddstr (handle.get (), content.get ()); + waddstr (handle.get (), content.c_str ()); if (highlight) /* We ignore the return value, casting it to void in order to avoid diff --git a/gdb/tui/tui-regs.h b/gdb/tui/tui-regs.h index df8c27305c..250f4e7466 100644 --- a/gdb/tui/tui-regs.h +++ b/gdb/tui/tui-regs.h @@ -52,7 +52,7 @@ struct tui_data_item_window : public tui_gen_win_info /* The register number, or data display number. */ int item_no = -1; bool highlight = false; - gdb::unique_xmalloc_ptr content; + std::string content; }; /* The TUI registers window. */