43d022928f6e99b34f2caff95e415d1f55729257
[deliverable/binutils-gdb.git] / gdb / tui / tuiStack.c
1 /* TUI display locator.
2
3 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
4 Inc.
5
6 Contributed by Hewlett-Packard Company.
7
8 This file is part of GDB.
9
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.
14
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.
19
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. */
24
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>
31 first. */
32
33 #include "config.h"
34 #ifdef HAVE_NCURSES_H
35 #include <ncurses.h>
36 #else
37 #ifdef HAVE_CURSES_H
38 #include <curses.h>
39 #endif
40 #endif
41
42 #include "defs.h"
43 #include "symtab.h"
44 #include "breakpoint.h"
45 #include "frame.h"
46 #include "command.h"
47
48 #include "tui.h"
49 #include "tuiData.h"
50 #include "tuiStack.h"
51 #include "tuiGeneralWin.h"
52 #include "tuiSource.h"
53 #include "tuiSourceWin.h"
54
55
56 /*****************************************
57 ** STATIC LOCAL FUNCTIONS FORWARD DECLS **
58 ******************************************/
59
60 static char *_getFuncNameFromFrame (struct frame_info *);
61 static void _tuiUpdateLocation_command (char *, int);
62
63
64
65 /*****************************************
66 ** PUBLIC FUNCTION **
67 ******************************************/
68
69 /*
70 ** tuiClearLocatorDisplay()
71 */
72 void
73 tuiClearLocatorDisplay (void)
74 {
75 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
76 int i;
77
78 if (locator->handle != (WINDOW *) NULL)
79 {
80 /* No need to werase, since writing a line of
81 * blanks which we do below, is equivalent.
82 */
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;
92 }
93
94 return;
95 } /* tuiClearLocatorDisplay */
96
97
98 /*
99 ** tuiShowLocatorContent()
100 */
101 void
102 tuiShowLocatorContent (void)
103 {
104 char *string;
105 TuiGenWinInfoPtr locator;
106
107 locator = locatorWinInfoPtr ();
108
109 if (m_genWinPtrNotNull (locator) && locator->handle != (WINDOW *) NULL)
110 {
111 string = displayableWinContentAt (locator, 0);
112 if (string != (char *) NULL)
113 {
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 ())
121 tuiFree (string);
122 locator->contentInUse = TRUE;
123 }
124 }
125
126 return;
127 } /* tuiShowLocatorContent */
128
129
130 /* Update the locator, with the provided arguments. */
131 void
132 tuiSetLocatorInfo (char *fname, char *procname, int lineNo,
133 CORE_ADDR addr, TuiLocatorElementPtr element)
134 {
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;
141 }
142
143
144 /*
145 ** tuiUpdateLocatorFilename().
146 ** Update only the filename portion of the locator.
147 */
148 void
149 tuiUpdateLocatorFilename (const char *fileName)
150 {
151 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
152
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,
158 fileName);
159
160 tuiShowLocatorContent ();
161
162 return;
163 } /* tuiUpdateLocatorFilename */
164
165 /*
166 ** tuiSwitchFilename().
167 ** Update the filename portion of the locator. Clear the other info in locator.
168 ** (elz)
169 */
170 void
171 tuiSwitchFilename (char *fileName)
172 {
173 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
174
175 if (locator->content[0] == (Opaque) NULL)
176 tuiSetLocatorContent ((struct frame_info *) NULL);
177 ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName[0] = (char) 0;
178
179 tuiSetLocatorInfo (fileName,
180 (char *) NULL,
181 0,
182 (CORE_ADDR) 0,
183 &((TuiWinElementPtr) locator->content[0])->whichElement.locator);
184
185 tuiShowLocatorContent ();
186
187 return;
188 } /* tuiSwitchFilename */
189
190
191 /*
192 ** tuiGetLocatorFilename().
193 ** Get the filename portion of the locator.
194 ** (elz)
195 */
196 void
197 tuiGetLocatorFilename (TuiGenWinInfoPtr locator, char **filename)
198 {
199
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)
203 {
204 int name_length =
205 strlen (((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName);
206
207 (*filename) = (char *) xmalloc (name_length + 1);
208 strcpy ((*filename),
209 ((TuiWinElementPtr) locator->content[0])->whichElement.locator.fileName);
210 }
211
212 return;
213 } /* tuiGetLocatorFilename */
214
215
216 /*
217 ** tuiUpdateLocatorInfoFromFrame().
218 ** Function to update the locator, with the information extracted from frameInfo
219 */
220 void
221 tuiUpdateLocatorInfoFromFrame (struct frame_info *frameInfo,
222 TuiLocatorElementPtr element)
223 {
224 struct symtab_and_line symtabAndLine;
225
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),
234 symtabAndLine.line,
235 frameInfo->pc,
236 element);
237 else
238 tuiSetLocatorInfo ((char *) NULL,
239 _getFuncNameFromFrame (frameInfo),
240 0,
241 frameInfo->pc,
242 element);
243
244 return;
245 } /* tuiUpdateLocatorInfoFromFrame */
246
247
248 /*
249 ** tuiSetLocatorContent().
250 ** Function to set the content of the locator
251 */
252 void
253 tuiSetLocatorContent (struct frame_info *frameInfo)
254 {
255 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
256 TuiWinElementPtr element;
257 struct symtab_and_line symtabAndLine;
258
259 /* Allocate the element if necessary */
260 if (locator->contentSize <= 0)
261 {
262 TuiWinContent contentPtr;
263
264 if ((locator->content = (OpaquePtr) allocContent (1, locator->type)) == (OpaquePtr) NULL)
265 error ("Unable to Allocate Memory to Display Location.");
266 locator->contentSize = 1;
267 }
268
269 if (frameInfo != (struct frame_info *) NULL)
270 tuiUpdateLocatorInfoFromFrame (frameInfo,
271 &((TuiWinElementPtr) locator->content[0])->whichElement.locator);
272 else
273 tuiSetLocatorInfo ((char *) NULL,
274 (char *) NULL,
275 0,
276 (CORE_ADDR) 0,
277 &((TuiWinElementPtr) locator->content[0])->whichElement.locator);
278 return;
279 } /* tuiSetLocatorContent */
280
281
282 /*
283 ** tuiUpdateLocatorDisplay().
284 ** Function to update the locator display
285 */
286 void
287 tuiUpdateLocatorDisplay (struct frame_info *frameInfo)
288 {
289 tuiClearLocatorDisplay ();
290 tuiSetLocatorContent (frameInfo);
291 tuiShowLocatorContent ();
292
293 return;
294 } /* tuiUpdateLocatorDisplay */
295
296
297 /*
298 ** tuiShowFrameInfo().
299 ** Function to print the frame inforrmation for the TUI.
300 */
301 void
302 tuiShowFrameInfo (struct frame_info *fi)
303 {
304 TuiWinInfoPtr winInfo;
305 register int i;
306
307 if (fi)
308 {
309 register int startLine, i;
310 register struct symtab *s;
311 CORE_ADDR low;
312 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
313 int sourceAlreadyDisplayed;
314
315
316 s = find_pc_symtab (fi->pc);
317 if (s == 0)
318 return;
319
320 startLine = 0;
321 sourceAlreadyDisplayed = tuiSourceIsDisplayed (s->filename);
322 tuiUpdateLocatorDisplay (fi);
323 for (i = 0; i < (sourceWindows ())->count; i++)
324 {
325 TuiWhichElement *item;
326 winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i];
327
328 item = &((TuiWinElementPtr) locator->content[0])->whichElement;
329 if (winInfo == srcWin)
330 {
331 startLine = (item->locator.lineNo -
332 (winInfo->generic.viewportHeight / 2)) + 1;
333 if (startLine <= 0)
334 startLine = 1;
335 }
336 else
337 {
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");
340 else
341 low = tuiGetLowDisassemblyAddress (low, fi->pc);
342 }
343
344 if (winInfo == srcWin)
345 {
346 TuiLineOrAddress l;
347 l.lineNo = startLine;
348 if (!(sourceAlreadyDisplayed
349 && tuiLineIsDisplayed (item->locator.lineNo, winInfo, TRUE)))
350 tuiUpdateSourceWindow (winInfo, s, l, TRUE);
351 else
352 {
353 l.lineNo = item->locator.lineNo;
354 tuiSetIsExecPointAt (l, winInfo);
355 }
356 }
357 else
358 {
359 if (winInfo == disassemWin)
360 {
361 TuiLineOrAddress a;
362 a.addr = low;
363 if (!tuiAddrIsDisplayed (item->locator.addr, winInfo, TRUE))
364 tuiUpdateSourceWindow (winInfo, s, a, TRUE);
365 else
366 {
367 a.addr = item->locator.addr;
368 tuiSetIsExecPointAt (a, winInfo);
369 }
370 }
371 }
372 tuiUpdateExecInfo (winInfo);
373 }
374 }
375 else
376 {
377 tuiUpdateLocatorDisplay (fi);
378 for (i = 0; i < (sourceWindows ())->count; i++)
379 {
380 winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i];
381 tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT);
382 tuiUpdateExecInfo (winInfo);
383 }
384 }
385
386 return;
387 } /* tuiShowFrameInfo */
388
389 /*
390 ** _initialize_tuiStack().
391 ** Function to initialize gdb commands, for tui window stack manipulation.
392 */
393 void
394 _initialize_tuiStack (void)
395 {
396 add_com ("update", class_tui, _tuiUpdateLocation_command,
397 "Update the source window and locator to display the current execution point.\n");
398 }
399
400
401 /*****************************************
402 ** STATIC LOCAL FUNCTIONS **
403 ******************************************/
404
405 /*
406 ** _getFuncNameFromFrame().
407 */
408 static char *
409 _getFuncNameFromFrame (struct frame_info *frameInfo)
410 {
411 char *funcName = (char *) NULL;
412
413 find_pc_partial_function (frameInfo->pc,
414 &funcName,
415 (CORE_ADDR *) NULL,
416 (CORE_ADDR *) NULL);
417 return funcName;
418 } /* _getFuncNameFromFrame */
419
420
421 /*
422 ** _tuiUpdateLocation_command().
423 ** Command to update the display with the current execution point
424 */
425 static void
426 _tuiUpdateLocation_command (char *arg, int fromTTY)
427 {
428 #ifndef TRY
429 extern void frame_command (char *, int);
430 frame_command ("0", FALSE);
431 #else
432 struct frame_info *curFrame;
433
434 /* Obtain the current execution point */
435 if ((curFrame = get_current_frame ()) != (struct frame_info *) NULL)
436 {
437 struct frame_info *frame;
438 int curLevel = 0;
439
440 for (frame = get_prev_frame (curLevel);
441 (frame != (struct frame_info *) NULL && (frame != curFrame));
442 frame = get_prev_frame (frame))
443 curLevel++;
444
445 if (curFrame != (struct frame_info *) NULL)
446 print_frame_info (frame, curLevel, 0, 1);
447 }
448 #endif
449
450 return;
451 } /* _tuiUpdateLocation_command */
This page took 0.039115 seconds and 4 git commands to generate.