/* TUI display locator.
- Copyright (C) 1998-2004, 2006-2012 Free Software Foundation, Inc.
+ Copyright (C) 1998-2015 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
#include "target.h"
#include "top.h"
#include "gdb-demangle.h"
-#include "gdb_string.h"
+#include "source.h"
#include "tui/tui.h"
#include "tui/tui-data.h"
#include "tui/tui-stack.h"
Returns a pointer to a static area holding the result. */
static char *tui_get_function_from_frame (struct frame_info *fi);
-/* Set the filename portion of the locator. */
-static void tui_set_locator_filename (const char *filename);
+/* Set the full_name portion of the locator. */
+static void tui_set_locator_fullname (const char *fullname);
/* Update the locator, with the provided arguments. */
-static void tui_set_locator_info (struct gdbarch *gdbarch,
- const char *filename,
- const char *procname,
- int lineno, CORE_ADDR addr);
+static int tui_set_locator_info (struct gdbarch *gdbarch,
+ const char *fullname,
+ const char *procname,
+ int lineno, CORE_ADDR addr);
static void tui_update_command (char *, int);
\f
/* Translate line number and obtain its size. */
if (loc->line_no > 0)
- sprintf (line_buf, "%d", loc->line_no);
+ xsnprintf (line_buf, sizeof (line_buf), "%d", loc->line_no);
else
strcpy (line_buf, "??");
line_width = strlen (line_buf);
if (*p == '<')
p++;
strncpy (name, p, sizeof (name) - 1);
+ name[sizeof (name) - 1] = 0;
p = strchr (name, '(');
if (!p)
p = strchr (name, '>');
{
struct tui_win_element *element;
- element = (struct tui_win_element *) locator->content[0];
+ element = locator->content[0];
string = tui_make_status_line (&element->which_element.locator);
wmove (locator->handle, 0, 0);
/* Set the filename portion of the locator. */
static void
-tui_set_locator_filename (const char *filename)
+tui_set_locator_fullname (const char *fullname)
{
struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
struct tui_locator_element *element;
if (locator->content[0] == NULL)
{
- tui_set_locator_info (NULL, filename, NULL, 0, 0);
+ tui_set_locator_info (NULL, fullname, NULL, 0, 0);
return;
}
- element = &((struct tui_win_element *)
- locator->content[0])->which_element.locator;
- element->file_name[0] = 0;
- strcat_to_buf (element->file_name, MAX_LOCATOR_ELEMENT_LEN, filename);
+ element = &locator->content[0]->which_element.locator;
+ element->full_name[0] = 0;
+ strcat_to_buf (element->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname);
}
-/* Update the locator, with the provided arguments. */
-static void
+/* Update the locator, with the provided arguments.
+
+ Returns 1 if any of the locator's fields were actually changed,
+ and 0 otherwise. */
+
+static int
tui_set_locator_info (struct gdbarch *gdbarch,
- const char *filename,
+ const char *fullname,
const char *procname,
int lineno,
CORE_ADDR addr)
{
struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
struct tui_locator_element *element;
+ int locator_changed_p = 0;
/* Allocate the locator content if necessary. */
if (locator->content_size <= 0)
{
- locator->content = (void **) tui_alloc_content (1, locator->type);
+ locator->content = tui_alloc_content (1, LOCATOR_WIN);
locator->content_size = 1;
+ locator_changed_p = 1;
}
- element = &((struct tui_win_element *)
- locator->content[0])->which_element.locator;
+ if (procname == NULL)
+ procname = "";
+
+ if (fullname == NULL)
+ fullname = "";
+
+ element = &locator->content[0]->which_element.locator;
+
+ locator_changed_p |= strncmp (element->proc_name, procname,
+ MAX_LOCATOR_ELEMENT_LEN) != 0;
+ locator_changed_p |= lineno != element->line_no;
+ locator_changed_p |= addr != element->addr;
+ locator_changed_p |= gdbarch != element->gdbarch;
+ locator_changed_p |= strncmp (element->full_name, fullname,
+ MAX_LOCATOR_ELEMENT_LEN) != 0;
+
element->proc_name[0] = (char) 0;
strcat_to_buf (element->proc_name, MAX_LOCATOR_ELEMENT_LEN, procname);
element->line_no = lineno;
element->addr = addr;
element->gdbarch = gdbarch;
- tui_set_locator_filename (filename);
+ tui_set_locator_fullname (fullname);
+
+ return locator_changed_p;
}
-/* Update only the filename portion of the locator. */
+/* Update only the full_name portion of the locator. */
void
-tui_update_locator_filename (const char *filename)
+tui_update_locator_fullname (const char *fullname)
{
- tui_set_locator_filename (filename);
+ tui_set_locator_fullname (fullname);
tui_show_locator_content ();
}
-/* Function to print the frame information for the TUI. */
-void
+/* Function to print the frame information for the TUI. The windows are
+ refreshed only if frame information has changed since the last refresh.
+
+ Return 1 if frame information has changed (and windows subsequently
+ refreshed), 0 otherwise. */
+
+int
tui_show_frame_info (struct frame_info *fi)
{
struct tui_win_info *win_info;
+ int locator_changed_p;
int i;
if (fi)
find_frame_sal (fi, &sal);
source_already_displayed = sal.symtab != 0
- && tui_source_is_displayed (sal.symtab->filename);
+ && tui_source_is_displayed (symtab_to_fullname (sal.symtab));
if (get_frame_pc_if_available (fi, &pc))
- tui_set_locator_info (get_frame_arch (fi),
- sal.symtab == 0 ? "??" : sal.symtab->filename,
- tui_get_function_from_frame (fi),
- sal.line,
- pc);
+ locator_changed_p
+ = tui_set_locator_info (get_frame_arch (fi),
+ (sal.symtab == 0
+ ? "??" : symtab_to_fullname (sal.symtab)),
+ tui_get_function_from_frame (fi),
+ sal.line,
+ pc);
else
- tui_set_locator_info (get_frame_arch (fi),
- "??", _("<unavailable>"), sal.line, 0);
+ locator_changed_p
+ = tui_set_locator_info (get_frame_arch (fi),
+ "??", _("<unavailable>"), sal.line, 0);
+
+ /* If the locator information has not changed, then frame information has
+ not changed. If frame information has not changed, then the windows'
+ contents will not change. So don't bother refreshing the windows. */
+ if (!locator_changed_p)
+ return 0;
tui_show_locator_content ();
start_line = 0;
win_info = (tui_source_windows ())->list[i];
- item = &((struct tui_win_element *)
- locator->content[0])->which_element;
+ item = &locator->content[0]->which_element;
if (win_info == TUI_SRC_WIN)
{
start_line = (item->locator.line_no -
}
tui_update_exec_info (win_info);
}
+
+ return 1;
}
else
{
- tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0);
+ locator_changed_p
+ = tui_set_locator_info (NULL, NULL, NULL, 0, (CORE_ADDR) 0);
+
+ if (!locator_changed_p)
+ return 0;
+
tui_show_locator_content ();
for (i = 0; i < (tui_source_windows ())->count; i++)
{
tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
tui_update_exec_info (win_info);
}
+
+ return 1;
}
}