* h8300s now new target, not alias of h8300h
[deliverable/binutils-gdb.git] / gdb / tui / tuiStack.c
... / ...
CommitLineData
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
60static char *_getFuncNameFromFrame (struct frame_info *);
61static void _tuiUpdateLocation_command (char *, int);
62
63
64
65/*****************************************
66** PUBLIC FUNCTION **
67******************************************/
68
69/*
70 ** tuiClearLocatorDisplay()
71 */
72void
73tuiClearLocatorDisplay (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 */
101void
102tuiShowLocatorContent (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. */
131void
132tuiSetLocatorInfo (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 */
148void
149tuiUpdateLocatorFilename (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 */
170void
171tuiSwitchFilename (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 */
196void
197tuiGetLocatorFilename (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 */
220void
221tuiUpdateLocatorInfoFromFrame (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 */
252void
253tuiSetLocatorContent (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 */
286void
287tuiUpdateLocatorDisplay (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 */
301void
302tuiShowFrameInfo (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 */
393void
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 */
408static 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 */
425static void
426_tuiUpdateLocation_command (char *arg, int fromTTY)
427{
428#ifndef TRY
429extern 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.024131 seconds and 4 git commands to generate.