1 /* TUI display locator.
3 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
6 Contributed by Hewlett-Packard Company.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
25 /* FIXME: cagney/2002-02-28: The GDB coding standard indicates that
26 "defs.h" should be included first. Unfortunatly some systems
27 (currently Debian GNU/Linux) include the <stdbool.h> via <curses.h>
28 and they clash with "bfd.h"'s definiton of true/false. The correct
29 fix is to remove true/false from "bfd.h", however, until that
30 happens, hack around it by including "config.h" and <curses.h>
44 #include "breakpoint.h"
51 #include "tuiGeneralWin.h"
52 #include "tuiSource.h"
53 #include "tuiSourceWin.h"
56 /*****************************************
57 ** STATIC LOCAL FUNCTIONS FORWARD DECLS **
58 ******************************************/
60 static char *_getFuncNameFromFrame (struct frame_info
*);
61 static void _tuiUpdateLocation_command (char *, int);
65 /*****************************************
67 ******************************************/
70 ** tuiClearLocatorDisplay()
73 tuiClearLocatorDisplay (void)
75 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
78 if (locator
->handle
!= (WINDOW
*) NULL
)
80 /* No need to werase, since writing a line of
81 * blanks which we do below, is equivalent.
83 /* werase(locator->handle); */
84 wmove (locator
->handle
, 0, 0);
85 wstandout (locator
->handle
);
86 for (i
= 0; i
< locator
->width
; i
++)
87 waddch (locator
->handle
, ' ');
88 wstandend (locator
->handle
);
89 tuiRefreshWin (locator
);
90 wmove (locator
->handle
, 0, 0);
91 locator
->contentInUse
= FALSE
;
95 } /* tuiClearLocatorDisplay */
99 ** tuiShowLocatorContent()
102 tuiShowLocatorContent (void)
105 TuiGenWinInfoPtr locator
;
107 locator
= locatorWinInfoPtr ();
109 if (m_genWinPtrNotNull (locator
) && locator
->handle
!= (WINDOW
*) NULL
)
111 string
= displayableWinContentAt (locator
, 0);
112 if (string
!= (char *) NULL
)
114 wmove (locator
->handle
, 0, 0);
115 wstandout (locator
->handle
);
116 waddstr (locator
->handle
, string
);
117 wstandend (locator
->handle
);
118 tuiRefreshWin (locator
);
119 wmove (locator
->handle
, 0, 0);
120 if (string
!= nullStr ())
122 locator
->contentInUse
= TRUE
;
127 } /* tuiShowLocatorContent */
130 /* Update the locator, with the provided arguments. */
132 tuiSetLocatorInfo (char *fname
, char *procname
, int lineNo
,
133 CORE_ADDR addr
, TuiLocatorElementPtr element
)
135 element
->fileName
[0] = (char) 0;
136 element
->procName
[0] = (char) 0;
137 strcat_to_buf (element
->fileName
, MAX_LOCATOR_ELEMENT_LEN
, fname
);
138 strcat_to_buf (element
->procName
, MAX_LOCATOR_ELEMENT_LEN
, procname
);
139 element
->lineNo
= lineNo
;
140 element
->addr
= addr
;
145 ** tuiUpdateLocatorFilename().
146 ** Update only the filename portion of the locator.
149 tuiUpdateLocatorFilename (const char *fileName
)
151 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
153 if (locator
->content
[0] == (Opaque
) NULL
)
154 tuiSetLocatorContent ((struct frame_info
*) NULL
);
155 ((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
[0] = (char) 0;
156 strcat_to_buf (((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
,
157 MAX_LOCATOR_ELEMENT_LEN
,
160 tuiShowLocatorContent ();
163 } /* tuiUpdateLocatorFilename */
166 ** tuiSwitchFilename().
167 ** Update the filename portion of the locator. Clear the other info in locator.
171 tuiSwitchFilename (char *fileName
)
173 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
175 if (locator
->content
[0] == (Opaque
) NULL
)
176 tuiSetLocatorContent ((struct frame_info
*) NULL
);
177 ((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
[0] = (char) 0;
179 tuiSetLocatorInfo (fileName
,
183 &((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
);
185 tuiShowLocatorContent ();
188 } /* tuiSwitchFilename */
192 ** tuiGetLocatorFilename().
193 ** Get the filename portion of the locator.
197 tuiGetLocatorFilename (TuiGenWinInfoPtr locator
, char **filename
)
200 /* the current filename could be non known, in which case the xmalloc would
201 allocate no memory, because the length would be 0 */
202 if (((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
)
205 strlen (((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
);
207 (*filename
) = (char *) xmalloc (name_length
+ 1);
209 ((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
.fileName
);
213 } /* tuiGetLocatorFilename */
217 ** tuiUpdateLocatorInfoFromFrame().
218 ** Function to update the locator, with the information extracted from frameInfo
221 tuiUpdateLocatorInfoFromFrame (struct frame_info
*frameInfo
,
222 TuiLocatorElementPtr element
)
224 struct symtab_and_line symtabAndLine
;
226 /* now get the new info */
227 symtabAndLine
= find_pc_line (frameInfo
->pc
,
228 (frameInfo
->next
!= (struct frame_info
*) NULL
&&
229 !frameInfo
->next
->signal_handler_caller
&&
230 !frame_in_dummy (frameInfo
->next
)));
231 if (symtabAndLine
.symtab
&& symtabAndLine
.symtab
->filename
)
232 tuiSetLocatorInfo (symtabAndLine
.symtab
->filename
,
233 _getFuncNameFromFrame (frameInfo
),
238 tuiSetLocatorInfo ((char *) NULL
,
239 _getFuncNameFromFrame (frameInfo
),
245 } /* tuiUpdateLocatorInfoFromFrame */
249 ** tuiSetLocatorContent().
250 ** Function to set the content of the locator
253 tuiSetLocatorContent (struct frame_info
*frameInfo
)
255 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
256 TuiWinElementPtr element
;
257 struct symtab_and_line symtabAndLine
;
259 /* Allocate the element if necessary */
260 if (locator
->contentSize
<= 0)
262 TuiWinContent contentPtr
;
264 if ((locator
->content
= (OpaquePtr
) allocContent (1, locator
->type
)) == (OpaquePtr
) NULL
)
265 error ("Unable to Allocate Memory to Display Location.");
266 locator
->contentSize
= 1;
269 if (frameInfo
!= (struct frame_info
*) NULL
)
270 tuiUpdateLocatorInfoFromFrame (frameInfo
,
271 &((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
);
273 tuiSetLocatorInfo ((char *) NULL
,
277 &((TuiWinElementPtr
) locator
->content
[0])->whichElement
.locator
);
279 } /* tuiSetLocatorContent */
283 ** tuiUpdateLocatorDisplay().
284 ** Function to update the locator display
287 tuiUpdateLocatorDisplay (struct frame_info
*frameInfo
)
289 tuiClearLocatorDisplay ();
290 tuiSetLocatorContent (frameInfo
);
291 tuiShowLocatorContent ();
294 } /* tuiUpdateLocatorDisplay */
298 ** tuiShowFrameInfo().
299 ** Function to print the frame inforrmation for the TUI.
302 tuiShowFrameInfo (struct frame_info
*fi
)
304 TuiWinInfoPtr winInfo
;
309 register int startLine
, i
;
310 register struct symtab
*s
;
312 TuiGenWinInfoPtr locator
= locatorWinInfoPtr ();
313 int sourceAlreadyDisplayed
;
316 s
= find_pc_symtab (fi
->pc
);
321 sourceAlreadyDisplayed
= tuiSourceIsDisplayed (s
->filename
);
322 tuiUpdateLocatorDisplay (fi
);
323 for (i
= 0; i
< (sourceWindows ())->count
; i
++)
325 TuiWhichElement
*item
;
326 winInfo
= (TuiWinInfoPtr
) (sourceWindows ())->list
[i
];
328 item
= &((TuiWinElementPtr
) locator
->content
[0])->whichElement
;
329 if (winInfo
== srcWin
)
331 startLine
= (item
->locator
.lineNo
-
332 (winInfo
->generic
.viewportHeight
/ 2)) + 1;
338 if (find_pc_partial_function (fi
->pc
, (char **) NULL
, &low
, (CORE_ADDR
) NULL
) == 0)
339 error ("No function contains program counter for selected frame.\n");
341 low
= tuiGetLowDisassemblyAddress (low
, fi
->pc
);
344 if (winInfo
== srcWin
)
347 l
.lineNo
= startLine
;
348 if (!(sourceAlreadyDisplayed
349 && tuiLineIsDisplayed (item
->locator
.lineNo
, winInfo
, TRUE
)))
350 tuiUpdateSourceWindow (winInfo
, s
, l
, TRUE
);
353 l
.lineNo
= item
->locator
.lineNo
;
354 tuiSetIsExecPointAt (l
, winInfo
);
359 if (winInfo
== disassemWin
)
363 if (!tuiAddrIsDisplayed (item
->locator
.addr
, winInfo
, TRUE
))
364 tuiUpdateSourceWindow (winInfo
, s
, a
, TRUE
);
367 a
.addr
= item
->locator
.addr
;
368 tuiSetIsExecPointAt (a
, winInfo
);
372 tuiUpdateExecInfo (winInfo
);
377 tuiUpdateLocatorDisplay (fi
);
378 for (i
= 0; i
< (sourceWindows ())->count
; i
++)
380 winInfo
= (TuiWinInfoPtr
) (sourceWindows ())->list
[i
];
381 tuiClearSourceContent (winInfo
, EMPTY_SOURCE_PROMPT
);
382 tuiUpdateExecInfo (winInfo
);
387 } /* tuiShowFrameInfo */
390 ** _initialize_tuiStack().
391 ** Function to initialize gdb commands, for tui window stack manipulation.
394 _initialize_tuiStack (void)
396 add_com ("update", class_tui
, _tuiUpdateLocation_command
,
397 "Update the source window and locator to display the current execution point.\n");
401 /*****************************************
402 ** STATIC LOCAL FUNCTIONS **
403 ******************************************/
406 ** _getFuncNameFromFrame().
409 _getFuncNameFromFrame (struct frame_info
*frameInfo
)
411 char *funcName
= (char *) NULL
;
413 find_pc_partial_function (frameInfo
->pc
,
418 } /* _getFuncNameFromFrame */
422 ** _tuiUpdateLocation_command().
423 ** Command to update the display with the current execution point
426 _tuiUpdateLocation_command (char *arg
, int fromTTY
)
429 extern void frame_command (char *, int);
430 frame_command ("0", FALSE
);
432 struct frame_info
*curFrame
;
434 /* Obtain the current execution point */
435 if ((curFrame
= get_current_frame ()) != (struct frame_info
*) NULL
)
437 struct frame_info
*frame
;
440 for (frame
= get_prev_frame (curLevel
);
441 (frame
!= (struct frame_info
*) NULL
&& (frame
!= curFrame
));
442 frame
= get_prev_frame (frame
))
445 if (curFrame
!= (struct frame_info
*) NULL
)
446 print_frame_info (frame
, curLevel
, 0, 1);
451 } /* _tuiUpdateLocation_command */