Remove tui_expand_tabs
authorTom Tromey <tom@tromey.com>
Thu, 2 Jul 2020 03:21:12 +0000 (21:21 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 2 Jul 2020 03:21:13 +0000 (21:21 -0600)
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.

gdb/ChangeLog
gdb/tui/tui-io.c
gdb/tui/tui-io.h
gdb/tui/tui-regs.c
gdb/tui/tui-regs.h

index 6a6260d49e272ead28473ce039abddaac5784385..9efd8b6eaa5e13d4723b0ef8c2834c07a18616bc 100644 (file)
@@ -1,3 +1,16 @@
+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.
index 277b560af4f4cdaa4229a7cd575332b32e004967..7698d7903f19cfd1f70fb60d728a0c8268320f6c 100644 (file)
@@ -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);
-}
index f28cf4e12db3bd94851b97ac9908eea4fda0f033..2cc47ba4beb7f44e81229921584d5b5c414eb97c 100644 (file)
@@ -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);
 
index b99e29972de91309779f8e3d05ee91efbfe877a3..15ce7a0222614b8ba46bf0e5636a5c7ac6171820 100644 (file)
 
 #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
index df8c27305cd19c2183e2c8a9bc21a8518813e2d0..250f4e7466770a39c8eb86cb1d8497872507bcc3 100644 (file)
@@ -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.  */