Make sure TABs are expanded in TUI windows on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Sat, 31 Jan 2015 08:47:14 +0000 (10:47 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 31 Jan 2015 08:47:14 +0000 (10:47 +0200)
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.

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

index 58f5a7b3b7c7013ab7d7a8b65d8c1229492f8108..51f17145b13f5604854e4f459c937c5a240c999a 100644 (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.
index 7e8a3bc0d2961e45f5f6185a44a636575612f560..19e9485ea3884e108e45ee57f9a3712dd91d16c5 100644 (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.  */
index 8f96cfe9e5e421c58564bd743de3b8456a8d4055..3154eeef982e65dbb67b2931415db356abd20bc8 100644 (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;
 
index b523e90afb26eed5d06da28dc05b1341a3459856..961491f112dc12b14e3446b5cfdf8429002aa52b 100644 (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;