X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2FtuiStack.c;h=a6ad07af1c39a6cce92f585ce238087eccfad53d;hb=997b095265d6d41787628c5c18d205e9ef9fb175;hp=24ccf157b163571a530714d5b7af4073863d1517;hpb=2e17b763858bedbceca90170874358c0769d2581;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tuiStack.c b/gdb/tui/tuiStack.c index 24ccf157b1..a6ad07af1c 100644 --- a/gdb/tui/tuiStack.c +++ b/gdb/tui/tuiStack.c @@ -1,6 +1,6 @@ /* TUI display locator. - Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, + Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -22,28 +22,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* FIXME: cagney/2002-02-28: The GDB coding standard indicates that - "defs.h" should be included first. Unfortunatly some systems - (currently Debian GNU/Linux) include the via - and they clash with "bfd.h"'s definiton of true/false. The correct - fix is to remove true/false from "bfd.h", however, until that - happens, hack around it by including "config.h" and - first. */ - -#include "config.h" -#ifdef HAVE_NCURSES_H -#include -#else -#ifdef HAVE_CURSES_H -#include -#endif -#endif - #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" @@ -54,6 +39,13 @@ #include "tuiSourceWin.h" #include "tui-file.h" +#ifdef HAVE_NCURSES_H +#include +#else +#ifdef HAVE_CURSES_H +#include +#endif +#endif /* Get a printable name for the function at the address. The symbol name is demangled if demangling is turned on. @@ -65,13 +57,161 @@ 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, - TuiLocatorElementPtr element); + 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; -/* Function to set the content of the locator. */ -static void tuiSetLocatorContent (struct frame_info *frameInfo); + 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. @@ -83,7 +223,7 @@ tui_get_function_from_frame (struct frame_info *fi) struct ui_file *stream = tui_sfileopen (256); char *p; - print_address_symbolic (fi->pc, stream, demangle, ""); + 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 @@ -117,24 +257,23 @@ tuiShowLocatorContent (void) if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL) { - string = displayableWinContentAt (locator, 0); - if (string != (char *) NULL) - { - 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); - if (string != nullStr ()) - tuiFree (string); - locator->contentInUse = TRUE; - } + 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; } +} - return; -} /* tuiShowLocatorContent */ /* Set the filename portion of the locator. */ static void @@ -144,7 +283,10 @@ tui_set_locator_filename (const char *filename) TuiLocatorElementPtr element; if (locator->content[0] == (Opaque) NULL) - tuiSetLocatorContent ((struct frame_info *) NULL); + { + tui_set_locator_info (filename, NULL, 0, 0); + return; + } element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator; element->fileName[0] = 0; @@ -154,8 +296,19 @@ 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, TuiLocatorElementPtr element) + 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; @@ -163,7 +316,6 @@ tui_set_locator_info (const char *filename, const char *procname, int lineno, tui_set_locator_filename (filename); } - /* Update only the filename portion of the locator. */ void tuiUpdateLocatorFilename (const char *filename) @@ -172,72 +324,7 @@ tuiUpdateLocatorFilename (const char *filename) tuiShowLocatorContent (); } -/* - ** tuiUpdateLocatorInfoFromFrame(). - ** Function to update the locator, with the information extracted from frameInfo - */ -static void -tuiUpdateLocatorInfoFromFrame (struct frame_info *frameInfo, - TuiLocatorElementPtr element) -{ - struct symtab_and_line symtabAndLine; - - /* now get the new info */ - symtabAndLine = find_pc_line (frameInfo->pc, - (frameInfo->next != (struct frame_info *) NULL && - !frameInfo->next->signal_handler_caller && - !frame_in_dummy (frameInfo->next))); - if (symtabAndLine.symtab && symtabAndLine.symtab->filename) - tui_set_locator_info (symtabAndLine.symtab->filename, - tui_get_function_from_frame (frameInfo), - symtabAndLine.line, - frameInfo->pc, - element); - else - tui_set_locator_info ((char *) NULL, - tui_get_function_from_frame (frameInfo), - 0, - frameInfo->pc, - element); - - return; -} /* tuiUpdateLocatorInfoFromFrame */ - - -/* Function to set the content of the locator. */ -static void -tuiSetLocatorContent (struct frame_info *frameInfo) -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - TuiWinElementPtr element; - struct symtab_and_line symtabAndLine; - - /* Allocate the element if necessary */ - if (locator->contentSize <= 0) - { - TuiWinContent contentPtr; - - if ((locator->content = (OpaquePtr) allocContent (1, locator->type)) == (OpaquePtr) NULL) - error ("Unable to Allocate Memory to Display Location."); - locator->contentSize = 1; - } - - if (frameInfo != (struct frame_info *) NULL) - tuiUpdateLocatorInfoFromFrame (frameInfo, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - else - tui_set_locator_info ((char *) NULL, - (char *) NULL, - 0, - (CORE_ADDR) 0, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - return; -} /* tuiSetLocatorContent */ - -/* - ** tuiShowFrameInfo(). - ** Function to print the frame inforrmation for the TUI. - */ +/* Function to print the frame information for the TUI. */ void tuiShowFrameInfo (struct frame_info *fi) { @@ -247,20 +334,21 @@ tuiShowFrameInfo (struct frame_info *fi) if (fi) { register int startLine, i; - register struct symtab *s; CORE_ADDR low; TuiGenWinInfoPtr locator = locatorWinInfoPtr (); int sourceAlreadyDisplayed; + struct symtab_and_line sal; + find_frame_sal (fi, &sal); - s = find_pc_symtab (fi->pc); - if (s == 0) - return; - - startLine = 0; - sourceAlreadyDisplayed = tuiSourceIsDisplayed (s->filename); - tuiSetLocatorContent (fi); + 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; @@ -276,10 +364,11 @@ tuiShowFrameInfo (struct frame_info *fi) } else { - if (find_pc_partial_function (fi->pc, (char **) NULL, &low, (CORE_ADDR) NULL) == 0) + 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, fi->pc); + low = tuiGetLowDisassemblyAddress (low, get_frame_pc (fi)); } if (winInfo == srcWin) @@ -288,7 +377,7 @@ tuiShowFrameInfo (struct frame_info *fi) l.lineNo = startLine; if (!(sourceAlreadyDisplayed && tuiLineIsDisplayed (item->locator.lineNo, winInfo, TRUE))) - tuiUpdateSourceWindow (winInfo, s, l, TRUE); + tuiUpdateSourceWindow (winInfo, sal.symtab, l, TRUE); else { l.lineNo = item->locator.lineNo; @@ -302,7 +391,7 @@ tuiShowFrameInfo (struct frame_info *fi) TuiLineOrAddress a; a.addr = low; if (!tuiAddrIsDisplayed (item->locator.addr, winInfo, TRUE)) - tuiUpdateSourceWindow (winInfo, s, a, TRUE); + tuiUpdateSourceWindow (winInfo, sal.symtab, a, TRUE); else { a.addr = item->locator.addr; @@ -315,7 +404,7 @@ tuiShowFrameInfo (struct frame_info *fi) } else { - tuiSetLocatorContent (fi); + tui_set_locator_info (NULL, NULL, 0, (CORE_ADDR) 0); tuiShowLocatorContent (); for (i = 0; i < (sourceWindows ())->count; i++) { @@ -324,9 +413,7 @@ tuiShowFrameInfo (struct frame_info *fi) tuiUpdateExecInfo (winInfo); } } - - return; -} /* tuiShowFrameInfo */ +} /* Function to initialize gdb commands, for tui window stack manipulation. */ void