X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2FtuiStack.c;h=a6ad07af1c39a6cce92f585ce238087eccfad53d;hb=997b095265d6d41787628c5c18d205e9ef9fb175;hp=d891539d8b47998d52027e6206c6394f859cc6ed;hpb=f377b40658dff9c2e0ba500f455be88f34ad3dbd;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tuiStack.c b/gdb/tui/tuiStack.c index d891539d8b..a6ad07af1c 100644 --- a/gdb/tui/tuiStack.c +++ b/gdb/tui/tuiStack.c @@ -1,5 +1,8 @@ /* TUI display locator. - Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + + Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, + Inc. + Contributed by Hewlett-Packard Company. This file is part of GDB. @@ -23,68 +26,229 @@ #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 +#else +#ifdef HAVE_CURSES_H +#include +#endif +#endif -/***************************************** -** STATIC LOCAL FUNCTIONS FORWARD DECLS ** -******************************************/ - -static char *_getFuncNameFromFrame (struct frame_info *); -static void _tuiUpdateLocation_command (char *, int); +/* 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); -/***************************************** -** PUBLIC FUNCTION ** -******************************************/ +static void tui_update_command (char *, int); + -/* - ** tuiClearLocatorDisplay() - */ -void -#ifdef __STDC__ -tuiClearLocatorDisplay (void) -#else -tuiClearLocatorDisplay () -#endif +/* 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) { - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - int i; + 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; - if (locator->handle != (WINDOW *) NULL) + 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) { - /* No need to werase, since writing a line of - * blanks which we do below, is equivalent. - */ - /* werase(locator->handle); */ - wmove (locator->handle, 0, 0); - wstandout (locator->handle); - for (i = 0; i < locator->width; i++) - waddch (locator->handle, ' '); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - locator->contentInUse = FALSE; + 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, " "); } - return; -} /* tuiClearLocatorDisplay */ + /* 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 -#ifdef __STDC__ tuiShowLocatorContent (void) -#else -tuiShowLocatorContent () -#endif { char *string; TuiGenWinInfoPtr locator; @@ -93,301 +257,76 @@ tuiShowLocatorContent () 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); - wstandend (locator->handle); - tuiRefreshWin (locator); - wmove (locator->handle, 0, 0); - if (string != nullStr ()) - tuiFree (string); - locator->contentInUse = TRUE; - } - } - - return; -} /* tuiShowLocatorContent */ + TuiWinElementPtr element; + element = (TuiWinElementPtr) locator->content[0]; -/* - ** tuiSetLocatorInfo(). - ** Function to update the locator, with the provided arguments. - */ -void -#ifdef __STDC__ -tuiSetLocatorInfo ( - char *fname, - char *procname, - int lineNo, - Opaque addr, - TuiLocatorElementPtr element) -#else -tuiSetLocatorInfo (fname, procname, lineNo, addr, element) - char *fname; - char *procname; - int lineNo; - Opaque addr; - TuiLocatorElementPtr element; -#endif -{ -#ifdef COMMENT - /* first free the old info */ - if (element->fileName) - tuiFree (element->fileName); - if (element->procName) - tuiFree (element->procName); - - if (fname == (char *) NULL) - element->fileName = fname; - else - element->fileName = tuiStrDup (fname); - if (procname == (char *) NULL) - element->procName = procname; - else - element->procName = tuiStrDup (procname); -#else - element->fileName[0] = (char) 0; - element->procName[0] = (char) 0; - strcat_to_buf (element->fileName, MAX_LOCATOR_ELEMENT_LEN, fname); - strcat_to_buf (element->procName, MAX_LOCATOR_ELEMENT_LEN, procname); -#endif - element->lineNo = lineNo; - element->addr = (Opaque) addr; - - return; -} /* tuiSetLocatorInfo */ - - -/* - ** tuiUpdateLocatorFilename(). - ** Update only the filename portion of the locator. - */ -void -#ifdef __STDC__ -tuiUpdateLocatorFilename ( - char *fileName) -#else -tuiUpdateLocatorFilename (fileName) - char *fileName; -#endif -{ - TuiGenWinInfoPtr locator = locatorWinInfoPtr (); - - if (locator->content[0] == (Opaque) NULL) - tuiSetLocatorContent ((struct frame_info *) NULL); - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName[0] = (char) 0; - strcat_to_buf (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName, - MAX_LOCATOR_ELEMENT_LEN, - fileName); - - tuiShowLocatorContent (); - - return; -} /* tuiUpdateLocatorFilename */ - - -/* - ** tui_vUpdateLocatorFilename(). - ** Update only the filename portion of the locator with args in a va_list. - */ -void -#ifdef __STDC__ -tui_vUpdateLocatorFilename ( - va_list args) -#else -tui_vUpdateLocatorFilename (args) - va_list args; -#endif -{ - char *fileName; - - fileName = va_arg (args, char *); - tuiUpdateLocatorFilename (fileName); - - return; -} /* tui_vUpdateLocatorFilename */ + 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; + } +} -/* - ** tuiSwitchFilename(). - ** Update the filename portion of the locator. Clear the other info in locator. - ** (elz) - */ -void -#ifdef __STDC__ -tuiSwitchFilename ( - char *fileName) -#else -tuiSwitchFilename (fileName) - char *fileName; -#endif +/* 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) - tuiSetLocatorContent ((struct frame_info *) NULL); - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName[0] = (char) 0; - - tuiSetLocatorInfo (fileName, - (char *) NULL, - 0, - (Opaque) NULL, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - - tuiShowLocatorContent (); - - return; -} /* tuiSwitchFilename */ - - -/* - ** tuiGetLocatorFilename(). - ** Get the filename portion of the locator. - ** (elz) - */ -void -#ifdef __STDC__ -tuiGetLocatorFilename ( - TuiGenWinInfoPtr locator, - char **filename) -#else -tuiGetLocatorFilename (locator, filename) - TuiGenWinInfoPtr locator; - char **filename; -#endif -{ - - /* the current filename could be non known, in which case the xmalloc would - allocate no memory, because the length would be 0 */ - if (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName) { - int name_length = - strlen (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName); - - (*filename) = (char *) xmalloc (name_length + 1); - strcpy ((*filename), - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName); + tui_set_locator_info (filename, NULL, 0, 0); + return; } - return; -} /* tuiGetLocatorFilename */ - - -/* - ** tuiUpdateLocatorInfoFromFrame(). - ** Function to update the locator, with the information extracted from frameInfo - */ -void -#ifdef __STDC__ -tuiUpdateLocatorInfoFromFrame ( - struct frame_info *frameInfo, - TuiLocatorElementPtr element) -#else -tuiUpdateLocatorInfoFromFrame (frameInfo, element) - struct frame_info *frameInfo; - TuiLocatorElementPtr element; -#endif -{ - 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) - tuiSetLocatorInfo (symtabAndLine.symtab->filename, - _getFuncNameFromFrame (frameInfo), - symtabAndLine.line, - (Opaque) frameInfo->pc, - element); - else - tuiSetLocatorInfo ((char *) NULL, - _getFuncNameFromFrame (frameInfo), - 0, - (Opaque) frameInfo->pc, - element); - - return; -} /* tuiUpdateLocatorInfoFromFrame */ + element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator; + element->fileName[0] = 0; + strcat_to_buf (element->fileName, MAX_LOCATOR_ELEMENT_LEN, filename); +} - -/* - ** tuiSetLocatorContent(). - ** Function to set the content of the locator - */ -void -#ifdef __STDC__ -tuiSetLocatorContent ( - struct frame_info *frameInfo) -#else -tuiSetLocatorContent (frameInfo) - struct frame_info *frameInfo; -#endif +/* 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 (); - TuiWinElementPtr element; - struct symtab_and_line symtabAndLine; + TuiLocatorElementPtr element; - /* Allocate the element if necessary */ + /* Allocate the locator content 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->content = (OpaquePtr) allocContent (1, locator->type); locator->contentSize = 1; } - if (frameInfo != (struct frame_info *) NULL) - tuiUpdateLocatorInfoFromFrame (frameInfo, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - else - tuiSetLocatorInfo ((char *) NULL, - (char *) NULL, - 0, - (Opaque) NULL, - &((TuiWinElementPtr) locator->content[0])->whichElement.locator); - return; -} /* tuiSetLocatorContent */ - + 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); +} -/* - ** tuiUpdateLocatorDisplay(). - ** Function to update the locator display - */ +/* Update only the filename portion of the locator. */ void -#ifdef __STDC__ -tuiUpdateLocatorDisplay ( - struct frame_info *frameInfo) -#else -tuiUpdateLocatorDisplay (frameInfo) - struct frame_info *frameInfo; -#endif +tuiUpdateLocatorFilename (const char *filename) { - tuiClearLocatorDisplay (); - tuiSetLocatorContent (frameInfo); + tui_set_locator_filename (filename); tuiShowLocatorContent (); +} - return; -} /* tuiUpdateLocatorDisplay */ - - -/* - ** tuiShowFrameInfo(). - ** Function to print the frame inforrmation for the TUI. - */ +/* Function to print the frame information for the TUI. */ void -#ifdef __STDC__ -tuiShowFrameInfo ( - struct frame_info *fi) -#else -tuiShowFrameInfo (fi) - struct frame_info *fi; -#endif +tuiShowFrameInfo (struct frame_info *fi) { TuiWinInfoPtr winInfo; register int i; @@ -395,56 +334,69 @@ tuiShowFrameInfo (fi) if (fi) { register int startLine, i; - register struct symtab *s; CORE_ADDR low; TuiGenWinInfoPtr locator = locatorWinInfoPtr (); int sourceAlreadyDisplayed; - - - s = find_pc_symtab (fi->pc); - sourceAlreadyDisplayed = tuiSourceIsDisplayed (s->filename); - tuiUpdateLocatorDisplay (fi); + 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 = - (((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo - - (winInfo->generic.viewportHeight / 2)) + 1; + startLine = (item->locator.lineNo - + (winInfo->generic.viewportHeight / 2)) + 1; if (startLine <= 0) startLine = 1; } 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 = (CORE_ADDR) tuiGetLowDisassemblyAddress ((Opaque) low, (Opaque) fi->pc); + low = tuiGetLowDisassemblyAddress (low, get_frame_pc (fi)); } if (winInfo == srcWin) { - if (!(sourceAlreadyDisplayed && m_tuiLineDisplayedWithinThreshold ( - winInfo, - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo))) - tuiUpdateSourceWindow (winInfo, s, (Opaque) startLine, TRUE); + TuiLineOrAddress l; + l.lineNo = startLine; + if (!(sourceAlreadyDisplayed + && tuiLineIsDisplayed (item->locator.lineNo, winInfo, TRUE))) + tuiUpdateSourceWindow (winInfo, sal.symtab, l, TRUE); else - tuiSetIsExecPointAt ((Opaque) - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.lineNo, - winInfo); + { + l.lineNo = item->locator.lineNo; + tuiSetIsExecPointAt (l, winInfo); + } } else { if (winInfo == disassemWin) { - if (!m_tuiLineDisplayedWithinThreshold (winInfo, - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr)) - tuiUpdateSourceWindow (winInfo, s, (Opaque) low, TRUE); + TuiLineOrAddress a; + a.addr = low; + if (!tuiAddrIsDisplayed (item->locator.addr, winInfo, TRUE)) + tuiUpdateSourceWindow (winInfo, sal.symtab, a, TRUE); else - tuiSetIsExecPointAt ((Opaque) - ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr, - winInfo); + { + a.addr = item->locator.addr; + tuiSetIsExecPointAt (a, winInfo); + } } } tuiUpdateExecInfo (winInfo); @@ -452,7 +404,8 @@ tuiShowFrameInfo (fi) } else { - tuiUpdateLocatorDisplay (fi); + tui_set_locator_info (NULL, NULL, 0, (CORE_ADDR) 0); + tuiShowLocatorContent (); for (i = 0; i < (sourceWindows ())->count; i++) { winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; @@ -460,112 +413,23 @@ tuiShowFrameInfo (fi) tuiUpdateExecInfo (winInfo); } } +} - return; -} /* tuiShowFrameInfo */ - - -/* - ** tui_vShowFrameInfo(). - ** Function to print the frame inforrmation for the TUI with args in a va_list. - */ -void -#ifdef __STDC__ -tui_vShowFrameInfo ( - va_list args) -#else -tui_vShowFrameInfo (args) - va_list args; -#endif -{ - struct frame_info *fi; - - fi = va_arg (args, struct frame_info *); - tuiShowFrameInfo (fi); - - return; -} /* tui_vShowFrameInfo */ - - -/* - ** _initialize_tuiStack(). - ** Function to initialize gdb commands, for tui window stack manipulation. - */ +/* Function to initialize gdb commands, for tui window stack manipulation. */ void _initialize_tuiStack (void) { - if (tui_version) - { - add_com ("update", class_tui, _tuiUpdateLocation_command, - "Update the source window and locator to display the current execution point.\n"); - } + add_com ("update", class_tui, tui_update_command, + "Update the source window and locator to display the current " + "execution point.\n"); +} - return; -} /* _initialize_tuiStack */ - - -/***************************************** -** STATIC LOCAL FUNCTIONS ** -******************************************/ - -/* - ** _getFuncNameFromFrame(). - */ -static char * -#ifdef __STDC__ -_getFuncNameFromFrame ( - struct frame_info *frameInfo) -#else -_getFuncNameFromFrame (frameInfo) - struct frame_info *frameInfo; -#endif -{ - char *funcName = (char *) NULL; - - find_pc_partial_function (frameInfo->pc, - &funcName, - (CORE_ADDR *) NULL, - (CORE_ADDR *) NULL); - return funcName; -} /* _getFuncNameFromFrame */ - - -/* - ** _tuiUpdateLocation_command(). - ** Command to update the display with the current execution point - */ +/* Command to update the display with the current execution point. */ static void -#ifdef __STDC__ -_tuiUpdateLocation_command ( - char *arg, - int fromTTY) -#else -_tuiUpdateLocation_command (arg, fromTTY) - char *arg; - int fromTTY; -#endif +tui_update_command (char *arg, int from_tty) { -#ifndef TRY -extern void frame_command (char *, int); - frame_command ("0", FALSE); -#else - struct frame_info *curFrame; - - /* Obtain the current execution point */ - if ((curFrame = get_current_frame ()) != (struct frame_info *) NULL) - { - struct frame_info *frame; - int curLevel = 0; - - for (frame = get_prev_frame (curLevel); - (frame != (struct frame_info *) NULL && (frame != curFrame)); - frame = get_prev_frame (frame)) - curLevel++; - - if (curFrame != (struct frame_info *) NULL) - print_frame_info (frame, curLevel, 0, 1); - } -#endif + char cmd[sizeof("frame 0")]; - return; -} /* _tuiUpdateLocation_command */ + strcpy (cmd, "frame 0"); + execute_command (cmd, from_tty); +}