aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-07-01 21:21:12 -0600
committerTom Tromey <tom@tromey.com>2020-07-01 21:21:13 -0600
commit7a02bab704afdc2c46e056da166eaaa025ff4b03 (patch)
tree77c614e16fb84496aabf50aef85343dfb328d135
parentea68593bd2c649a73754e150340ba3400c007682 (diff)
downloadgdb-7a02bab704afdc2c46e056da166eaaa025ff4b03.zip
gdb-7a02bab704afdc2c46e056da166eaaa025ff4b03.tar.gz
gdb-7a02bab704afdc2c46e056da166eaaa025ff4b03.tar.bz2
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 <tom@tromey.com> * tui/tui-regs.h (struct tui_data_item_window) <content>: 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.
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/tui/tui-io.c52
-rw-r--r--gdb/tui/tui-io.h3
-rw-r--r--gdb/tui/tui-regs.c64
-rw-r--r--gdb/tui/tui-regs.h2
5 files changed, 61 insertions, 73 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6a6260d..9efd8b6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2020-07-01 Tom Tromey <tom@tromey.com>
+ * tui/tui-regs.h (struct tui_data_item_window) <content>: 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 <tom@tromey.com>
+
* tui/tui-regs.c (tui_reggroup_completer): Use complete_on_enum.
2020-07-01 Fangrui Song <maskray@google.com>
diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
index 277b560..7698d79 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<char>
-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<char> (ret);
-}
diff --git a/gdb/tui/tui-io.h b/gdb/tui/tui-io.h
index f28cf4e..2cc47ba 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<char> 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 b99e299..15ce7a0 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<char>
+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<char> 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 df8c273..250f4e7 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<char> content;
+ std::string content;
};
/* The TUI registers window. */