Use symbol_set_language to set a symbol's language
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
index 43e8a28df5a8f7c197dc6f217620367c5817fd9d..6653709e7cbe626f4b8d074bdcc7a470ae2701f6 100644 (file)
@@ -65,7 +65,105 @@ tui_display_main ()
     }
 }
 
+/* See tui-winsource.h.  */
+
+std::string
+tui_copy_source_line (const char **ptr, int line_no, int first_col,
+                     int line_width, int ndigits)
+{
+  const char *lineptr = *ptr;
+
+  /* Init the line with the line number.  */
+  std::string result;
+
+  if (line_no > 0)
+    {
+      if (ndigits > 0)
+       result = string_printf ("%*d ", ndigits, line_no);
+      else
+       {
+         result = string_printf ("%-6d", line_no);
+         int len = result.size ();
+         len = len - ((len / tui_tab_width) * tui_tab_width);
+         result.append (len, ' ');
+       }
+    }
 
+  int column = 0;
+  char c;
+  do
+    {
+      int skip_bytes;
+
+      c = *lineptr;
+      if (c == '\033' && skip_ansi_escape (lineptr, &skip_bytes))
+       {
+         /* We always have to preserve escapes.  */
+         result.append (lineptr, lineptr + skip_bytes);
+         lineptr += skip_bytes;
+         continue;
+       }
+      if (c == '\0')
+       break;
+
+      ++lineptr;
+      ++column;
+
+      auto process_tab = [&] ()
+       {
+         int max_tab_len = tui_tab_width;
+
+         --column;
+         for (int j = column % max_tab_len;
+              j < max_tab_len && column < first_col + line_width;
+              column++, j++)
+           if (column >= first_col)
+             result.push_back (' ');
+       };
+
+      /* We have to process all the text in order to pick up all the
+        escapes.  */
+      if (column <= first_col || column > first_col + line_width)
+       {
+         if (c == '\t')
+           process_tab ();
+         continue;
+       }
+
+      if (c == '\n' || c == '\r' || c == '\0')
+       {
+         /* Nothing.  */
+       }
+      else if (c < 040 && c != '\t')
+       {
+         result.push_back ('^');
+         result.push_back (c + 0100);
+       }
+      else if (c == 0177)
+       {
+         result.push_back ('^');
+         result.push_back ('?');
+       }
+      else if (c == '\t')
+       process_tab ();
+      else
+       result.push_back (c);
+    }
+  while (c != '\0' && c != '\n' && c != '\r');
+
+  if (c == '\r' && *lineptr == '\n')
+    ++lineptr;
+  *ptr = lineptr;
+
+  return result;
+}
+
+void
+tui_source_window_base::style_changed ()
+{
+  if (tui_active && is_visible ())
+    refill ();
+}
 
 /* Function to display source in the source window.  This function
    initializes the horizontal scroll to 0.  */
@@ -193,22 +291,19 @@ tui_source_window_base::do_erase_source_content (const char *str)
   content.clear ();
   if (handle != NULL)
     {
-      werase (handle);
+      werase (handle.get ());
       check_and_display_highlight_if_needed ();
 
       if (strlen (str) >= half_width)
        x_pos = 1;
       else
        x_pos = half_width - strlen (str);
-      mvwaddstr (handle,
+      mvwaddstr (handle.get (),
                 (height / 2),
                 x_pos,
                 (char *) str);
 
       refresh_window ();
-
-      werase (execution_info->handle);
-      execution_info->refresh_window ();
     }
 }
 
@@ -222,84 +317,49 @@ tui_show_source_line (struct tui_source_window_base *win_info, int lineno)
 
   line = &win_info->content[lineno - 1];
   if (line->is_exec_point)
-    tui_set_reverse_mode (win_info->handle, true);
+    tui_set_reverse_mode (win_info->handle.get (), true);
 
-  wmove (win_info->handle, lineno, 1);
-  tui_puts (line->line,
-           win_info->handle);
+  wmove (win_info->handle.get (), lineno, TUI_EXECINFO_SIZE);
+  tui_puts (line->line.c_str (), win_info->handle.get ());
   if (line->is_exec_point)
-    tui_set_reverse_mode (win_info->handle, false);
+    tui_set_reverse_mode (win_info->handle.get (), false);
 
   /* Clear to end of line but stop before the border.  */
-  x = getcurx (win_info->handle);
+  x = getcurx (win_info->handle.get ());
   while (x + 1 < win_info->width)
     {
-      waddch (win_info->handle, ' ');
-      x = getcurx (win_info->handle);
+      waddch (win_info->handle.get (), ' ');
+      x = getcurx (win_info->handle.get ());
     }
 }
 
 void
 tui_source_window_base::show_source_content ()
 {
-  if (!content.empty ())
-    {
-      int lineno;
+  gdb_assert (!content.empty ());
 
-      for (lineno = 1; lineno <= content.size (); lineno++)
-        tui_show_source_line (this, lineno);
-    }
-  else
-    erase_source_content ();
+  for (int lineno = 1; lineno <= content.size (); lineno++)
+    tui_show_source_line (this, lineno);
 
   check_and_display_highlight_if_needed ();
   refresh_window ();
 }
 
