diff options
author | Andrew Cagney <cagney@redhat.com> | 2004-01-19 04:31:53 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2004-01-19 04:31:53 +0000 |
commit | fd8230855ff07e420019fbf9e499500be7d51e4a (patch) | |
tree | 2df876a05bc4a99ed32bca0da4a3e2f69cb0a94d /gdb/tui/tuiStack.c | |
parent | 50ee7dd4e2472a6153d4b2996ca10a1c0d13c6e2 (diff) | |
download | gdb-fd8230855ff07e420019fbf9e499500be7d51e4a.tar.gz |
2004-01-18 Andrew Cagney <cagney@redhat.com>
* tui/tui-command.c: Rename tui/tuiCommand.c.
* tui/tui-command.h: Rename tui/tuiCommand.h.
* tui/tui-data.c: Rename tui/tuiData.c.
* tui/tui-data.h: Rename tui/tuiData.h.
* tui/tui-disasm.c: Rename tui/tuiDisassem.c.
* tui/tui-disasm.h: Rename tui/tuiDisassem.h.
* tui/tui-io.c: Rename tui/tuiIO.c.
* tui/tui-io.h: Rename tui/tuiIO.h.
* tui/tui-layout.c: Rename tui/tuiLayout.c.
* tui/tui-layout.h: Rename tui/tuiLayout.h.
* tui/tui-regs.c: Rename tui/tuiRegs.c.
* tui/tui-regs.h: Rename tui/tuiRegs.h.
* tui/tui-source.c: Rename tui/tuiSource.c.
* tui/tui-source.h: Rename tui/tuiSource.h.
* tui/tui-stack.c: Rename tui/tuiStack.c.
* tui/tui-stack.h: Rename tui/tuiStack.h.
* tui/tui-win.c: Rename tui/tuiWin.c.
* tui/tui-win.h: Rename tui/tuiWin.h.
* tui/tui-windata.c: Rename tui/tuiDataWin.c.
* tui/tui-windata.h: Rename tui/tuiDataWin.h.
* tui/tui-wingeneral.c: Rename tui/tuiGeneralWin.c.
* tui/tui-wingeneral.h: Rename tui/tuiGeneralWin.h.
* tui/tui-winsource.c: Rename tui/tuiSourceWin.c.
* tui/tui-winsource.h: Rename tui/tuiSourceWin.h.
* tui/tui-file.c: Update includes.
* tui/tui-hooks.c: Update includes.
* tui/tui-interp.c: Update includes.
* tui/tui.c: Update includes.
* Makefile.in: Update all tui/ dependencies.
(SUBDIR_TUI_OBS, SUBDIR_TUI_SRCS): Update file names.
Diffstat (limited to 'gdb/tui/tuiStack.c')
-rw-r--r-- | gdb/tui/tuiStack.c | 435 |
1 files changed, 0 insertions, 435 deletions
diff --git a/gdb/tui/tuiStack.c b/gdb/tui/tuiStack.c deleted file mode 100644 index a6ad07af1c3..00000000000 --- a/gdb/tui/tuiStack.c +++ /dev/null @@ -1,435 +0,0 @@ -/* TUI display locator. - - Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, - Inc. - - Contributed by Hewlett-Packard Company. - - This file is part of GDB. - - 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 - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "defs.h" -#include "symtab.h" -#include "breakpoint.h" -#include "frame.h" -#include "command.h" -#include "inferior.h" -#include "target.h" -#include "top.h" - -#include "tui.h" -#include "tuiData.h" -#include "tuiStack.h" -#include "tuiGeneralWin.h" -#include "tuiSource.h" -#include "tuiSourceWin.h" -#include "tui-file.h" - -#ifdef HAVE_NCURSES_H -#include <ncurses.h> -#else -#ifdef HAVE_CURSES_H -#include <curses.h> -#endif -#endif - -/* Get a printable name for the function at the address. - The symbol name is demangled if demangling is turned on. - 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); - -/* Update the locator, with the provided arguments. */ -static void tui_set_locator_info (const char *filename, const char *procname, - int lineno, CORE_ADDR addr); - -static void tui_update_command (char *, int); - - -/* Create the status line to display as much information as we - can on this single line: target name, process number, current - function, current line, current PC, SingleKey mode. */ -static char* -tui_make_status_line (TuiLocatorElement* loc) -{ - char* string; - char line_buf[50], *pname; - char* buf; - int status_size; - int i, proc_width; - const char* pid_name; - const char* pc_buf; - int target_width; - int pid_width; - int line_width; - int pc_width; - struct ui_file *pc_out; - - if (ptid_equal (inferior_ptid, null_ptid)) - pid_name = "No process"; - else - pid_name = target_pid_to_str (inferior_ptid); - - target_width = strlen (target_shortname); - if (target_width > MAX_TARGET_WIDTH) - target_width = MAX_TARGET_WIDTH; - - pid_width = strlen (pid_name); - if (pid_width > MAX_PID_WIDTH) - pid_width = MAX_PID_WIDTH; - - status_size = termWidth (); - string = (char *) xmalloc (status_size + 1); - buf = (char*) alloca (status_size + 1); - - /* Translate line number and obtain its size. */ - if (loc->lineNo > 0) - sprintf (line_buf, "%d", loc->lineNo); - else - strcpy (line_buf, "??"); - line_width = strlen (line_buf); - if (line_width < MIN_LINE_WIDTH) - line_width = MIN_LINE_WIDTH; - - /* Translate PC address. */ - pc_out = tui_sfileopen (128); - print_address_numeric (loc->addr, 1, pc_out); - pc_buf = tui_file_get_strbuf (pc_out); - pc_width = strlen (pc_buf); - - /* First determine the amount of proc name width we have available. - The +1 are for a space separator between fields. - The -1 are to take into account the \0 counted by sizeof. */ - proc_width = (status_size - - (target_width + 1) - - (pid_width + 1) - - (sizeof (PROC_PREFIX) - 1 + 1) - - (sizeof (LINE_PREFIX) - 1 + line_width + 1) - - (sizeof (PC_PREFIX) - 1 + pc_width + 1) - - (tui_current_key_mode == tui_single_key_mode - ? (sizeof (SINGLE_KEY) - 1 + 1) - : 0)); - - /* If there is no room to print the function name, try by removing - some fields. */ - if (proc_width < MIN_PROC_WIDTH) - { - proc_width += target_width + 1; - target_width = 0; - if (proc_width < MIN_PROC_WIDTH) - { - proc_width += pid_width + 1; - pid_width = 0; - if (proc_width <= MIN_PROC_WIDTH) - { - proc_width += pc_width + sizeof (PC_PREFIX) - 1 + 1; - pc_width = 0; - if (proc_width < 0) - { - proc_width += line_width + sizeof (LINE_PREFIX) - 1 + 1; - line_width = 0; - if (proc_width < 0) - proc_width = 0; - } - } - } - } - - /* Now convert elements to string form */ - pname = loc->procName; - - /* Now create the locator line from the string version - of the elements. We could use sprintf() here but - that wouldn't ensure that we don't overrun the size - of the allocated buffer. strcat_to_buf() will. */ - *string = (char) 0; - - if (target_width > 0) - { - sprintf (buf, "%*.*s ", - -target_width, target_width, target_shortname); - strcat_to_buf (string, status_size, buf); - } - if (pid_width > 0) - { - sprintf (buf, "%*.*s ", - -pid_width, pid_width, pid_name); - strcat_to_buf (string, status_size, buf); - } - - /* Show whether we are in SingleKey mode. */ - if (tui_current_key_mode == tui_single_key_mode) - { - strcat_to_buf (string, status_size, SINGLE_KEY); - strcat_to_buf (string, status_size, " "); - } - - /* procedure/class name */ - if (proc_width > 0) - { - if (strlen (pname) > proc_width) - sprintf (buf, "%s%*.*s* ", PROC_PREFIX, - 1 - proc_width, proc_width - 1, pname); - else - sprintf (buf, "%s%*.*s ", PROC_PREFIX, - -proc_width, proc_width, pname); - strcat_to_buf (string, status_size, buf); - } - - if (line_width > 0) - { - sprintf (buf, "%s%*.*s ", LINE_PREFIX, - -line_width, line_width, line_buf); - strcat_to_buf (string, status_size, buf); - } - if (pc_width > 0) - { - strcat_to_buf (string, status_size, PC_PREFIX); - strcat_to_buf (string, status_size, pc_buf); - } - - - for (i = strlen (string); i < status_size; i++) - string[i] = ' '; - string[status_size] = (char) 0; - - ui_file_delete (pc_out); - return string; -} - -/* Get a printable name for the function at the address. - The symbol name is demangled if demangling is turned on. - Returns a pointer to a static area holding the result. */ -static char* -tui_get_function_from_frame (struct frame_info *fi) -{ - static char name[256]; - struct ui_file *stream = tui_sfileopen (256); - char *p; - - print_address_symbolic (get_frame_pc (fi), stream, demangle, ""); - p = tui_file_get_strbuf (stream); - - /* Use simple heuristics to isolate the function name. The symbol can - be demangled and we can have function parameters. Remove them because - the status line is too short to display them. */ - if (*p == '<') - p++; - strncpy (name, p, sizeof (name)); - p = strchr (name, '('); - if (!p) - p = strchr (name, '>'); - if (p) - *p = 0; - p = strchr (name, '+'); - if (p) - *p = 0; - ui_file_delete (stream); - return name; -} - -/* - ** tuiShowLocatorContent() - */ -void -tuiShowLocatorContent (void) -{ - char *string; - TuiGenWinInfoPtr locator; - - locator = locatorWinInfoPtr (); - - if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL) - { - TuiWinElementPtr element; - - element = (TuiWinElementPtr) locator->content[0]; - - string = tui_make_status_line (&element->whichElement.locator); - wmove (locator->handle, 0, 0); - wstandout (locator->handle); - waddstr (locator->handle, string); - wclrtoeol (locator->handle); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - xfree (string); - locator->contentInUse = TRUE; - } -} - - -/* Set the filename portion of the locator. */ -static void -tui_set_locator_filename (const char *filename) -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiLocatorElementPtr element; - - if (locator->content[0] == (Opaque) NULL) - { - tui_set_locator_info (filename, NULL, 0, 0); - return; - } - - element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator; - element->fileName[0] = 0; - strcat_to_buf (element->fileName, MAX_LOCATOR_ELEMENT_LEN, filename); -} - -/* Update the locator, with the provided arguments. */ -static void -tui_set_locator_info (const char *filename, const char *procname, int lineno, - CORE_ADDR addr) -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiLocatorElementPtr element; - - /* Allocate the locator content if necessary. */ - if (locator->contentSize <= 0) - { - locator->content = (OpaquePtr) allocContent (1, locator->type); - locator->contentSize = 1; - } - - element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator; - element->procName[0] = (char) 0; - strcat_to_buf (element->procName, MAX_LOCATOR_ELEMENT_LEN, procname); - element->lineNo = lineno; - element->addr = addr; - tui_set_locator_filename (filename); -} - -/* Update only the filename portion of the locator. */ -void -tuiUpdateLocatorFilename (const char *filename) -{ - tui_set_locator_filename (filename); - tuiShowLocatorContent (); -} - -/* Function to print the frame information for the TUI. */ -void -tuiShowFrameInfo (struct frame_info *fi) -{ - TuiWinInfoPtr winInfo; - register int i; - - if (fi) - { - register int startLine, i; - CORE_ADDR low; - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - int sourceAlreadyDisplayed; - struct symtab_and_line sal; - - find_frame_sal (fi, &sal); - - sourceAlreadyDisplayed = sal.symtab != 0 - && tuiSourceIsDisplayed (sal.symtab->filename); - tui_set_locator_info (sal.symtab == 0 ? "??" : sal.symtab->filename, - tui_get_function_from_frame (fi), - sal.line, - get_frame_pc (fi)); - tuiShowLocatorContent (); - startLine = 0; - for (i = 0; i < (sourceWindows ())->count; i++) - { - TuiWhichElement *item; - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - - item = &((TuiWinElementPtr) locator->content[0])->whichElement; - if (winInfo == srcWin) - { - startLine = (item->locator.lineNo - - (winInfo->generic.viewportHeight / 2)) + 1; - if (startLine <= 0) - startLine = 1; - } - else - { - if (find_pc_partial_function (get_frame_pc (fi), (char **) NULL, - &low, (CORE_ADDR) NULL) == 0) - error ("No function contains program counter for selected frame.\n"); - else - low = tuiGetLowDisassemblyAddress (low, get_frame_pc (fi)); - } - - if (winInfo == srcWin) - { - TuiLineOrAddress l; - l.lineNo = startLine; - if (!(sourceAlreadyDisplayed - && tuiLineIsDisplayed (item->locator.lineNo, winInfo, TRUE))) - tuiUpdateSourceWindow (winInfo, sal.symtab, l, TRUE); - else - { - l.lineNo = item->locator.lineNo; - tuiSetIsExecPointAt (l, winInfo); - } - } - else - { - if (winInfo == disassemWin) - { - TuiLineOrAddress a; - a.addr = low; - if (!tuiAddrIsDisplayed (item->locator.addr, winInfo, TRUE)) - tuiUpdateSourceWindow (winInfo, sal.symtab, a, TRUE); - else - { - a.addr = item->locator.addr; - tuiSetIsExecPointAt (a, winInfo); - } - } - } - tuiUpdateExecInfo (winInfo); - } - } - else - { - tui_set_locator_info (NULL, NULL, 0, (CORE_ADDR) 0); - tuiShowLocatorContent (); - for (i = 0; i < (sourceWindows ())->count; i++) - { - winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; - tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT); - tuiUpdateExecInfo (winInfo); - } - } -} - -/* Function to initialize gdb commands, for tui window stack manipulation. */ -void -_initialize_tuiStack (void) -{ - add_com ("update", class_tui, tui_update_command, - "Update the source window and locator to display the current " - "execution point.\n"); -} - -/* Command to update the display with the current execution point. */ -static void -tui_update_command (char *arg, int from_tty) -{ - char cmd[sizeof("frame 0")]; - - strcpy (cmd, "frame 0"); - execute_command (cmd, from_tty); -} |