/* TUI data manipulation routines.
- Copyright (C) 1998-2015 Free Software Foundation, Inc.
+ Copyright (C) 1998-2019 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
/****************************
** GLOBAL DECLARATIONS
****************************/
-struct tui_win_info *(tui_win_list[MAX_MAJOR_WINDOWS]);
+struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
/***************************
** Private data
static int term_height, term_width;
static struct tui_gen_win_info _locator;
static struct tui_gen_win_info exec_info[2];
-static struct tui_win_info *src_win_list[2];
-static struct tui_list source_windows = {src_win_list, 0};
-static int default_tab_len = DEFAULT_TAB_LEN;
+static std::vector<tui_source_window_base *> source_windows;
static struct tui_win_info *win_with_focus = NULL;
static struct tui_layout_def layout_def = {
SRC_WIN, /* DISPLAY_MODE */
** PUBLIC FUNCTIONS
**********************************/
-int
-tui_win_is_source_type (enum tui_win_type win_type)
-{
- return (win_type == SRC_WIN || win_type == DISASSEM_WIN);
-}
-
int
tui_win_is_auxillary (enum tui_win_type win_type)
{
return (win_type > MAX_MAJOR_WINDOWS);
}
-int
-tui_win_has_locator (struct tui_win_info *win_info)
-{
- return (win_info != NULL
- && win_info->detail.source_info.has_locator);
-}
-
void
tui_set_win_highlight (struct tui_win_info *win_info,
int highlight)
}
-/* Answer the length in chars, of tabs. */
-int
-tui_default_tab_len (void)
-{
- return default_tab_len;
-}
-
-
-/* Set the length in chars, of tabs. */
-void
-tui_set_default_tab_len (int len)
-{
- default_tab_len = len;
-}
-
-
/* Accessor for the current source window. Usually there is only one
source window (either source or disassembly), but both can be
displayed at the same time. */
-struct tui_list *
-tui_source_windows (void)
+std::vector<tui_source_window_base *> &
+tui_source_windows ()
{
- return &source_windows;
+ return source_windows;
}
window (either source or disassembly), but both can be displayed at
the same time. */
void
-tui_clear_source_windows (void)
+tui_clear_source_windows ()
{
- source_windows.list[0] = NULL;
- source_windows.list[1] = NULL;
- source_windows.count = 0;
+ source_windows.clear ();
}
/* Clear the pertinant detail in the source windows. */
void
-tui_clear_source_windows_detail (void)
+tui_clear_source_windows_detail ()
{
- int i;
-
- for (i = 0; i < (tui_source_windows ())->count; i++)
- tui_clear_win_detail ((tui_source_windows ())->list[i]);
+ for (tui_source_window_base *win : tui_source_windows ())
+ win->clear_detail ();
}
one source window (either source or disassembly), but both can be
displayed at the same time. */
void
-tui_add_to_source_windows (struct tui_win_info *win_info)
+tui_add_to_source_windows (struct tui_source_window_base *win_info)
{
- if (source_windows.count < 2)
- source_windows.list[source_windows.count++] = (void *) win_info;
+ if (source_windows.size () < 2)
+ source_windows.push_back (win_info);
}
+/* See tui-data.h. */
-/* Clear the pertinant detail in the windows. */
void
-tui_clear_win_detail (struct tui_win_info *win_info)
+tui_source_window_base::clear_detail ()
{
- if (win_info != NULL)
- {
- switch (win_info->generic.type)
- {
- case SRC_WIN:
- case DISASSEM_WIN:
- win_info->detail.source_info.gdbarch = NULL;
- win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
- win_info->detail.source_info.start_line_or_addr.u.addr = 0;
- win_info->detail.source_info.horizontal_offset = 0;
- break;
- case CMD_WIN:
- wmove (win_info->generic.handle, 0, 0);
- break;
- case DATA_WIN:
- win_info->detail.data_display_info.data_content =
- (tui_win_content) NULL;
- win_info->detail.data_display_info.data_content_count = 0;
- win_info->detail.data_display_info.regs_content =
- (tui_win_content) NULL;
- win_info->detail.data_display_info.regs_content_count = 0;
- win_info->detail.data_display_info.regs_column_count = 1;
- win_info->detail.data_display_info.display_regs = FALSE;
- break;
- default:
- break;
- }
- }
+ gdbarch = NULL;
+ start_line_or_addr.loa = LOA_ADDRESS;
+ start_line_or_addr.u.addr = 0;
+ horizontal_offset = 0;
}
+/* See tui-data.h. */
+
+void
+tui_cmd_window::clear_detail ()
+{
+ wmove (generic.handle, 0, 0);
+}
+
+/* See tui-data.h. */
+
+void
+tui_data_window::clear_detail ()
+{
+ data_content = NULL;
+ data_content_count = 0;
+ regs_content = NULL;
+ regs_content_count = 0;
+ regs_column_count = 1;
+ display_regs = false;
+}
/* Accessor for the source execution info ptr. */
struct tui_gen_win_info *
/* Answer the window represented by name. */
struct tui_win_info *
-tui_partial_win_by_name (char *name)
+tui_partial_win_by_name (const char *name)
{
struct tui_win_info *win_info = NULL;
- if (name != (char *) NULL)
+ if (name != NULL)
{
int i = 0;
{
struct tui_gen_win_info *win = XNEW (struct tui_gen_win_info);
- if (win != NULL)
- tui_init_generic_part (win);
+ tui_init_generic_part (win);
return win;
}
win->last_visible_line = 0;
win->handle = NULL;
win->content = NULL;
- win->content_in_use =
- win->is_visible = FALSE;
+ win->content_in_use = FALSE;
+ win->is_visible = false;
win->title = 0;
}
init_content_element (struct tui_win_element *element,
enum tui_win_type type)
{
- element->highlight = FALSE;
switch (type)
{
case SRC_WIN:
}
}
-static void
-init_win_info (struct tui_win_info *win_info)
+tui_win_info::tui_win_info (enum tui_win_type type)
{
- tui_init_generic_part (&win_info->generic);
- win_info->can_highlight =
- win_info->is_highlighted = FALSE;
- switch (win_info->generic.type)
- {
- case SRC_WIN:
- case DISASSEM_WIN:
- win_info->detail.source_info.execution_info
- = (struct tui_gen_win_info *) NULL;
- win_info->detail.source_info.has_locator = FALSE;
- win_info->detail.source_info.horizontal_offset = 0;
- win_info->detail.source_info.gdbarch = NULL;
- win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
- win_info->detail.source_info.start_line_or_addr.u.addr = 0;
- win_info->detail.source_info.fullname = NULL;
- break;
- case DATA_WIN:
- win_info->detail.data_display_info.data_content = (tui_win_content) NULL;
- win_info->detail.data_display_info.data_content_count = 0;
- win_info->detail.data_display_info.regs_content = (tui_win_content) NULL;
- win_info->detail.data_display_info.regs_content_count = 0;
- win_info->detail.data_display_info.regs_column_count = 1;
- win_info->detail.data_display_info.display_regs = FALSE;
- win_info->detail.data_display_info.current_group = 0;
- break;
- case CMD_WIN:
- break;
- default:
- win_info->detail.opaque = NULL;
- break;
- }
+ generic.type = type;
+ tui_init_generic_part (&generic);
}
+tui_source_window_base::tui_source_window_base (enum tui_win_type type)
+ : 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;
+}
struct tui_win_info *
tui_alloc_win_info (enum tui_win_type type)
{
- struct tui_win_info *win_info = XNEW (struct tui_win_info);
-
- if (win_info != NULL)
+ switch (type)
{
- win_info->generic.type = type;
- init_win_info (win_info);
+ case SRC_WIN:
+ return new tui_source_window ();
+
+ case DISASSEM_WIN:
+ return new tui_disasm_window ();
+
+ case DATA_WIN:
+ return new tui_data_window ();
+
+ case CMD_WIN:
+ return new tui_cmd_window ();
}
- return win_info;
+ gdb_assert_not_reached (_("Unhandled window type"));
}
tui_alloc_content (int num_elements, enum tui_win_type type)
{
tui_win_content content;
- char *element_block_ptr;
+ struct tui_win_element *element_block_ptr;
int i;
content = XNEWVEC (struct tui_win_element *, num_elements);
- if (content != NULL)
+
+ /*
+ * All windows, except the data window, can allocate the
+ * elements in a chunk. The data window cannot because items
+ * can be added/removed from the data display by the user at any
+ * time.
+ */
+ if (type != DATA_WIN)
{
- /*
- * All windows, except the data window, can allocate the
- * elements in a chunk. The data window cannot because items
- * can be added/removed from the data display by the user at any
- * time.
- */
- if (type != DATA_WIN)
+ element_block_ptr = XNEWVEC (struct tui_win_element, num_elements);
+ for (i = 0; i < num_elements; i++)
{
- element_block_ptr =
- xmalloc (sizeof (struct tui_win_element) * num_elements);
- if (element_block_ptr != NULL)
- {
- for (i = 0; i < num_elements; i++)
- {
- content[i] = (struct tui_win_element *) element_block_ptr;
- init_content_element (content[i], type);
- element_block_ptr += sizeof (struct tui_win_element);
- }
- }
- else
- {
- xfree (content);
- content = (tui_win_content) NULL;
- }
+ content[i] = element_block_ptr;
+ init_content_element (content[i], type);
+ element_block_ptr++;
}
}
for (i = index_start; (i < num_elements + index_start); i++)
{
element_ptr = XNEW (struct tui_win_element);
- if (element_ptr != NULL)
- {
- win_info->content[i] = (void *) element_ptr;
- init_content_element (element_ptr, win_info->type);
- win_info->content_size++;
- }
- else /* Things must be really hosed now! We ran out of
- memory!? */
- return (-1);
+ win_info->content[i] = element_ptr;
+ init_content_element (element_ptr, win_info->type);
+ win_info->content_size++;
}
}
return index_start;
}
-
-/* Delete all curses windows associated with win_info, leaving
- everything else intact. */
-void
-tui_del_window (struct tui_win_info *win_info)
+tui_source_window_base::~tui_source_window_base ()
{
- struct tui_gen_win_info *generic_win;
-
- switch (win_info->generic.type)
+ xfree (fullname);
+ struct tui_gen_win_info *generic_win = execution_info;
+ if (generic_win != NULL)
{
- case SRC_WIN:
- case DISASSEM_WIN:
- generic_win = tui_locator_win_info_ptr ();
- if (generic_win != (struct tui_gen_win_info *) NULL)
- {
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- generic_win->is_visible = FALSE;
- }
- if (win_info->detail.source_info.fullname)
- {
- xfree (win_info->detail.source_info.fullname);
- win_info->detail.source_info.fullname = NULL;
- }
- generic_win = win_info->detail.source_info.execution_info;
- if (generic_win != (struct tui_gen_win_info *) NULL)
- {
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- generic_win->is_visible = FALSE;
- }
- break;
- case DATA_WIN:
- if (win_info->generic.content != NULL)
- {
- tui_del_data_windows (win_info->detail.data_display_info.regs_content,
- win_info->detail.data_display_info.regs_content_count);
- tui_del_data_windows (win_info->detail.data_display_info.data_content,
- win_info->detail.data_display_info.data_content_count);
- }
- break;
- default:
- break;
+ tui_delete_win (generic_win->handle);
+ generic_win->handle = NULL;
+ tui_free_win_content (generic_win);
}
- if (win_info->generic.handle != (WINDOW *) NULL)
- {
- tui_delete_win (win_info->generic.handle);
- win_info->generic.handle = NULL;
- win_info->generic.is_visible = FALSE;
- }
-}
+}
-
-void
-tui_free_window (struct tui_win_info *win_info)
+tui_data_window::~tui_data_window ()
{
- struct tui_gen_win_info *generic_win;
-
- switch (win_info->generic.type)
+ if (generic.content != NULL)
{
- case SRC_WIN:
- case DISASSEM_WIN:
- if (win_info->detail.source_info.fullname)
- {
- xfree (win_info->detail.source_info.fullname);
- win_info->detail.source_info.fullname = NULL;
- }
- generic_win = win_info->detail.source_info.execution_info;
- if (generic_win != (struct tui_gen_win_info *) NULL)
- {
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- tui_free_win_content (generic_win);
- }
- break;
- case DATA_WIN:
- if (win_info->generic.content != NULL)
- {
- tui_free_data_content (win_info->detail.data_display_info.regs_content,
- win_info->detail.data_display_info.regs_content_count);
- win_info->detail.data_display_info.regs_content =
- (tui_win_content) NULL;
- win_info->detail.data_display_info.regs_content_count = 0;
- tui_free_data_content (win_info->detail.data_display_info.data_content,
- win_info->detail.data_display_info.data_content_count);
- win_info->detail.data_display_info.data_content =
- (tui_win_content) NULL;
- win_info->detail.data_display_info.data_content_count = 0;
- win_info->detail.data_display_info.regs_column_count = 1;
- win_info->detail.data_display_info.display_regs = FALSE;
- win_info->generic.content = NULL;
- win_info->generic.content_size = 0;
- }
- break;
- default:
- break;
+ tui_free_data_content (regs_content, regs_content_count);
+ regs_content = NULL;
+ regs_content_count = 0;
+ tui_free_data_content (data_content, data_content_count);
+ data_content = NULL;
+ data_content_count = 0;
+ regs_column_count = 1;
+ display_regs = false;
+ generic.content = NULL;
+ generic.content_size = 0;
}
- if (win_info->generic.handle != (WINDOW *) NULL)
+}
+
+tui_win_info::~tui_win_info ()
+{
+ if (generic.handle != NULL)
{
- tui_delete_win (win_info->generic.handle);
- win_info->generic.handle = NULL;
- tui_free_win_content (&win_info->generic);
+ tui_delete_win (generic.handle);
+ generic.handle = NULL;
+ tui_free_win_content (&generic);
}
- if (win_info->generic.title)
- xfree (win_info->generic.title);
- xfree (win_info);
+ if (generic.title)
+ xfree (generic.title);
}
void
-tui_free_all_source_wins_content (void)
+tui_free_all_source_wins_content ()
{
- int i;
-
- for (i = 0; i < (tui_source_windows ())->count; i++)
+ for (tui_source_window_base *win_info : tui_source_windows ())
{
- struct tui_win_info *win_info = (tui_source_windows ())->list[i];
-
- if (win_info != NULL)
- {
- tui_free_win_content (&(win_info->generic));
- tui_free_win_content (win_info->detail.source_info.execution_info);
- }
+ tui_free_win_content (&(win_info->generic));
+ tui_free_win_content (win_info->execution_info);
}
}
{
if (win_info->content != NULL)
{
- free_content ((tui_win_content) win_info->content,
+ free_content (win_info->content,
win_info->content_size,
win_info->type);
win_info->content = NULL;
}
-void
-tui_del_data_windows (tui_win_content content,
- int content_size)
-{
- int i;
-
- /* Remember that data window content elements are of type struct
- tui_gen_win_info *, each of which whose single element is a data
- element. */
- for (i = 0; i < content_size; i++)
- {
- struct tui_gen_win_info *generic_win
- = &content[i]->which_element.data_window;
-
- if (generic_win != (struct tui_gen_win_info *) NULL)
- {
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- generic_win->is_visible = FALSE;
- }
- }
-}
-
-
void
tui_free_data_content (tui_win_content content,
int content_size)
struct tui_gen_win_info *generic_win
= &content[i]->which_element.data_window;
- if (generic_win != (struct tui_gen_win_info *) NULL)
+ if (generic_win != NULL)
{
tui_delete_win (generic_win->handle);
generic_win->handle = NULL;
int content_size,
enum tui_win_type win_type)
{
- if (content != (tui_win_content) NULL)
+ if (content != NULL)
{
free_content_elements (content, content_size, win_type);
xfree (content);
int content_size,
enum tui_win_type type)
{
- if (content != (tui_win_content) NULL)
+ if (content != NULL)
{
int i;
- if (type == SRC_WIN || type == DISASSEM_WIN)
+ if (type == DISASSEM_WIN)
{
/* Free whole source block. */
xfree (content[0]->which_element.source.line);
struct tui_win_element *element;
element = content[i];
- if (element != (struct tui_win_element *) NULL)
+ if (element != NULL)
{
switch (type)
{
+ case SRC_WIN:
+ xfree (element->which_element.source.line);
+ break;
case DATA_WIN:
xfree (element);
break;