-/* See tui-data.h.  */
-
-void
-tui_source_window_base::clear_detail ()
-{
-  gdbarch = NULL;
-  start_line_or_addr.loa = LOA_ADDRESS;
-  start_line_or_addr.u.addr = 0;
-  horizontal_offset = 0;
-}
-
 tui_source_window_base::tui_source_window_base (enum tui_win_type type)
-  : tui_win_info (type),
-    execution_info (new tui_exec_info_window ())
+  : tui_win_info (type)
 {
   gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
   start_line_or_addr.loa = LOA_ADDRESS;
   start_line_or_addr.u.addr = 0;
-}
 
-
-tui_source_window_base::~tui_source_window_base ()
-{
-  xfree (fullname);
-  delete execution_info;
-}  
-
-void
-tui_source_window_base::resize (int height, int width,
-                               int origin_x, int origin_y)
-{
-  tui_gen_win_info::resize (height, width - 3,
-                           origin_x + 3, origin_y);
-  execution_info->resize (height, 3, origin_x, origin_y);
+  gdb::observers::source_styling_changed.attach
+    (std::bind (&tui_source_window::style_changed, this),
+     m_observable);
 }
 
-/* See tui-data.h.  */
-
-void
-tui_source_window_base::refresh_all ()
+tui_source_window_base::~tui_source_window_base ()
 {
-  show_source_content ();
-  check_and_display_highlight_if_needed ();
-  update_exec_info ();
+  gdb::observers::source_styling_changed.detach (m_observable);
 }
 
 /* See tui-data.h.  */
@@ -307,7 +367,7 @@ tui_source_window_base::refresh_all ()
 void
 tui_source_window_base::update_tab_width ()
 {
-  werase (handle);
+  werase (handle.get ());
   rerender ();
 }
 
@@ -350,24 +410,6 @@ tui_source_window_base::rerender ()
 
 /* See tui-data.h.  */
 
-void
-tui_source_window_base::make_visible (bool visible)
-{
-  execution_info->make_visible (visible);
-  tui_win_info::make_visible (visible);
-}
-
-/* See tui-data.h.  */
-
-void
-tui_source_window_base::refresh_window ()
-{
-  execution_info->refresh_window ();
-  tui_win_info::refresh_window ();
-}
-
-/* See tui-data.h.  */
-
 void
 tui_source_window_base::refill ()
 {
@@ -465,8 +507,6 @@ tui_source_window_base::update_breakpoint_info
 
   for (i = 0; i < content.size (); i++)
     {
-      struct breakpoint *bp;
-      extern struct breakpoint *breakpoint_chain;
       struct tui_source_element *line;
 
       line = &content[i];
@@ -477,9 +517,7 @@ tui_source_window_base::update_breakpoint_info
          do with it.  Identify enable/disabled breakpoints as well as
          those that we already hit.  */
       tui_bp_flags mode = 0;
-      for (bp = breakpoint_chain;
-           bp != NULL;
-           bp = bp->next)
+      iterate_over_breakpoints ([&] (breakpoint *bp) -> bool
         {
          struct bp_location *loc;
 
@@ -487,7 +525,7 @@ tui_source_window_base::update_breakpoint_info
                      || line->line_or_addr.loa == LOA_ADDRESS);
 
          if (bp == being_deleted)
-           continue;
+           return false;
 
          for (loc = bp->loc; loc != NULL; loc = loc->next)
            {
@@ -505,7 +543,8 @@ tui_source_window_base::update_breakpoint_info
                    mode |= TUI_BP_HARDWARE;
                }
            }
-        }
+         return false;
+        });
       if (line->break_mode != mode)
         {
           line->break_mode = mode;
@@ -521,7 +560,6 @@ tui_source_window_base::update_breakpoint_info
 void
 tui_source_window_base::update_exec_info ()
 {
-  werase (execution_info->handle);
   update_breakpoint_info (nullptr, true);
   for (int i = 0; i < content.size (); i++)
     {
@@ -544,7 +582,7 @@ tui_source_window_base::update_exec_info ()
       if (src_element->is_exec_point)
        element[TUI_EXEC_POS] = '>';
 
-      mvwaddstr (execution_info->handle, i + 1, 0, element);
+      mvwaddstr (handle.get (), i + 1, 1, element);
     }
-  execution_info->refresh_window ();
+  refresh_window ();
 }
This page took 0.028548 seconds and 4 git commands to generate.