Remove an unneeded NULL check
[deliverable/binutils-gdb.git] / gdb / tui / tui-layout.c
index 9da0f3c399658386afb12b6c2fb131e9ce94aa5b..de78c6c0ac8fa48727ccd7e853f681fb7f558716 100644 (file)
@@ -1,7 +1,6 @@
 /* TUI layout window management.
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1998-2019 Free Software Foundation, Inc.
 
    Contributed by Hewlett-Packard Company.
 
@@ -9,7 +8,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
+#include "arch-utils.h"
 #include "command.h"
 #include "symtab.h"
 #include "frame.h"
@@ -38,8 +36,7 @@
 #include "tui/tui-win.h"
 #include "tui/tui-winsource.h"
 #include "tui/tui-disasm.h"
-
-#include "gdb_string.h"
+#include "tui/tui-layout.h"
 #include "gdb_curses.h"
 
 /*******************************
@@ -52,12 +49,11 @@ static void init_gen_win_info (struct tui_gen_win_info *,
 static void *init_and_make_win (void *, enum tui_win_type, 
                                int, int, int, int, int);
 static void show_source_or_disasm_and_command (enum tui_layout_type);
-static void make_source_or_disasm_window (struct tui_win_info **, 
-                                         enum tui_win_type, 
-                                         int, int);
-static void make_command_window (struct tui_win_info **, int, int);
-static void make_source_window (struct tui_win_info **, int, int);
-static void make_disasm_window (struct tui_win_info **, int, int);
+static struct tui_win_info *make_source_or_disasm_window (enum tui_win_type, 
+                                                         int, int);
+static struct tui_win_info *make_command_window (int, int);
+static struct tui_win_info *make_source_window (int, int);
+static struct tui_win_info *make_disasm_window (int, int);
 static void make_data_window (struct tui_win_info **, int, int);
 static void show_source_command (void);
 static void show_disasm_command (void);
@@ -65,11 +61,8 @@ static void show_source_disasm_command (void);
 static void show_data (enum tui_layout_type);
 static enum tui_layout_type next_layout (void);
 static enum tui_layout_type prev_layout (void);
-static void tui_layout_command (char *, int);
-static void tui_toggle_layout_command (char *, int);
-static void tui_toggle_split_layout_command (char *, int);
-static CORE_ADDR extract_display_start_addr (void);
-static void tui_handle_xdb_layout (struct tui_layout_def *);
+static void tui_layout_command (const char *, int);
+static void extract_display_start_addr (struct gdbarch **, CORE_ADDR *);
 
 
 /***************************************
@@ -128,135 +121,113 @@ show_layout (enum tui_layout_type layout)
 
 
 /* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
-   SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND.
-   If the layout is SRC_DATA_COMMAND, DISASSEM_DATA_COMMAND, or
-   UNDEFINED_LAYOUT, then the data window is populated according to
-   regs_display_type.  */
+   SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND.  */
 enum tui_status
