]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/tui/tuiSourceWin.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / gdb / tui / tuiSourceWin.c
1 /*
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 */
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 ******************************************/
28 extern int current_source_line;
29 extern 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 /*
50 ** tuiSrcWinIsDisplayed().
51 */
52 int
53 #ifdef __STDC__
54 tuiSrcWinIsDisplayed (void)
55 #else
56 tuiSrcWinIsDisplayed ()
57 #endif
58 {
59 return (m_winPtrNotNull (srcWin) && srcWin->generic.isVisible);
60 } /* tuiSrcWinIsDisplayed */
61
62
63 /*
64 ** tuiAsmWinIsDisplayed().
65 */
66 int
67 #ifdef __STDC__
68 tuiAsmWinIsDisplayed (void)
69 #else
70 tuiAsmWinIsDisplayed ()
71 #endif
72 {
73 return (m_winPtrNotNull (disassemWin) && disassemWin->generic.isVisible);
74 } /* tuiAsmWinIsDisplayed */
75
76
77 /*
78 ** tuiDisplayMainFunction().
79 ** Function to display the "main" routine"
80 */
81 void
82 #ifdef __STDC__
83 tuiDisplayMainFunction (void)
84 #else
85 tuiDisplayMainFunction ()
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 /*
111 ** tuiUpdateSourceWindow().
112 ** Function to display source in the source window. This function
113 ** initializes the horizontal scroll to 0.
114 */
115 void
116 #ifdef __STDC__
117 tuiUpdateSourceWindow (
118 TuiWinInfoPtr winInfo,
119 struct symtab *s,
120 Opaque lineOrAddr,
121 int noerror)
122 #else
123 tuiUpdateSourceWindow (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 /*
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 */
142 void
143 #ifdef __STDC__
144 tuiUpdateSourceWindowAsIs (
145 TuiWinInfoPtr winInfo,
146 struct symtab *s,
147 Opaque lineOrAddr,
148 int noerror)
149 #else
150 tuiUpdateSourceWindowAsIs (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 /*
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 */
183 if (tuiWinWithFocus () == disassemWin &&
184 currentLayout () != SRC_DISASSEM_COMMAND)
185 tuiSetWinFocusTo (srcWin);
186 }
187 }
188
189
190 return;
191 } /* tuiUpdateSourceWindowAsIs */
192
193
194 /*
195 ** tuiUpdateSourceWindowsWithAddr().
196 ** Function to ensure that the source and/or disassemly windows
197 ** reflect the input address.
198 */
199 void
200 #ifdef __STDC__
201 tuiUpdateSourceWindowsWithAddr (
202 Opaque addr)
203 #else
204 tuiUpdateSourceWindowsWithAddr (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 /*
247 ** tui_vUpdateSourceWindowsWithAddr()
248 ** Update the source window with the address in a va_list
249 */
250 void
251 #ifdef __STDC__
252 tui_vUpdateSourceWindowsWithAddr (
253 va_list args)
254 #else
255 tui_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 /*
268 ** tuiUpdateSourceWindowsWithLine().
269 ** Function to ensure that the source and/or disassemly windows
270 ** reflect the input address.
271 */
272 void
273 #ifdef __STDC__
274 tuiUpdateSourceWindowsWithLine (
275 struct symtab *s,
276 int line)
277 #else
278 tuiUpdateSourceWindowsWithLine (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 /*
301 ** tui_vUpdateSourceWindowsWithLine()
302 ** Update the source window with the line number in a va_list
303 */
304 void
305 #ifdef __STDC__
306 tui_vUpdateSourceWindowsWithLine (
307 va_list args)
308 #else
309 tui_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 /*
323 ** tuiClearSourceContent().
324 */
325 void
326 #ifdef __STDC__
327 tuiClearSourceContent (
328 TuiWinInfoPtr winInfo,
329 int displayPrompt)
330 #else
331 tuiClearSourceContent (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 /*
356 ** tuiClearAllSourceWinsContent().
357 */
358 void
359 #ifdef __STDC__
360 tuiClearAllSourceWinsContent (
361 int displayPrompt)
362 #else
363 tuiClearAllSourceWinsContent (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 /*
378 ** tuiEraseSourceContent().
379 */
380 void
381 #ifdef __STDC__
382 tuiEraseSourceContent (
383 TuiWinInfoPtr winInfo,
384 int displayPrompt)
385 #else
386 tuiEraseSourceContent (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
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 */
419
420 tuiSetSourceContentNil (winInfo, noSrcStr);
421 }
422 tuiRefreshWin (&winInfo->generic);
423 }
424 return;
425 } /* tuiEraseSourceContent */
426
427
428 /*
429 ** tuiEraseAllSourceContent().
430 */
431 void
432 #ifdef __STDC__
433 tuiEraseAllSourceWinsContent (
434 int displayPrompt)
435 #else
436 tuiEraseAllSourceWinsContent (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 /*
451 ** tuiShowSourceContent().
452 */
453 void
454 #ifdef __STDC__
455 tuiShowSourceContent (
456 TuiWinInfoPtr winInfo)
457 #else
458 tuiShowSourceContent (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 /*
486 ** tuiShowAllSourceWinsContent()
487 */
488 void
489 #ifdef __STDC__
490 tuiShowAllSourceWinsContent (void)
491 #else
492 tuiShowAllSourceWinsContent ()
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 /*
505 ** tuiHorizontalSourceScroll().
506 ** Scroll the source forward or backward horizontally
507 */
508 void
509 #ifdef __STDC__
510 tuiHorizontalSourceScroll (
511 TuiWinInfoPtr winInfo,
512 TuiScrollDirection direction,
513 int numToScroll)
514 #else
515 tuiHorizontalSourceScroll (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 /*
556 ** tuiSetHasExecPointAt().
557 ** Set or clear the hasBreak flag in the line whose line is lineNo.
558 */
559 void
560 #ifdef __STDC__
561 tuiSetIsExecPointAt (
562 Opaque lineOrAddr,
563 TuiWinInfoPtr winInfo)
564 #else
565 tuiSetIsExecPointAt (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 /*
588 ** tuiSetHasBreakAt().
589 ** Set or clear the hasBreak flag in the line whose line is lineNo.
590 */
591 void
592 #ifdef __STDC__
593 tuiSetHasBreakAt (
594 struct breakpoint *bp,
595 TuiWinInfoPtr winInfo,
596 int hasBreak)
597 #else
598 tuiSetHasBreakAt (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 /*
646 ** tuiAllSetHasBreakAt().
647 ** Set or clear the hasBreak flag in all displayed source windows.
648 */
649 void
650 #ifdef __STDC__
651 tuiAllSetHasBreakAt (
652 struct breakpoint *bp,
653 int hasBreak)
654 #else
655 tuiAllSetHasBreakAt (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 /*
671 ** tui_vAllSetHasBreakAt()
672 ** Set or clear the hasBreak flag in all displayed source windows,
673 ** with params in a va_list
674 */
675 void
676 #ifdef __STDC__
677 tui_vAllSetHasBreakAt (
678 va_list args)
679 #else
680 tui_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 /*
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 */
704 TuiStatus
705 #ifdef __STDC__
706 tuiSetExecInfoContent (
707 TuiWinInfoPtr winInfo)
708 #else
709 tuiSetExecInfoContent (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 /*
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 */
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 /*
765 ** Now update the exec info content based upon the state
766 ** of each line as indicated by the source content.
767 */
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 /*
789 ** tuiShowExecInfoContent().
790 */
791 void
792 #ifdef __STDC__
793 tuiShowExecInfoContent (
794 TuiWinInfoPtr winInfo)
795 #else
796 tuiShowExecInfoContent (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 /*
819 ** tuiShowAllExecInfosContent()
820 */
821 void
822 #ifdef __STDC__
823 tuiShowAllExecInfosContent (void)
824 #else
825 tuiShowAllExecInfosContent ()
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 /*
838 ** tuiEraseExecInfoContent().
839 */
840 void
841 #ifdef __STDC__
842 tuiEraseExecInfoContent (
843 TuiWinInfoPtr winInfo)
844 #else
845 tuiEraseExecInfoContent (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 /*
859 ** tuiEraseAllExecInfosContent()
860 */
861 void
862 #ifdef __STDC__
863 tuiEraseAllExecInfosContent (void)
864 #else
865 tuiEraseAllExecInfosContent ()
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 /*
878 ** tuiClearExecInfoContent().
879 */
880 void
881 #ifdef __STDC__
882 tuiClearExecInfoContent (
883 TuiWinInfoPtr winInfo)
884 #else
885 tuiClearExecInfoContent (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 /*
897 ** tuiClearAllExecInfosContent()
898 */
899 void
900 #ifdef __STDC__
901 tuiClearAllExecInfosContent (void)
902 #else
903 tuiClearAllExecInfosContent ()
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 /*
916 ** tuiUpdateExecInfo().
917 ** Function to update the execution info window
918 */
919 void
920 #ifdef __STDC__
921 tuiUpdateExecInfo (
922 TuiWinInfoPtr winInfo)
923 #else
924 tuiUpdateExecInfo (winInfo)
925 TuiWinInfoPtr winInfo;
926 #endif
927 {
928 tuiSetExecInfoContent (winInfo);
929 tuiShowExecInfoContent (winInfo);
930 } /* tuiUpdateExecInfo
931
932
933 /*
934 ** tuiUpdateAllExecInfos()
935 */
936 void
937 #ifdef __STDC__
938 tuiUpdateAllExecInfos (void)
939 #else
940 tuiUpdateAllExecInfos ()
941 #endif
942 {
943 int i;
944
945 for (i = 0; i < (sourceWindows ())->count; i++)
946 tuiUpdateExecInfo ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
947
948 return;
949 } /* tuiUpdateAllExecInfos*/
950
951
952
953 /* tuiUpdateOnEnd()
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 */
959 void
960 #ifdef __STDC__
961 tuiUpdateOnEnd (void)
962 #else
963 tuiUpdateOnEnd ()
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 */
980 tuiSetExecInfoContent (winInfo); /*set winInfo so that > is'n displayed*/
981 tuiShowExecInfoContent (winInfo); /* display the new contents */
982 }
983
984 /*now update the locator*/
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
1000 TuiStatus
1001 #ifdef __STDC__
1002 tuiAllocSourceBuffer (
1003 TuiWinInfoPtr winInfo)
1004 #else
1005 tuiAllocSourceBuffer (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 /*
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 */
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 /*
1054 ** tuiLineIsDisplayed().
1055 ** Answer whether the a particular line number or address is displayed
1056 ** in the current source window.
1057 */
1058 int
1059 #ifdef __STDC__
1060 tuiLineIsDisplayed (
1061 Opaque lineNoOrAddr,
1062 TuiWinInfoPtr winInfo,
1063 int checkThreshold)
1064 #else
1065 tuiLineIsDisplayed (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 ******************************************/