Remove definition of EM_MIPS_RS4_BE. The constant was never in active use
[deliverable/binutils-gdb.git] / gdb / tui / tuiSourceWin.c
CommitLineData
c906108c 1/*
c5aa993b
JM
2 ** tuiSourceWin.c
3 ** This module contains functions for displaying source or assembly in the "source" window.
4 * The "source" window may be the assembly or the source windows.
5 */
c906108c
SS
6
7#include "defs.h"
8#include <ctype.h>
9#include "symtab.h"
10#include "frame.h"
11#include "breakpoint.h"
12
13#include "tui.h"
14#include "tuiData.h"
15#include "tuiStack.h"
16#include "tuiSourceWin.h"
17#include "tuiSource.h"
18#include "tuiDisassem.h"
19
20
21/*****************************************
22** EXTERNAL FUNCTION DECLS **
23******************************************/
24
25/*****************************************
26** EXTERNAL DATA DECLS **
27******************************************/
28extern int current_source_line;
29extern struct symtab *current_source_symtab;
30
31
32/*****************************************
33** STATIC LOCAL FUNCTIONS FORWARD DECLS **
34******************************************/
35
36/*****************************************
37** STATIC LOCAL DATA **
38******************************************/
39
40
41/*****************************************
42** PUBLIC FUNCTIONS **
43******************************************/
44
45/*********************************
46** SOURCE/DISASSEM FUNCTIONS **
47*********************************/
48
49/*
c5aa993b
JM
50 ** tuiSrcWinIsDisplayed().
51 */
c906108c
SS
52int
53#ifdef __STDC__
54tuiSrcWinIsDisplayed (void)
55#else
56tuiSrcWinIsDisplayed ()
57#endif
58{
59 return (m_winPtrNotNull (srcWin) && srcWin->generic.isVisible);
60} /* tuiSrcWinIsDisplayed */
61
62
63/*
c5aa993b
JM
64 ** tuiAsmWinIsDisplayed().
65 */
c906108c
SS
66int
67#ifdef __STDC__
68tuiAsmWinIsDisplayed (void)
69#else
70tuiAsmWinIsDisplayed ()
71#endif
72{
73 return (m_winPtrNotNull (disassemWin) && disassemWin->generic.isVisible);
74} /* tuiAsmWinIsDisplayed */
75
76
77/*
c5aa993b
JM
78 ** tuiDisplayMainFunction().
79 ** Function to display the "main" routine"
80 */
c906108c
SS
81void
82#ifdef __STDC__
83tuiDisplayMainFunction (void)
84#else
85tuiDisplayMainFunction ()
86#endif
87{
88 if ((sourceWindows ())->count > 0)
89 {
90 CORE_ADDR addr;
91
92 addr = parse_and_eval_address ("main");
93 if (addr <= (CORE_ADDR) 0)
94 addr = parse_and_eval_address ("MAIN");
95 if (addr > (CORE_ADDR) 0)
96 {
97 struct symtab_and_line sal;
98
99 tuiUpdateSourceWindowsWithAddr ((Opaque) addr);
100 sal = find_pc_line (addr, 0);
101 tuiSwitchFilename (sal.symtab->filename);
102 }
103 }
104
105 return;
106} /* tuiDisplayMainFunction */
107
108
109
110/*
c5aa993b
JM
111 ** tuiUpdateSourceWindow().
112 ** Function to display source in the source window. This function
113 ** initializes the horizontal scroll to 0.
114 */
c906108c
SS
115void
116#ifdef __STDC__
117tuiUpdateSourceWindow (
118 TuiWinInfoPtr winInfo,
119 struct symtab *s,
120 Opaque lineOrAddr,
121 int noerror)
122#else
123tuiUpdateSourceWindow (winInfo, s, lineOrAddr, noerror)
124 TuiWinInfoPtr winInfo;
125 struct symtab *s;
126 Opaque lineOrAddr;
127 int noerror;
128#endif
129{
130 winInfo->detail.sourceInfo.horizontalOffset = 0;
131 tuiUpdateSourceWindowAsIs (winInfo, s, lineOrAddr, noerror);
132
133 return;
134} /* tuiUpdateSourceWindow */
135
136
137/*
c5aa993b
JM
138 ** tuiUpdateSourceWindowAsIs().
139 ** Function to display source in the source/asm window. This
140 ** function shows the source as specified by the horizontal offset.
141 */
c906108c
SS
142void
143#ifdef __STDC__
144tuiUpdateSourceWindowAsIs (
145 TuiWinInfoPtr winInfo,
146 struct symtab *s,
147 Opaque lineOrAddr,
148 int noerror)
149#else
150tuiUpdateSourceWindowAsIs (winInfo, s, lineOrAddr, noerror)
151 TuiWinInfoPtr winInfo;
152 struct symtab *s;
153 Opaque lineOrAddr;
154 int noerror;
155#endif
156{
157 TuiStatus ret;
158
159 if (winInfo->generic.type == SRC_WIN)
160 ret = tuiSetSourceContent (s, (int) lineOrAddr, noerror);
161 else
162 ret = tuiSetDisassemContent (s, (Opaque) lineOrAddr);
163
164 if (ret == TUI_FAILURE)
165 {
166 tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT);
167 tuiClearExecInfoContent (winInfo);
168 }
169 else
170 {
171 tuiEraseSourceContent (winInfo, NO_EMPTY_SOURCE_PROMPT);
172 tuiShowSourceContent (winInfo);
173 tuiUpdateExecInfo (winInfo);
174 if (winInfo->generic.type == SRC_WIN)
175 {
176 current_source_line = (int) lineOrAddr +
177 (winInfo->generic.contentSize - 2);
178 current_source_symtab = s;
179 /*
c5aa993b
JM
180 ** If the focus was in the asm win, put it in the src
181 ** win if we don't have a split layout
182 */
c906108c
SS
183 if (tuiWinWithFocus () == disassemWin &&
184 currentLayout () != SRC_DISASSEM_COMMAND)
185 tuiSetWinFocusTo (srcWin);
186 }
187 }
188
189
190 return;
191} /* tuiUpdateSourceWindowAsIs */
192
193
194/*
c5aa993b
JM
195 ** tuiUpdateSourceWindowsWithAddr().
196 ** Function to ensure that the source and/or disassemly windows
197 ** reflect the input address.
198 */
c906108c
SS
199void
200#ifdef __STDC__
201tuiUpdateSourceWindowsWithAddr (
202 Opaque addr)
203#else
204tuiUpdateSourceWindowsWithAddr (addr)
205 Opaque addr;
206#endif
207{
208 if (addr > (Opaque) NULL)
209 {
210 struct symtab_and_line sal;
211
212 switch (currentLayout ())
213 {
214 case DISASSEM_COMMAND:
215 case DISASSEM_DATA_COMMAND:
216 tuiShowDisassem (addr);
217 break;
218 case SRC_DISASSEM_COMMAND:
219 tuiShowDisassemAndUpdateSource (addr);
220 break;
221 default:
222 sal = find_pc_line ((CORE_ADDR) addr, 0);
223 tuiShowSource (sal.symtab,
224 (Opaque) sal.line,
225 FALSE);
226 break;
227 }
228 }
229 else
230 {
231 int i;
232
233 for (i = 0; i < (sourceWindows ())->count; i++)
234 {
235 TuiWinInfoPtr winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i];
236
237 tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT);
238 tuiClearExecInfoContent (winInfo);
239 }
240 }
241
242 return;
243} /* tuiUpdateSourceWindowsWithAddr */
244
245
246/*
c5aa993b
JM
247 ** tui_vUpdateSourceWindowsWithAddr()
248 ** Update the source window with the address in a va_list
249 */
c906108c
SS
250void
251#ifdef __STDC__
252tui_vUpdateSourceWindowsWithAddr (
253 va_list args)
254#else
255tui_vUpdateSourceWindowsWithAddr (args)
256 va_list args;
257#endif
258{
259 Opaque addr = va_arg (args, Opaque);
260
261 tuiUpdateSourceWindowsWithAddr (addr);
262
263 return;
264} /* tui_vUpdateSourceWindowsWithAddr */
265
266
267/*
c5aa993b
JM
268 ** tuiUpdateSourceWindowsWithLine().
269 ** Function to ensure that the source and/or disassemly windows
270 ** reflect the input address.
271 */
c906108c
SS
272void
273#ifdef __STDC__
274tuiUpdateSourceWindowsWithLine (
275 struct symtab *s,
276 int line)
277#else
278tuiUpdateSourceWindowsWithLine (s, line)
279 struct symtab *s;
280 int line;
281#endif
282{
283 switch (currentLayout ())
284 {
285 case DISASSEM_COMMAND:
286 case DISASSEM_DATA_COMMAND:
287 tuiUpdateSourceWindowsWithAddr ((Opaque) find_line_pc (s, line));
288 break;
289 default:
290 tuiShowSource (s, (Opaque) line, FALSE);
291 if (currentLayout () == SRC_DISASSEM_COMMAND)
292 tuiShowDisassem ((Opaque) find_line_pc (s, line));
293 break;
294 }
295
296 return;
297} /* tuiUpdateSourceWindowsWithLine */
298
299
300/*
c5aa993b
JM
301 ** tui_vUpdateSourceWindowsWithLine()
302 ** Update the source window with the line number in a va_list
303 */
c906108c
SS
304void
305#ifdef __STDC__
306tui_vUpdateSourceWindowsWithLine (
307 va_list args)
308#else
309tui_vUpdateSourceWindowsWithLine (args)
310 va_list args;
311#endif
312{
313 struct symtab *s = va_arg (args, struct symtab *);
314 int line = va_arg (args, int);
315
316 tuiUpdateSourceWindowsWithLine (s, line);
317
318 return;
319} /* tui_vUpdateSourceWindowsWithLine */
320
321
322/*
c5aa993b
JM
323 ** tuiClearSourceContent().
324 */
c906108c
SS
325void
326#ifdef __STDC__
327tuiClearSourceContent (
328 TuiWinInfoPtr winInfo,
329 int displayPrompt)
330#else
331tuiClearSourceContent (winInfo, displayPrompt)
332 TuiWinInfoPtr winInfo;
333 int displayPrompt;
334#endif
335{
336 if (m_winPtrNotNull (winInfo))
337 {
338 register int i;
339
340 winInfo->generic.contentInUse = FALSE;
341 tuiEraseSourceContent (winInfo, displayPrompt);
342 for (i = 0; i < winInfo->generic.contentSize; i++)
343 {
344 TuiWinElementPtr element =
345 (TuiWinElementPtr) winInfo->generic.content[i];
346 element->whichElement.source.hasBreak = FALSE;
347 element->whichElement.source.isExecPoint = FALSE;
348 }
349 }
350
351 return;
352} /* tuiClearSourceContent */
353
354
355/*
c5aa993b
JM
356 ** tuiClearAllSourceWinsContent().
357 */
c906108c
SS
358void
359#ifdef __STDC__
360tuiClearAllSourceWinsContent (
361 int displayPrompt)
362#else
363tuiClearAllSourceWinsContent (displayPrompt)
364 int displayPrompt;
365#endif
366{
367 int i;
368
369 for (i = 0; i < (sourceWindows ())->count; i++)
370 tuiClearSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i],
371 displayPrompt);
372
373 return;
374} /* tuiClearAllSourceWinsContent */
375
376
377/*
c5aa993b
JM
378 ** tuiEraseSourceContent().
379 */
c906108c
SS
380void
381#ifdef __STDC__
382tuiEraseSourceContent (
383 TuiWinInfoPtr winInfo,
384 int displayPrompt)
385#else
386tuiEraseSourceContent (winInfo, displayPrompt)
387 TuiWinInfoPtr winInfo;
388 int displayPrompt;
389#endif
390{
391 int xPos;
392 int halfWidth = (winInfo->generic.width - 2) / 2;
393
394 if (winInfo->generic.handle != (WINDOW *) NULL)
395 {
396 werase (winInfo->generic.handle);
397 checkAndDisplayHighlightIfNeeded (winInfo);
398 if (displayPrompt == EMPTY_SOURCE_PROMPT)
399 {
400 char *noSrcStr;
401
402 if (winInfo->generic.type == SRC_WIN)
403 noSrcStr = NO_SRC_STRING;
404 else
405 noSrcStr = NO_DISASSEM_STRING;
406 if (strlen (noSrcStr) >= halfWidth)
407 xPos = 1;
408 else
409 xPos = halfWidth - strlen (noSrcStr);
410 mvwaddstr (winInfo->generic.handle,
411 (winInfo->generic.height / 2),
412 xPos,
413 noSrcStr);
414
415 /* elz: added this function call to set the real contents of
c5aa993b
JM
416 the window to what is on the screen, so that later calls
417 to refresh, do display
418 the correct stuff, and not the old image */
c906108c
SS
419
420 tuiSetSourceContentNil (winInfo, noSrcStr);
421 }
422 tuiRefreshWin (&winInfo->generic);
423 }
424 return;
425} /* tuiEraseSourceContent */
426
427
428/*
c5aa993b
JM
429 ** tuiEraseAllSourceContent().
430 */
c906108c
SS
431void
432#ifdef __STDC__
433tuiEraseAllSourceWinsContent (
434 int displayPrompt)
435#else
436tuiEraseAllSourceWinsContent (displayPrompt)
437 int displayPrompt;
438#endif
439{
440 int i;
441
442 for (i = 0; i < (sourceWindows ())->count; i++)
443 tuiEraseSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i],
444 displayPrompt);
445
446 return;
447} /* tuiEraseAllSourceWinsContent */
448
449
450/*
c5aa993b
JM
451 ** tuiShowSourceContent().
452 */
c906108c
SS
453void
454#ifdef __STDC__
455tuiShowSourceContent (
456 TuiWinInfoPtr winInfo)
457#else
458tuiShowSourceContent (winInfo)
459 TuiWinInfoPtr winInfo;
460#endif
461{
462 int curLine, i, curX;
463
464 tuiEraseSourceContent (winInfo, (winInfo->generic.contentSize <= 0));
465 if (winInfo->generic.contentSize > 0)
466 {
467 char *line;
468
469 for (curLine = 1; (curLine <= winInfo->generic.contentSize); curLine++)
470 mvwaddstr (
471 winInfo->generic.handle,
472 curLine,
473 1,
474 ((TuiWinElementPtr)
475 winInfo->generic.content[curLine - 1])->whichElement.source.line);
476 }
477 checkAndDisplayHighlightIfNeeded (winInfo);
478 tuiRefreshWin (&winInfo->generic);
479 winInfo->generic.contentInUse = TRUE;
480
481 return;
482} /* tuiShowSourceContent */
483
484
485/*
c5aa993b
JM
486 ** tuiShowAllSourceWinsContent()
487 */
c906108c
SS
488void
489#ifdef __STDC__
490tuiShowAllSourceWinsContent (void)
491#else
492tuiShowAllSourceWinsContent ()
493#endif
494{
495 int i;
496
497 for (i = 0; i < (sourceWindows ())->count; i++)
498 tuiShowSourceContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
499
500 return;
501} /* tuiShowAllSourceWinsContent */
502
503
504/*
c5aa993b
JM
505 ** tuiHorizontalSourceScroll().
506 ** Scroll the source forward or backward horizontally
507 */
c906108c
SS
508void
509#ifdef __STDC__
510tuiHorizontalSourceScroll (
511 TuiWinInfoPtr winInfo,
512 TuiScrollDirection direction,
513 int numToScroll)
514#else
515tuiHorizontalSourceScroll (winInfo, direction, numToScroll)
516 TuiWinInfoPtr winInfo;
517 TuiScrollDirection direction;
518 int numToScroll;
519#endif
520{
521 if (winInfo->generic.content != (OpaquePtr) NULL)
522 {
523 int offset;
524 struct symtab *s;
525
526 if (current_source_symtab == (struct symtab *) NULL)
527 s = find_pc_symtab (selected_frame->pc);
528 else
529 s = current_source_symtab;
530
531 if (direction == LEFT_SCROLL)
532 offset = winInfo->detail.sourceInfo.horizontalOffset + numToScroll;
533 else
534 {
535 if ((offset =
536 winInfo->detail.sourceInfo.horizontalOffset - numToScroll) < 0)
537 offset = 0;
538 }
539 winInfo->detail.sourceInfo.horizontalOffset = offset;
540 tuiUpdateSourceWindowAsIs (
541 winInfo,
542 s,
543 ((winInfo == srcWin) ?
544 (Opaque) ((TuiWinElementPtr)
545 winInfo->generic.content[0])->whichElement.source.lineOrAddr.lineNo :
546 (Opaque) ((TuiWinElementPtr)
547 winInfo->generic.content[0])->whichElement.source.lineOrAddr.addr),
548 (int) FALSE);
549 }
550
551 return;
552} /* tuiHorizontalSourceScroll */
553
554
555/*
c5aa993b
JM
556 ** tuiSetHasExecPointAt().
557 ** Set or clear the hasBreak flag in the line whose line is lineNo.
558 */
c906108c
SS
559void
560#ifdef __STDC__
561tuiSetIsExecPointAt (
562 Opaque lineOrAddr,
563 TuiWinInfoPtr winInfo)
564#else
565tuiSetIsExecPointAt (lineOrAddr, winInfo)
566 Opaque lineOrAddr;
567 TuiWinInfoPtr winInfo;
568#endif
569{
570 int i;
571 TuiWinContent content = (TuiWinContent) winInfo->generic.content;
572
573 i = 0;
574 while (i < winInfo->generic.contentSize)
575 {
576 if (content[i]->whichElement.source.lineOrAddr.addr == lineOrAddr)
577 content[i]->whichElement.source.isExecPoint = TRUE;
578 else
579 content[i]->whichElement.source.isExecPoint = FALSE;
580 i++;
581 }
582
583 return;
584} /* tuiSetIsExecPointAt */
585
586
587/*
c5aa993b
JM
588 ** tuiSetHasBreakAt().
589 ** Set or clear the hasBreak flag in the line whose line is lineNo.
590 */
c906108c
SS
591void
592#ifdef __STDC__
593tuiSetHasBreakAt (
594 struct breakpoint *bp,
595 TuiWinInfoPtr winInfo,
596 int hasBreak)
597#else
598tuiSetHasBreakAt (bp, winInfo, hasBreak)
599 struct breakpoint *bp;
600 TuiWinInfoPtr winInfo;
601 int hasBreak;
602#endif
603{
604 int i;
605 TuiWinContent content = (TuiWinContent) winInfo->generic.content;
606
607 i = 0;
608 while (i < winInfo->generic.contentSize)
609 {
610 int gotIt;
611 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
612
613 if (winInfo == srcWin)
614 {
615 char *fileNameDisplayed = (char *) NULL;
616
617 if (((TuiWinElementPtr)
618 locator->content[0])->whichElement.locator.fileName !=
619 (char *) NULL)
620 fileNameDisplayed = ((TuiWinElementPtr)
621 locator->content[0])->whichElement.locator.fileName;
622 else if (current_source_symtab != (struct symtab *) NULL)
623 fileNameDisplayed = current_source_symtab->filename;
624
625 gotIt = (fileNameDisplayed != (char *) NULL &&
626 (strcmp (bp->source_file, fileNameDisplayed) == 0) &&
627 content[i]->whichElement.source.lineOrAddr.lineNo ==
628 bp->line_number);
629 }
630 else
631 gotIt = (content[i]->whichElement.source.lineOrAddr.addr
632 == (Opaque) bp->address);
633 if (gotIt)
634 {
635 content[i]->whichElement.source.hasBreak = hasBreak;
636 break;
637 }
638 i++;
639 }
640
641 return;
642} /* tuiSetHasBreakAt */
643
644
645/*
c5aa993b
JM
646 ** tuiAllSetHasBreakAt().
647 ** Set or clear the hasBreak flag in all displayed source windows.
648 */
c906108c
SS
649void
650#ifdef __STDC__
651tuiAllSetHasBreakAt (
652 struct breakpoint *bp,
653 int hasBreak)
654#else
655tuiAllSetHasBreakAt (bp, hasBreak)
656 struct breakpoint *bp;
657 int hasBreak;
658#endif
659{
660 int i;
661
662 for (i = 0; i < (sourceWindows ())->count; i++)
663 tuiSetHasBreakAt (bp,
664 (TuiWinInfoPtr) (sourceWindows ())->list[i], hasBreak);
665
666 return;
667} /* tuiAllSetHasBreakAt */
668
669
670/*
c5aa993b
JM
671 ** tui_vAllSetHasBreakAt()
672 ** Set or clear the hasBreak flag in all displayed source windows,
673 ** with params in a va_list
674 */
c906108c
SS
675void
676#ifdef __STDC__
677tui_vAllSetHasBreakAt (
678 va_list args)
679#else
680tui_vAllSetHasBreakAt (args)
681 va_list args;
682#endif
683{
684 struct breakpoint *bp = va_arg (args, struct breakpoint *);
685 int hasBreak = va_arg (args, int);
686
687 tuiAllSetHasBreakAt (bp, hasBreak);
688
689 return;
690} /* tui_vAllSetHasBreakAt */
691
692
693
694/*********************************
695** EXECUTION INFO FUNCTIONS **
696*********************************/
697
698/*
c5aa993b
JM
699 ** tuiSetExecInfoContent().
700 ** Function to initialize the content of the execution info window,
701 ** based upon the input window which is either the source or
702 ** disassembly window.
703 */
c906108c
SS
704TuiStatus
705#ifdef __STDC__
706tuiSetExecInfoContent (
707 TuiWinInfoPtr winInfo)
708#else
709tuiSetExecInfoContent (winInfo)
710 TuiWinInfoPtr winInfo;
711#endif
712{
713 TuiStatus ret = TUI_SUCCESS;
714
715 if (winInfo->detail.sourceInfo.executionInfo != (TuiGenWinInfoPtr) NULL)
716 {
717 TuiGenWinInfoPtr execInfoPtr = winInfo->detail.sourceInfo.executionInfo;
718
719 if (execInfoPtr->content == (OpaquePtr) NULL)
720 execInfoPtr->content =
721 (OpaquePtr) allocContent (winInfo->generic.height,
722 execInfoPtr->type);
723 if (execInfoPtr->content != (OpaquePtr) NULL)
724 {
725 int i;
726
727 for (i = 0; i < winInfo->generic.contentSize; i++)
728 {
729 TuiWinElementPtr element;
730 TuiWinElementPtr srcElement;
731
732 element = (TuiWinElementPtr) execInfoPtr->content[i];
733 srcElement = (TuiWinElementPtr) winInfo->generic.content[i];
734 /*
c5aa993b
JM
735 ** First check to see if we have a breakpoint that is
736 ** temporary. If so, and this is our current execution point,
737 ** then clear the break indicator.
738 */
c906108c
SS
739 if (srcElement->whichElement.source.hasBreak &&
740 srcElement->whichElement.source.isExecPoint)
741 {
742 struct breakpoint *bp;
743 int found = FALSE;
744 extern struct breakpoint *breakpoint_chain;
745
746 for (bp = breakpoint_chain;
747 (bp != (struct breakpoint *) NULL && !found);
748 bp = bp->next)
749 {
750 found =
751 (winInfo == srcWin &&
752 bp->line_number ==
753 srcElement->whichElement.source.lineOrAddr.lineNo) ||
754 (winInfo == disassemWin &&
755 bp->address == (CORE_ADDR)
756 srcElement->whichElement.source.lineOrAddr.addr);
757 if (found)
758 srcElement->whichElement.source.hasBreak =
759 (bp->disposition != del || bp->hit_count <= 0);
760 }
761 if (!found)
762 srcElement->whichElement.source.hasBreak = FALSE;
763 }
764 /*
c5aa993b
JM
765 ** Now update the exec info content based upon the state
766 ** of each line as indicated by the source content.
767 */
c906108c
SS
768 if (srcElement->whichElement.source.hasBreak &&
769 srcElement->whichElement.source.isExecPoint)
770 element->whichElement.simpleString = breakLocationStr ();
771 else if (srcElement->whichElement.source.hasBreak)
772 element->whichElement.simpleString = breakStr ();
773 else if (srcElement->whichElement.source.isExecPoint)
774 element->whichElement.simpleString = locationStr ();
775 else
776 element->whichElement.simpleString = blankStr ();
777 }
778 execInfoPtr->contentSize = winInfo->generic.contentSize;
779 }
780 else
781 ret = TUI_FAILURE;
782 }
783
784 return ret;
785} /* tuiSetExecInfoContent */
786
787
788/*
c5aa993b
JM
789 ** tuiShowExecInfoContent().
790 */
c906108c
SS
791void
792#ifdef __STDC__
793tuiShowExecInfoContent (
794 TuiWinInfoPtr winInfo)
795#else
796tuiShowExecInfoContent (winInfo)
797 TuiWinInfoPtr winInfo;
798#endif
799{
800 TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo;
801 int curLine;
802
803 werase (execInfo->handle);
804 tuiRefreshWin (execInfo);
805 for (curLine = 1; (curLine <= execInfo->contentSize); curLine++)
806 mvwaddstr (execInfo->handle,
807 curLine,
808 0,
809 ((TuiWinElementPtr)
810 execInfo->content[curLine - 1])->whichElement.simpleString);
811 tuiRefreshWin (execInfo);
812 execInfo->contentInUse = TRUE;
813
814 return;
815} /* tuiShowExecInfoContent */
816
817
818/*
c5aa993b
JM
819 ** tuiShowAllExecInfosContent()
820 */
c906108c
SS
821void
822#ifdef __STDC__
823tuiShowAllExecInfosContent (void)
824#else
825tuiShowAllExecInfosContent ()
826#endif
827{
828 int i;
829
830 for (i = 0; i < (sourceWindows ())->count; i++)
831 tuiShowExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
832
833 return;
834} /* tuiShowAllExecInfosContent */
835
836
837/*
c5aa993b
JM
838 ** tuiEraseExecInfoContent().
839 */
c906108c
SS
840void
841#ifdef __STDC__
842tuiEraseExecInfoContent (
843 TuiWinInfoPtr winInfo)
844#else
845tuiEraseExecInfoContent (winInfo)
846 TuiWinInfoPtr winInfo;
847#endif
848{
849 TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo;
850
851 werase (execInfo->handle);
852 tuiRefreshWin (execInfo);
853
854 return;
855} /* tuiEraseExecInfoContent */
856
857
858/*
c5aa993b
JM
859 ** tuiEraseAllExecInfosContent()
860 */
c906108c
SS
861void
862#ifdef __STDC__
863tuiEraseAllExecInfosContent (void)
864#else
865tuiEraseAllExecInfosContent ()
866#endif
867{
868 int i;
869
870 for (i = 0; i < (sourceWindows ())->count; i++)
871 tuiEraseExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
872
873 return;
874} /* tuiEraseAllExecInfosContent */
875
876
877/*
c5aa993b
JM
878 ** tuiClearExecInfoContent().
879 */
c906108c
SS
880void
881#ifdef __STDC__
882tuiClearExecInfoContent (
883 TuiWinInfoPtr winInfo)
884#else
885tuiClearExecInfoContent (winInfo)
886 TuiWinInfoPtr winInfo;
887#endif
888{
889 winInfo->detail.sourceInfo.executionInfo->contentInUse = FALSE;
890 tuiEraseExecInfoContent (winInfo);
891
892 return;
893} /* tuiClearExecInfoContent */
894
895
896/*
c5aa993b
JM
897 ** tuiClearAllExecInfosContent()
898 */
c906108c
SS
899void
900#ifdef __STDC__
901tuiClearAllExecInfosContent (void)
902#else
903tuiClearAllExecInfosContent ()
904#endif
905{
906 int i;
907
908 for (i = 0; i < (sourceWindows ())->count; i++)
909 tuiClearExecInfoContent ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
910
911 return;
912} /* tuiClearAllExecInfosContent */
913
914
915/*
c5aa993b
JM
916 ** tuiUpdateExecInfo().
917 ** Function to update the execution info window
918 */
c906108c
SS
919void
920#ifdef __STDC__
921tuiUpdateExecInfo (
922 TuiWinInfoPtr winInfo)
923#else
924tuiUpdateExecInfo (winInfo)
925 TuiWinInfoPtr winInfo;
926#endif
927{
928 tuiSetExecInfoContent (winInfo);
929 tuiShowExecInfoContent (winInfo);
930} /* tuiUpdateExecInfo
931
932
c5aa993b
JM
933 /*
934 ** tuiUpdateAllExecInfos()
935 */
c906108c
SS
936void
937#ifdef __STDC__
938tuiUpdateAllExecInfos (void)
939#else
940tuiUpdateAllExecInfos ()
941#endif
942{
943 int i;
944
945 for (i = 0; i < (sourceWindows ())->count; i++)
946 tuiUpdateExecInfo ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
947
948 return;
c5aa993b 949} /* tuiUpdateAllExecInfos */
c906108c
SS
950
951
952
953/* tuiUpdateOnEnd()
c5aa993b
JM
954 ** elz: This function clears the execution info from the source windows
955 ** and resets the locator to display no line info, procedure info, pc
956 ** info. It is called by stack_publish_stopped_with_no_frame, which
957 ** is called then the target terminates execution
958 */
c906108c
SS
959void
960#ifdef __STDC__
961tuiUpdateOnEnd (void)
962#else
963tuiUpdateOnEnd ()
964#endif
965{
966 int i;
967 TuiGenWinInfoPtr locator;
968 char *filename;
969 TuiWinInfoPtr winInfo;
970
971 locator = locatorWinInfoPtr ();
972
973 /* for all the windows (src, asm) */
974 for (i = 0; i < (sourceWindows ())->count; i++)
975 {
976 winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i];
977
978 tuiSetIsExecPointAt ((Opaque) - 1, winInfo); /* the target is'n running */
979 /* -1 should not match any line number or pc */
c5aa993b
JM
980 tuiSetExecInfoContent (winInfo); /*set winInfo so that > is'n displayed */
981 tuiShowExecInfoContent (winInfo); /* display the new contents */
c906108c
SS
982 }
983
c5aa993b 984 /*now update the locator */
c906108c
SS
985 tuiClearLocatorDisplay ();
986 tuiGetLocatorFilename (locator, &filename);
987 tuiSetLocatorInfo (
988 filename,
989 (char *) NULL,
990 0,
991 (Opaque) NULL,
992 &((TuiWinElementPtr) locator->content[0])->whichElement.locator);
993 tuiShowLocatorContent ();
994
995 return;
996} /* tuiUpdateOnEnd */
997
998
999
1000TuiStatus
1001#ifdef __STDC__
1002tuiAllocSourceBuffer (
1003 TuiWinInfoPtr winInfo)
1004#else
1005tuiAllocSourceBuffer (winInfo)
1006 TuiWinInfoPtr winInfo;
1007#endif
1008{
1009 register char *srcLine, *srcLineBuf;
1010 register int i, lineWidth, c, maxLines;
1011 TuiStatus ret = TUI_FAILURE;
1012
1013 maxLines = winInfo->generic.height; /* less the highlight box */
1014 lineWidth = winInfo->generic.width - 1;
1015 /*
c5aa993b
JM
1016 ** Allocate the buffer for the source lines. Do this only once since they
1017 ** will be re-used for all source displays. The only other time this will
1018 ** be done is when a window's size changes.
1019 */
c906108c
SS
1020 if (winInfo->generic.content == (OpaquePtr) NULL)
1021 {
1022 srcLineBuf = (char *) xmalloc ((maxLines * lineWidth) * sizeof (char));
1023 if (srcLineBuf == (char *) NULL)
1024 fputs_unfiltered (
1025 "Unable to Allocate Memory for Source or Disassembly Display.\n",
1026 gdb_stderr);
1027 else
1028 {
1029 /* allocate the content list */
1030 if ((winInfo->generic.content =
1031 (OpaquePtr) allocContent (maxLines, SRC_WIN)) == (OpaquePtr) NULL)
1032 {
1033 tuiFree (srcLineBuf);
1034 srcLineBuf = (char *) NULL;
1035 fputs_unfiltered (
1036 "Unable to Allocate Memory for Source or Disassembly Display.\n",
1037 gdb_stderr);
1038 }
1039 }
1040 for (i = 0; i < maxLines; i++)
1041 ((TuiWinElementPtr)
1042 winInfo->generic.content[i])->whichElement.source.line =
1043 srcLineBuf + (lineWidth * i);
1044 ret = TUI_SUCCESS;
1045 }
1046 else
1047 ret = TUI_SUCCESS;
1048
1049 return ret;
1050} /* tuiAllocSourceBuffer */
1051
1052
1053/*
c5aa993b
JM
1054 ** tuiLineIsDisplayed().
1055 ** Answer whether the a particular line number or address is displayed
1056 ** in the current source window.
1057 */
c906108c
SS
1058int
1059#ifdef __STDC__
1060tuiLineIsDisplayed (
1061 Opaque lineNoOrAddr,
1062 TuiWinInfoPtr winInfo,
1063 int checkThreshold)
1064#else
1065tuiLineIsDisplayed (lineNoOrAddr, winInfo, checkThreshold)
1066 Opaque lineNoOrAddr;
1067 TuiWinInfoPtr winInfo;
1068 int checkThreshold;
1069#endif
1070{
1071 int isDisplayed = FALSE;
1072 int i, threshold;
1073
1074 if (checkThreshold)
1075 threshold = SCROLL_THRESHOLD;
1076 else
1077 threshold = 0;
1078 i = 0;
1079 while (i < winInfo->generic.contentSize - threshold && !isDisplayed)
1080 {
1081 if (winInfo == srcWin)
1082 isDisplayed = (((TuiWinElementPtr)
1083 winInfo->generic.content[i])->whichElement.source.lineOrAddr.lineNo
1084 == (int) lineNoOrAddr);
1085 else
1086 isDisplayed = (((TuiWinElementPtr)
1087 winInfo->generic.content[i])->whichElement.source.lineOrAddr.addr
1088 == lineNoOrAddr);
1089 i++;
1090 }
1091
1092 return isDisplayed;
1093} /* tuiLineIsDisplayed */
1094
1095
1096/*****************************************
1097** STATIC LOCAL FUNCTIONS **
1098******************************************/
This page took 0.15042 seconds and 4 git commands to generate.