-tui_set_layout (enum tui_layout_type layout_type,
-               enum tui_register_display_type regs_display_type)
+tui_set_layout (enum tui_layout_type layout_type)
 {
   enum tui_status status = TUI_SUCCESS;
 
-  if (layout_type != UNDEFINED_LAYOUT 
-      || regs_display_type != TUI_UNDEFINED_REGS)
+  if (layout_type != UNDEFINED_LAYOUT)
     {
       enum tui_layout_type cur_layout = tui_current_layout (),
        new_layout = UNDEFINED_LAYOUT;
       int regs_populate = FALSE;
-      CORE_ADDR addr = extract_display_start_addr ();
+      struct gdbarch *gdbarch;
+      CORE_ADDR addr;
       struct tui_win_info *win_with_focus = tui_win_with_focus ();
       struct tui_layout_def *layout_def = tui_layout_def ();
 
+      extract_display_start_addr (&gdbarch, &addr);
 
-      if (layout_type == UNDEFINED_LAYOUT
-         && regs_display_type != TUI_UNDEFINED_REGS)
-       {
-         if (cur_layout == SRC_DISASSEM_COMMAND)
-           new_layout = DISASSEM_DATA_COMMAND;
-         else if (cur_layout == SRC_COMMAND 
-                  || cur_layout == SRC_DATA_COMMAND)
-           new_layout = SRC_DATA_COMMAND;
-         else if (cur_layout == DISASSEM_COMMAND 
-                  || cur_layout == DISASSEM_DATA_COMMAND)
-           new_layout = DISASSEM_DATA_COMMAND;
-       }
-      else
-       new_layout = layout_type;
+      new_layout = layout_type;
 
-      regs_populate = (new_layout == SRC_DATA_COMMAND 
-                      || new_layout == DISASSEM_DATA_COMMAND 
-                      || regs_display_type != TUI_UNDEFINED_REGS);
-      if (new_layout != cur_layout
-         || regs_display_type != TUI_UNDEFINED_REGS)
+      regs_populate = (new_layout == SRC_DATA_COMMAND
+                      || new_layout == DISASSEM_DATA_COMMAND);
+      if (new_layout != cur_layout)
        {
-         if (new_layout != cur_layout)
-           {
-             show_layout (new_layout);
+         show_layout (new_layout);
 
-             /* Now determine where focus should be.  */
-             if (win_with_focus != TUI_CMD_WIN)
+         /* Now determine where focus should be.  */
+         if (win_with_focus != TUI_CMD_WIN)
+           {
+             switch (new_layout)
                {
-                 switch (new_layout)
-                   {
-                   case SRC_COMMAND:
-                     tui_set_win_focus_to (TUI_SRC_WIN);
-                     layout_def->display_mode = SRC_WIN;
-                     layout_def->split = FALSE;
-                     break;
-                   case DISASSEM_COMMAND:
-                     /* The previous layout was not showing code.
-                        This can happen if there is no source
-                        available:
-
-                        1. if the source file is in another dir OR
-                        2. if target was compiled without -g
-                        We still want to show the assembly though!  */
-
-                     addr = tui_get_begin_asm_address ();
-                     tui_set_win_focus_to (TUI_DISASM_WIN);
-                     layout_def->display_mode = DISASSEM_WIN;
-                     layout_def->split = FALSE;
-                     break;
-                   case SRC_DISASSEM_COMMAND:
-                     /* The previous layout was not showing code.
-                        This can happen if there is no source
-                        available:
-
-                        1. if the source file is in another dir OR
-                        2. if target was compiled without -g
-                        We still want to show the assembly though!  */
-
-                     addr = tui_get_begin_asm_address ();
-                     if (win_with_focus == TUI_SRC_WIN)
-                       tui_set_win_focus_to (TUI_SRC_WIN);
-                     else
-                       tui_set_win_focus_to (TUI_DISASM_WIN);
-                     layout_def->split = TRUE;
-                     break;
-                   case SRC_DATA_COMMAND:
-                     if (win_with_focus != TUI_DATA_WIN)
-                       tui_set_win_focus_to (TUI_SRC_WIN);
-                     else
-                       tui_set_win_focus_to (TUI_DATA_WIN);
-                     layout_def->display_mode = SRC_WIN;
-                     layout_def->split = FALSE;
-                     break;
-                   case DISASSEM_DATA_COMMAND:
-                     /* The previous layout was not showing code.
-                        This can happen if there is no source
-                        available:
-
-                        1. if the source file is in another dir OR
-                        2. if target was compiled without -g
-                        We still want to show the assembly though!  */
-
-                     addr = tui_get_begin_asm_address ();
-                     if (win_with_focus != TUI_DATA_WIN)
-                       tui_set_win_focus_to (TUI_DISASM_WIN);
-                     else
-                       tui_set_win_focus_to (TUI_DATA_WIN);
-                     layout_def->display_mode = DISASSEM_WIN;
-                     layout_def->split = FALSE;
-                     break;
-                   default:
-                     break;
-                   }
+               case SRC_COMMAND:
+                 tui_set_win_focus_to (TUI_SRC_WIN);
+                 layout_def->display_mode = SRC_WIN;
+                 layout_def->split = FALSE;
+                 break;
+               case DISASSEM_COMMAND:
+                 /* The previous layout was not showing code.
+                    This can happen if there is no source
+                    available:
+
+                    1. if the source file is in another dir OR
+                    2. if target was compiled without -g
+                    We still want to show the assembly though!  */
+
+                 tui_get_begin_asm_address (&gdbarch, &addr);
+                 tui_set_win_focus_to (TUI_DISASM_WIN);
+                 layout_def->display_mode = DISASSEM_WIN;
+                 layout_def->split = FALSE;
+                 break;
+               case SRC_DISASSEM_COMMAND:
+                 /* The previous layout was not showing code.
+                    This can happen if there is no source
+                    available:
+
+                    1. if the source file is in another dir OR
+                    2. if target was compiled without -g
+                    We still want to show the assembly though!  */
+
+                 tui_get_begin_asm_address (&gdbarch, &addr);
+                 if (win_with_focus == TUI_SRC_WIN)
+                   tui_set_win_focus_to (TUI_SRC_WIN);
+                 else
+                   tui_set_win_focus_to (TUI_DISASM_WIN);
+                 layout_def->split = TRUE;
+                 break;
+               case SRC_DATA_COMMAND:
+                 if (win_with_focus != TUI_DATA_WIN)
+                   tui_set_win_focus_to (TUI_SRC_WIN);
+                 else
+                   tui_set_win_focus_to (TUI_DATA_WIN);
+                 layout_def->display_mode = SRC_WIN;
+                 layout_def->split = FALSE;
+                 break;
+               case DISASSEM_DATA_COMMAND:
+                 /* The previous layout was not showing code.
+                    This can happen if there is no source
+                    available:
+
+                    1. if the source file is in another dir OR
+                    2. if target was compiled without -g
+                    We still want to show the assembly though!  */
+
+                 tui_get_begin_asm_address (&gdbarch, &addr);
+                 if (win_with_focus != TUI_DATA_WIN)
+                   tui_set_win_focus_to (TUI_DISASM_WIN);
+                 else
+                   tui_set_win_focus_to (TUI_DATA_WIN);
+                 layout_def->display_mode = DISASSEM_WIN;
+                 layout_def->split = FALSE;
+                 break;
+               default:
+                 break;
                }
-             /*
-              * Now update the window content.
-              */
-             if (!regs_populate 
-                 && (new_layout == SRC_DATA_COMMAND 
-                     || new_layout == DISASSEM_DATA_COMMAND))
-               tui_display_all_data ();
-
-             tui_update_source_windows_with_addr (addr);
            }
+         /*
+          * Now update the window content.
+          */
+         if (!regs_populate
+             && (new_layout == SRC_DATA_COMMAND
+                 || new_layout == DISASSEM_DATA_COMMAND))
+           tui_display_all_data ();
+
+         tui_update_source_windows_with_addr (gdbarch, addr);
+
          if (regs_populate)
-           {
-              tui_show_registers (TUI_DATA_WIN->detail.data_display_info.current_group);
-           }
+           tui_show_registers (TUI_DATA_WIN->current_group);
        }
     }
   else
@@ -324,7 +295,7 @@ tui_default_win_height (enum tui_win_type type,
 {
   int h;
 
-  if (tui_win_list[type] != (struct tui_win_info *) NULL)
+  if (tui_win_list[type] != NULL)
     h = tui_win_list[type]->generic.height;
   else
     {
@@ -374,15 +345,31 @@ tui_default_win_viewport_height (enum tui_win_type type,
   return h;
 }
 
+/* Complete possible layout names.  TEXT is the complete text entered so
+   far, WORD is the word currently being completed.  */
+
+static void
+layout_completer (struct cmd_list_element *ignore,
+                 completion_tracker &tracker,
+                 const char *text, const char *word)
+{
+  static const char *layout_names [] =
+    { "src", "asm", "split", "regs", "next", "prev", NULL };
+
+  complete_on_enum (tracker, layout_names, text, word);
+}
 
 /* Function to initialize gdb commands, for tui window layout
    manipulation.  */
+
 void
 _initialize_tui_layout (void)
 {
-  add_com ("layout", class_tui, tui_layout_command, _("\
+  struct cmd_list_element *cmd;
+
+  cmd = add_com ("layout", class_tui, tui_layout_command, _("\
 Change the layout of windows.\n\
-Usage: layout prev | next | <layout_name> \n\
+Usage: layout prev | next | LAYOUT-NAME\n\
 Layout names are:\n\
    src   : Displays source and command windows.\n\
    asm   : Displays disassembly and command windows.\n\
@@ -392,15 +379,8 @@ Layout names are:\n\
            register window is displayed. If the\n\
            source/assembly/command (split) is displayed, \n\
            the register window is displayed with \n\
-           the window that has current logical focus.\n"));
-  if (xdb_commands)
-    {
-      add_com ("td", class_tui, tui_toggle_layout_command, _("\
-Toggle between Source/Command and Disassembly/Command layouts.\n"));
-      add_com ("ts", class_tui, tui_toggle_split_layout_command, _("\
-Toggle between Source/Command or Disassembly/Command and \n\
-Source/Disassembly/Command layouts.\n"));
-    }
+           the window that has current logical focus."));
+  set_cmd_completer (cmd, layout_completer);
 }
 
 
@@ -409,28 +389,26 @@ Source/Disassembly/Command layouts.\n"));
 **************************/
 
 
-/* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA,
-   REGS, $REGS, $GREGS, $FREGS, $SREGS.  */
+/* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
+   REGS. */
 enum tui_status
-tui_set_layout_for_display_command (const char *layout_name)
+tui_set_layout_by_name (const char *layout_name)
 {
   enum tui_status status = TUI_SUCCESS;
 
-  if (layout_name != (char *) NULL)
+  if (layout_name != NULL)
     {
       int i;
-      char *buf_ptr;
       enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
-      enum tui_register_display_type dpy_type = TUI_UNDEFINED_REGS;
       enum tui_layout_type cur_layout = tui_current_layout ();
 
-      buf_ptr = (char *) xstrdup (layout_name);
-      for (i = 0; (i < strlen (layout_name)); i++)
-       buf_ptr[i] = toupper (buf_ptr[i]);
+      std::string copy = layout_name;
+      for (i = 0; i < copy.size (); i++)
+       copy[i] = toupper (copy[i]);
+      const char *buf_ptr = copy.c_str ();
 
       /* First check for ambiguous input.  */
-      if (strlen (buf_ptr) <= 1 
-         && (*buf_ptr == 'S' || *buf_ptr == '$'))
+      if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
        {
          warning (_("Ambiguous command input."));
          status = TUI_FAILURE;
@@ -443,57 +421,13 @@ tui_set_layout_for_display_command (const char *layout_name)
            new_layout = DISASSEM_COMMAND;
          else if (subset_compare (buf_ptr, "SPLIT"))
            new_layout = SRC_DISASSEM_COMMAND;
-         else if (subset_compare (buf_ptr, "REGS") 
-                  || subset_compare (buf_ptr, TUI_GENERAL_SPECIAL_REGS_NAME)
-                  || subset_compare (buf_ptr, TUI_GENERAL_REGS_NAME)
-                  || subset_compare (buf_ptr, TUI_FLOAT_REGS_NAME)
-                  || subset_compare (buf_ptr, TUI_SPECIAL_REGS_NAME))
+         else if (subset_compare (buf_ptr, "REGS"))
            {
-             if (cur_layout == SRC_COMMAND 
+             if (cur_layout == SRC_COMMAND
                  || cur_layout == SRC_DATA_COMMAND)
                new_layout = SRC_DATA_COMMAND;
              else
                new_layout = DISASSEM_DATA_COMMAND;
-
-             /* Could ifdef out the following code. when compile with
-                -z, there are null pointer references that cause a
-                core dump if 'layout regs' is the first layout
-                command issued by the user. HP has asked us to hook
-                up this code.  - edie epstein  */
-             if (subset_compare (buf_ptr, TUI_FLOAT_REGS_NAME))
-               {
-                 if (TUI_DATA_WIN->detail.data_display_info.regs_display_type != TUI_SFLOAT_REGS
-                     && TUI_DATA_WIN->detail.data_display_info.regs_display_type != TUI_DFLOAT_REGS)
-                   dpy_type = TUI_SFLOAT_REGS;
-                 else
-                   dpy_type =
-                     TUI_DATA_WIN->detail.data_display_info.regs_display_type;
-               }
-             else if (subset_compare (buf_ptr,
-                                     TUI_GENERAL_SPECIAL_REGS_NAME))
-               dpy_type = TUI_GENERAL_AND_SPECIAL_REGS;
-             else if (subset_compare (buf_ptr, TUI_GENERAL_REGS_NAME))
-               dpy_type = TUI_GENERAL_REGS;
-             else if (subset_compare (buf_ptr, TUI_SPECIAL_REGS_NAME))
-               dpy_type = TUI_SPECIAL_REGS;
-             else if (TUI_DATA_WIN)
-               {
-                 if (TUI_DATA_WIN->detail.data_display_info.regs_display_type !=
-                     TUI_UNDEFINED_REGS)
-                   dpy_type =
-                     TUI_DATA_WIN->detail.data_display_info.regs_display_type;
-                 else
-                   dpy_type = TUI_GENERAL_REGS;
-               }
-
-             /* End of potential ifdef.
-              */
-
-             /* If ifdefed out code above, then assume that the user
-                wishes to display the general purpose registers .
-             */
-
-             /* dpy_type = TUI_GENERAL_REGS; */
            }
          else if (subset_compare (buf_ptr, "NEXT"))
            new_layout = next_layout ();
@@ -502,9 +436,13 @@ tui_set_layout_for_display_command (const char *layout_name)
          else
            status = TUI_FAILURE;
 
-         tui_set_layout (new_layout, dpy_type);
+         if (status == TUI_SUCCESS)
+           {
+             /* Make sure the curses mode is enabled.  */
+             tui_enable ();
+             tui_set_layout (new_layout);
+           }
        }
-      xfree (buf_ptr);
     }
   else
     status = TUI_FAILURE;
@@ -513,10 +451,11 @@ tui_set_layout_for_display_command (const char *layout_name)
 }
 
 
-static CORE_ADDR
-extract_display_start_addr (void)
+static void
+extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
 {
   enum tui_layout_type cur_layout = tui_current_layout ();
+  struct gdbarch *gdbarch = get_current_arch ();
   CORE_ADDR addr;
   CORE_ADDR pc;
   struct symtab_and_line cursal = get_current_source_symtab_and_line ();
@@ -525,89 +464,41 @@ extract_display_start_addr (void)
     {
     case SRC_COMMAND:
     case SRC_DATA_COMMAND:
+      gdbarch = TUI_SRC_WIN->gdbarch;
       find_line_pc (cursal.symtab,
-                   TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
+                   TUI_SRC_WIN->start_line_or_addr.u.line_no,
                    &pc);
       addr = pc;
       break;
     case DISASSEM_COMMAND:
     case SRC_DISASSEM_COMMAND:
     case DISASSEM_DATA_COMMAND:
-      addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
+      gdbarch = TUI_DISASM_WIN->gdbarch;
+      addr = TUI_DISASM_WIN->start_line_or_addr.u.addr;
       break;
     default:
       addr = 0;
       break;
     }
 
-  return addr;
-}
-
-
-static void
-tui_handle_xdb_layout (struct tui_layout_def *layout_def)
-{
-  if (layout_def->split)
-    {
-      tui_set_layout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS);
-      tui_set_win_focus_to (tui_win_list[layout_def->display_mode]);
-    }
-  else
-    {
-      if (layout_def->display_mode == SRC_WIN)
-       tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS);
-      else
-       tui_set_layout (DISASSEM_DATA_COMMAND, layout_def->regs_display_type);
-    }
-}
-
-
-static void
-tui_toggle_layout_command (char *arg, int from_tty)
-{
-  struct tui_layout_def *layout_def = tui_layout_def ();
-
-  /* Make sure the curses mode is enabled.  */
-  tui_enable ();
-  if (layout_def->display_mode == SRC_WIN)
-    layout_def->display_mode = DISASSEM_WIN;
-  else
-    layout_def->display_mode = SRC_WIN;
-
-  if (!layout_def->split)
-    tui_handle_xdb_layout (layout_def);
-}
-
-
-static void
-tui_toggle_split_layout_command (char *arg, int from_tty)
-{
-  struct tui_layout_def *layout_def = tui_layout_def ();
-
-  /* Make sure the curses mode is enabled.  */
-  tui_enable ();
-  layout_def->split = (!layout_def->split);
-  tui_handle_xdb_layout (layout_def);
+  *gdbarch_p = gdbarch;
+  *addr_p = addr;
 }
 
 
 static void
-tui_layout_command (char *arg, int from_tty)
+tui_layout_command (const char *arg, int from_tty)
 {
-  /* Make sure the curses mode is enabled.  */
-  tui_enable ();
-
   /* Switch to the selected layout.  */
-  if (tui_set_layout_for_display_command (arg) != TUI_SUCCESS)
+  if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
     warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
-
 }
 
 /* Answer the previous layout to cycle to.  */
 static enum tui_layout_type
 next_layout (void)
 {
-  enum tui_layout_type new_layout;
+  int new_layout;
 
   new_layout = tui_current_layout ();
   if (new_layout == UNDEFINED_LAYOUT)
@@ -619,7 +510,7 @@ next_layout (void)
        new_layout = SRC_COMMAND;
     }
 
-  return new_layout;
+  return (enum tui_layout_type) new_layout;
 }
 
 
@@ -627,7 +518,7 @@ next_layout (void)
 static enum tui_layout_type
 prev_layout (void)
 {
-  enum tui_layout_type new_layout;
+  int new_layout;
 
   new_layout = tui_current_layout ();
   if (new_layout == SRC_COMMAND)
@@ -639,48 +530,42 @@ prev_layout (void)
        new_layout = DISASSEM_DATA_COMMAND;
     }
 
-  return new_layout;
+  return (enum tui_layout_type) new_layout;
 }
 
 
 
-static void
-make_command_window (struct tui_win_info **win_info_ptr, 
-                    int height, int origin_y)
+static struct tui_win_info *
+make_command_window (int height, int origin_y)
 {
-  *win_info_ptr = init_and_make_win (*win_info_ptr,
-                                    CMD_WIN,
-                                    height,
-                                    tui_term_width (),
-                                    0,
-                                    origin_y,
-                                    DONT_BOX_WINDOW);
-
-  (*win_info_ptr)->can_highlight = FALSE;
+  struct tui_win_info *result
+    = (struct tui_win_info *) init_and_make_win (NULL,
+                                                CMD_WIN,
+                                                height,
+                                                tui_term_width (),
+                                                0,
+                                                origin_y,
+                                                DONT_BOX_WINDOW);
+  result->can_highlight = FALSE;
+  return result;
 }
 
 
 /* make_source_window().
  */
-static void
-make_source_window (struct tui_win_info **win_info_ptr, 
-                   int height, int origin_y)
+static struct tui_win_info *
+make_source_window (int height, int origin_y)
 {
-  make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
-
-  return;
+  return make_source_or_disasm_window (SRC_WIN, height, origin_y);
 }                              /* make_source_window */
 
 
 /* make_disasm_window().
  */
-static void
-make_disasm_window (struct tui_win_info **win_info_ptr, 
-                   int height, int origin_y)
+static struct tui_win_info *
+make_disasm_window (int height, int origin_y)
 {
-  make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
-
-  return;
+  return make_source_or_disasm_window (DISASSEM_WIN, height, origin_y);
 }                              /* make_disasm_window */
 
 
@@ -688,13 +573,14 @@ static void
 make_data_window (struct tui_win_info **win_info_ptr, 
                  int height, int origin_y)
 {
-  *win_info_ptr = init_and_make_win (*win_info_ptr,
-                                    DATA_WIN,
-                                    height,
-                                    tui_term_width (),
-                                    0,
-                                    origin_y,
-                                    BOX_WINDOW);
+  *win_info_ptr
+    = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
+                                                DATA_WIN,
+                                                height,
+                                                tui_term_width (),
+                                                0,
+                                                origin_y,
+                                                BOX_WINDOW);
 }
 
 
@@ -732,94 +618,90 @@ show_source_disasm_command (void)
       asm_height = tui_term_height () - (src_height + cmd_height);
 
       if (TUI_SRC_WIN == NULL)
-       make_source_window (&TUI_SRC_WIN, src_height, 0);
+       tui_win_list[SRC_WIN] = make_source_window (src_height, 0);
       else
        {
          init_gen_win_info (&TUI_SRC_WIN->generic,
                             TUI_SRC_WIN->generic.type,
                             src_height,
                             TUI_SRC_WIN->generic.width,
-                            TUI_SRC_WIN->detail.source_info.execution_info->width,
+                            TUI_SRC_WIN->execution_info->width,
                             0);
          TUI_SRC_WIN->can_highlight = TRUE;
-         init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
+         init_gen_win_info (TUI_SRC_WIN->execution_info,
                             EXEC_INFO_WIN,
                             src_height,
                             3,
                             0,
                             0);
          tui_make_visible (&TUI_SRC_WIN->generic);
-         tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
-         TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
+         tui_make_visible (TUI_SRC_WIN->execution_info);
+         TUI_SRC_WIN->m_has_locator = false;
        }
-      if (TUI_SRC_WIN != NULL)
-       {
-         struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
 
-         tui_show_source_content (TUI_SRC_WIN);
-         if (TUI_DISASM_WIN == NULL)
-           {
-             make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
-             locator = init_and_make_win (locator,
-                                          LOCATOR_WIN,
-                                          2 /* 1 */ ,
-                                          tui_term_width (),
-                                          0,
-                                          (src_height + asm_height) - 1,
-                                          DONT_BOX_WINDOW);
-           }
-         else
-           {
-             init_gen_win_info (locator,
-                                LOCATOR_WIN,
-                                2 /* 1 */ ,
-                                tui_term_width (),
-                                0,
-                                (src_height + asm_height) - 1);
-             TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
-             init_gen_win_info (&TUI_DISASM_WIN->generic,
-                                TUI_DISASM_WIN->generic.type,
-                                asm_height,
-                                TUI_DISASM_WIN->generic.width,
-                                TUI_DISASM_WIN->detail.source_info.execution_info->width,
-                                src_height - 1);
-             init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
-                                EXEC_INFO_WIN,
-                                asm_height,
-                                3,
-                                0,
-                                src_height - 1);
-             TUI_DISASM_WIN->can_highlight = TRUE;
-             tui_make_visible (&TUI_DISASM_WIN->generic);
-             tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
-           }
-         if (TUI_DISASM_WIN != NULL)
-           {
-             TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
-             TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
-             tui_make_visible (locator);
-             tui_show_locator_content ();
-             tui_show_source_content (TUI_DISASM_WIN);
-
-             if (TUI_CMD_WIN == NULL)
-               make_command_window (&TUI_CMD_WIN,
-                                    cmd_height,
-                                    tui_term_height () - cmd_height);
-             else
-               {
-                 init_gen_win_info (&TUI_CMD_WIN->generic,
-                                    TUI_CMD_WIN->generic.type,
-                                    TUI_CMD_WIN->generic.height,
-                                    TUI_CMD_WIN->generic.width,
-                                    0,
-                                    TUI_CMD_WIN->generic.origin.y);
-                 TUI_CMD_WIN->can_highlight = FALSE;
-                 tui_make_visible (&TUI_CMD_WIN->generic);
-               }
-             if (TUI_CMD_WIN != NULL)
-               tui_refresh_win (&TUI_CMD_WIN->generic);
-           }
+      struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+
+      tui_show_source_content (TUI_SRC_WIN);
+      if (TUI_DISASM_WIN == NULL)
+       {
+         tui_win_list[DISASSEM_WIN]
+           = make_disasm_window (asm_height, src_height - 1);
+         locator
+           = ((struct tui_gen_win_info *)
+              init_and_make_win (locator,
+                                 LOCATOR_WIN,
+                                 2 /* 1 */ ,
+                                 tui_term_width (),
+                                 0,
+                                 (src_height + asm_height) - 1,
+                                 DONT_BOX_WINDOW));
        }
+      else
+       {
+         init_gen_win_info (locator,
+                            LOCATOR_WIN,
+                            2 /* 1 */ ,
+                            tui_term_width (),
+                            0,
+                            (src_height + asm_height) - 1);
+         TUI_DISASM_WIN->m_has_locator = true;
+         init_gen_win_info (&TUI_DISASM_WIN->generic,
+                            TUI_DISASM_WIN->generic.type,
+                            asm_height,
+                            TUI_DISASM_WIN->generic.width,
+                            TUI_DISASM_WIN->execution_info->width,
+                            src_height - 1);
+         init_gen_win_info (TUI_DISASM_WIN->execution_info,
+                            EXEC_INFO_WIN,
+                            asm_height,
+                            3,
+                            0,
+                            src_height - 1);
+         TUI_DISASM_WIN->can_highlight = TRUE;
+         tui_make_visible (&TUI_DISASM_WIN->generic);
+         tui_make_visible (TUI_DISASM_WIN->execution_info);
+       }
+      TUI_SRC_WIN->m_has_locator = false;
+      TUI_DISASM_WIN->m_has_locator = true;
+      tui_make_visible (locator);
+      tui_show_locator_content ();
+      tui_show_source_content (TUI_DISASM_WIN);
+
+      if (TUI_CMD_WIN == NULL)
+       tui_win_list[CMD_WIN]
+         = make_command_window (cmd_height, tui_term_height () - cmd_height);
+      else
+       {
+         init_gen_win_info (&TUI_CMD_WIN->generic,
+                            TUI_CMD_WIN->generic.type,
+                            TUI_CMD_WIN->generic.height,
+                            TUI_CMD_WIN->generic.width,
+                            0,
+                            TUI_CMD_WIN->generic.origin.y);
+         TUI_CMD_WIN->can_highlight = FALSE;
+         tui_make_visible (&TUI_CMD_WIN->generic);
+       }
+      tui_refresh_win (&TUI_CMD_WIN->generic);
       tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
     }
 }
@@ -840,42 +722,50 @@ show_data (enum tui_layout_type new_layout)
   src_height = total_height - data_height;
   tui_make_all_invisible ();
   tui_make_invisible (locator);
-  make_data_window (&TUI_DATA_WIN, data_height, 0);
+  make_data_window (&tui_win_list[DATA_WIN], data_height, 0);
   TUI_DATA_WIN->can_highlight = TRUE;
   if (new_layout == SRC_DATA_COMMAND)
     win_type = SRC_WIN;
   else
     win_type = DISASSEM_WIN;
+
+  tui_source_window_base *base;
   if (tui_win_list[win_type] == NULL)
     {
       if (win_type == SRC_WIN)
-       make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
+       tui_win_list[win_type]
+         = make_source_window (src_height, data_height - 1);
       else
-       make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
-      locator = init_and_make_win (locator,
-                                  LOCATOR_WIN,
-                                  2 /* 1 */ ,
-                                  tui_term_width (),
-                                  0,
-                                  total_height - 1,
-                                  DONT_BOX_WINDOW);
+       tui_win_list[win_type]
+         = make_disasm_window (src_height, data_height - 1);
+      locator
+       = ((struct tui_gen_win_info *)
+          init_and_make_win (locator,
+                             LOCATOR_WIN,
+                             2 /* 1 */ ,
+                             tui_term_width (),
+                             0,
+                             total_height - 1,
+                             DONT_BOX_WINDOW));
+      base = (tui_source_window_base *) tui_win_list[win_type];
     }
   else
     {
+      base = (tui_source_window_base *) tui_win_list[win_type];
       init_gen_win_info (&tui_win_list[win_type]->generic,
                         tui_win_list[win_type]->generic.type,
                         src_height,
                         tui_win_list[win_type]->generic.width,
-                        tui_win_list[win_type]->detail.source_info.execution_info->width,
+                        base->execution_info->width,
                         data_height - 1);
-      init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
+      init_gen_win_info (base->execution_info,
                         EXEC_INFO_WIN,
                         src_height,
                         3,
                         0,
                         data_height - 1);
       tui_make_visible (&tui_win_list[win_type]->generic);
-      tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
+      tui_make_visible (base->execution_info);
       init_gen_win_info (locator,
                         LOCATOR_WIN,
                         2 /* 1 */ ,
@@ -883,7 +773,7 @@ show_data (enum tui_layout_type new_layout)
                         0,
                         total_height - 1);
     }
-  tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
+  base->m_has_locator = true;
   tui_make_visible (locator);
   tui_show_locator_content ();
   tui_add_to_source_windows (tui_win_list[win_type]);
@@ -940,52 +830,53 @@ init_and_make_win (void *opaque_win_info,
   else
     generic = &((struct tui_win_info *) opaque_win_info)->generic;
 
-  if (opaque_win_info != NULL)
+  init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
+  if (!tui_win_is_auxillary (win_type))
     {
-      init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
-      if (!tui_win_is_auxillary (win_type))
-       {
-         if (generic->type == CMD_WIN)
-           ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
-         else
-           ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
-       }
-      tui_make_window (generic, box_it);
+      if (generic->type == CMD_WIN)
+       ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
+      else
+       ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
     }
+  tui_make_window (generic, box_it);
+
   return opaque_win_info;
 }
 
 
-static void
-make_source_or_disasm_window (struct tui_win_info **win_info_ptr, 
-                             enum tui_win_type type,
+static struct tui_win_info *
+make_source_or_disasm_window (enum tui_win_type type,
                              int height, int origin_y)
 {
-  struct tui_gen_win_info *execution_info = (struct tui_gen_win_info *) NULL;
+  struct tui_gen_win_info *execution_info = NULL;
 
   /* Create the exeuction info window.  */
   if (type == SRC_WIN)
     execution_info = tui_source_exec_info_win_ptr ();
   else
     execution_info = tui_disassem_exec_info_win_ptr ();
-  execution_info = init_and_make_win (execution_info,
-                                     EXEC_INFO_WIN,
-                                     height,
-                                     3,
-                                     0,
-                                     origin_y,
-                                     DONT_BOX_WINDOW);
+  execution_info
+    = ((struct tui_gen_win_info *)
+       init_and_make_win (execution_info,
+                         EXEC_INFO_WIN,
+                         height,
+                         3,
+                         0,
+                         origin_y,
+                         DONT_BOX_WINDOW));
 
   /* Now create the source window.  */
-  *win_info_ptr = init_and_make_win (*win_info_ptr,
-                                    type,
-                                    height,
-                                    tui_term_width () - execution_info->width,
-                                    execution_info->width,
-                                    origin_y,
-                                    BOX_WINDOW);
-
-  (*win_info_ptr)->detail.source_info.execution_info = execution_info;
+  struct tui_source_window_base *result
+    = ((struct tui_source_window_base *)
+       init_and_make_win (NULL,
+                         type,
+                         height,
+                         tui_term_width () - execution_info->width,
+                         execution_info->width,
+                         origin_y,
+                         BOX_WINDOW));
+  result->execution_info = execution_info;
+  return result;
 }
 
 
@@ -1006,72 +897,76 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type)
       src_height = tui_term_height () - cmd_height;
 
       if (layout_type == SRC_COMMAND)
-       win_info_ptr = &TUI_SRC_WIN;
+       win_info_ptr = &tui_win_list[SRC_WIN];
       else
-       win_info_ptr = &TUI_DISASM_WIN;
+       win_info_ptr = &tui_win_list[DISASSEM_WIN];
 
+      tui_source_window_base *base;
       if ((*win_info_ptr) == NULL)
        {
          if (layout_type == SRC_COMMAND)
-           make_source_window (win_info_ptr, src_height - 1, 0);
+           *win_info_ptr = make_source_window (src_height - 1, 0);
          else
-           make_disasm_window (win_info_ptr, src_height - 1, 0);
-         locator = init_and_make_win (locator,
-                                      LOCATOR_WIN,
-                                      2 /* 1 */ ,
-                                      tui_term_width (),
-                                      0,
-                                      src_height - 1,
-                                      DONT_BOX_WINDOW);
+           *win_info_ptr = make_disasm_window (src_height - 1, 0);
+         locator
+           = ((struct tui_gen_win_info *)
+              init_and_make_win (locator,
+                                 LOCATOR_WIN,
+                                 2 /* 1 */ ,
+                                 tui_term_width (),
+                                 0,
+                                 src_height - 1,
+                                 DONT_BOX_WINDOW));
+         base = (tui_source_window_base *) *win_info_ptr;
        }
       else
        {
+         base = (tui_source_window_base *) *win_info_ptr;
          init_gen_win_info (locator,
                             LOCATOR_WIN,
                             2 /* 1 */ ,
                             tui_term_width (),
                             0,
                             src_height - 1);
-         (*win_info_ptr)->detail.source_info.has_locator = TRUE;
+         base->m_has_locator = true;
          init_gen_win_info (&(*win_info_ptr)->generic,
                             (*win_info_ptr)->generic.type,
                             src_height - 1,
                             (*win_info_ptr)->generic.width,
-                            (*win_info_ptr)->detail.source_info.execution_info->width,
+                            base->execution_info->width,
                             0);
-         init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
+         init_gen_win_info (base->execution_info,
                             EXEC_INFO_WIN,
                             src_height - 1,
                             3,
                             0,
                             0);
-         (*win_info_ptr)->can_highlight = TRUE;
+         base->can_highlight = TRUE;
          tui_make_visible (&(*win_info_ptr)->generic);
-         tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
+         tui_make_visible (base->execution_info);
        }
-      if ((*win_info_ptr) != NULL)
-       {
-         (*win_info_ptr)->detail.source_info.has_locator = TRUE;
-         tui_make_visible (locator);
-         tui_show_locator_content ();
-         tui_show_source_content (*win_info_ptr);
 
-         if (TUI_CMD_WIN == NULL)
-           {
-             make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
-             tui_refresh_win (&TUI_CMD_WIN->generic);
-           }
-         else
-           {
-             init_gen_win_info (&TUI_CMD_WIN->generic,
-                                TUI_CMD_WIN->generic.type,
-                                TUI_CMD_WIN->generic.height,
-                                TUI_CMD_WIN->generic.width,
-                                TUI_CMD_WIN->generic.origin.x,
-                                TUI_CMD_WIN->generic.origin.y);
-             TUI_CMD_WIN->can_highlight = FALSE;
-             tui_make_visible (&TUI_CMD_WIN->generic);
-           }
+      base->m_has_locator = true;
+      tui_make_visible (locator);
+      tui_show_locator_content ();
+      tui_show_source_content (*win_info_ptr);
+
+      if (TUI_CMD_WIN == NULL)
+       {
+         tui_win_list[CMD_WIN] = make_command_window (cmd_height,
+                                                      src_height);
+         tui_refresh_win (&TUI_CMD_WIN->generic);
+       }
+      else
+       {
+         init_gen_win_info (&TUI_CMD_WIN->generic,
+                            TUI_CMD_WIN->generic.type,
+                            TUI_CMD_WIN->generic.height,
+                            TUI_CMD_WIN->generic.width,
+                            TUI_CMD_WIN->generic.origin.x,
+                            TUI_CMD_WIN->generic.origin.y);
+         TUI_CMD_WIN->can_highlight = FALSE;
+         tui_make_visible (&TUI_CMD_WIN->generic);
        }
       tui_set_current_layout_to (layout_type);
     }
This page took 0.046669 seconds and 4 git commands to generate.