]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/tui/tuiData.c
Initial creation of sourceware repository
[thirdparty/binutils-gdb.git] / gdb / tui / tuiData.c
1 /*
2 ** tuiData.c
3 ** This module contains functions for manipulating the data
4 ** structures used by the TUI
5 */
6
7 #include "defs.h"
8 #include "tui.h"
9 #include "tuiData.h"
10
11 /****************************
12 ** GLOBAL DECLARATIONS
13 ****************************/
14 TuiWinInfoPtr winList[MAX_MAJOR_WINDOWS];
15
16 /***************************
17 ** Private Definitions
18 ****************************/
19 #define FILE_WIDTH 30
20 #define PROC_WIDTH 40
21 #define LINE_WIDTH 4
22 #define PC_WIDTH 8
23
24 /***************************
25 ** Private data
26 ****************************/
27 static char *_tuiNullStr = TUI_NULL_STR;
28 static char *_tuiBlankStr = " ";
29 static char *_tuiLocationStr = " >";
30 static char *_tuiBreakStr = " * ";
31 static char *_tuiBreakLocationStr = " *>";
32 static TuiLayoutType _currentLayout = UNDEFINED_LAYOUT;
33 static int _termHeight, _termWidth;
34 static int _historyLimit = DEFAULT_HISTORY_COUNT;
35 static TuiGenWinInfo _locator;
36 static TuiGenWinInfo _execInfo[2];
37 static TuiWinInfoPtr _srcWinList[2];
38 static TuiList _sourceWindows =
39 {(OpaqueList) _srcWinList, 0};
40 static int _defaultTabLen = DEFAULT_TAB_LEN;
41 static TuiWinInfoPtr _winWithFocus = (TuiWinInfoPtr) NULL;
42 static TuiLayoutDef _layoutDef =
43 {SRC_WIN, /* displayMode */
44 FALSE, /* split */
45 TUI_UNDEFINED_REGS, /* regsDisplayType */
46 TUI_SFLOAT_REGS}; /* floatRegsDisplayType */
47 static int _winResized = FALSE;
48
49
50 /*********************************
51 ** Static function forward decls
52 **********************************/
53 static void freeContent PARAMS ((TuiWinContent, int, TuiWinType));
54 static void freeContentElements PARAMS ((TuiWinContent, int, TuiWinType));
55
56
57
58 /*********************************
59 ** PUBLIC FUNCTIONS
60 **********************************/
61
62 /******************************************
63 ** ACCESSORS & MUTATORS FOR PRIVATE DATA
64 ******************************************/
65
66 /*
67 ** tuiWinResized().
68 ** Answer a whether the terminal window has been resized or not
69 */
70 int
71 #ifdef __STDC__
72 tuiWinResized (void)
73 #else
74 tuiWinResized ()
75 #endif
76 {
77 return _winResized;
78 } /* tuiWinResized */
79
80
81 /*
82 ** tuiSetWinResized().
83 ** Set a whether the terminal window has been resized or not
84 */
85 void
86 #ifdef __STDC__
87 tuiSetWinResizedTo (
88 int resized)
89 #else
90 tuiSetWinResizedTo (resized)
91 int resized;
92 #endif
93 {
94 _winResized = resized;
95
96 return;
97 } /* tuiSetWinResizedTo */
98
99
100 /*
101 ** tuiLayoutDef().
102 ** Answer a pointer to the current layout definition
103 */
104 TuiLayoutDefPtr
105 #ifdef __STDC__
106 tuiLayoutDef (void)
107 #else
108 tuiLayoutDef ()
109 #endif
110 {
111 return &_layoutDef;
112 } /* tuiLayoutDef */
113
114
115 /*
116 ** tuiWinWithFocus().
117 ** Answer the window with the logical focus
118 */
119 TuiWinInfoPtr
120 #ifdef __STDC__
121 tuiWinWithFocus (void)
122 #else
123 tuiWinWithFocus ()
124 #endif
125 {
126 return _winWithFocus;
127 } /* tuiWinWithFocus */
128
129
130 /*
131 ** tuiSetWinWithFocus().
132 ** Set the window that has the logical focus
133 */
134 void
135 #ifdef __STDC__
136 tuiSetWinWithFocus (
137 TuiWinInfoPtr winInfo)
138 #else
139 tuiSetWinWithFocus (winInfo)
140 TuiWinInfoPtr winInfo;
141 #endif
142 {
143 _winWithFocus = winInfo;
144
145 return;
146 } /* tuiSetWinWithFocus */
147
148
149 /*
150 ** tuiDefaultTabLen().
151 ** Answer the length in chars, of tabs
152 */
153 int
154 #ifdef __STDC__
155 tuiDefaultTabLen (void)
156 #else
157 tuiDefaultTabLen ()
158 #endif
159 {
160 return _defaultTabLen;
161 } /* tuiDefaultTabLen */
162
163
164 /*
165 ** tuiSetDefaultTabLen().
166 ** Set the length in chars, of tabs
167 */
168 void
169 #ifdef __STDC__
170 tuiSetDefaultTabLen (
171 int len)
172 #else
173 tuiSetDefaultTabLen (len)
174 int len;
175 #endif
176 {
177 _defaultTabLen = len;
178
179 return;
180 } /* tuiSetDefaultTabLen */
181
182
183 /*
184 ** currentSourceWin()
185 ** Accessor for the current source window. Usually there is only
186 ** one source window (either source or disassembly), but both can
187 ** be displayed at the same time.
188 */
189 TuiListPtr
190 #ifdef __STDC__
191 sourceWindows (void)
192 #else
193 sourceWindows ()
194 #endif
195 {
196 return &_sourceWindows;
197 } /* currentSourceWindows */
198
199
200 /*
201 ** clearSourceWindows()
202 ** Clear the list of source windows. Usually there is only one
203 ** source window (either source or disassembly), but both can be
204 ** displayed at the same time.
205 */
206 void
207 #ifdef __STDC__
208 clearSourceWindows (void)
209 #else
210 clearSourceWindows ()
211 #endif
212 {
213 _sourceWindows.list[0] = (Opaque) NULL;
214 _sourceWindows.list[1] = (Opaque) NULL;
215 _sourceWindows.count = 0;
216
217 return;
218 } /* currentSourceWindows */
219
220
221 /*
222 ** clearSourceWindowsDetail()
223 ** Clear the pertinant detail in the source windows.
224 */
225 void
226 #ifdef __STDC__
227 clearSourceWindowsDetail (void)
228 #else
229 clearSourceWindowsDetail ()
230 #endif
231 {
232 int i;
233
234 for (i = 0; i < (sourceWindows ())->count; i++)
235 clearWinDetail ((TuiWinInfoPtr) (sourceWindows ())->list[i]);
236
237 return;
238 } /* currentSourceWindows */
239
240
241 /*
242 ** addSourceWindowToList().
243 ** Add a window to the list of source windows. Usually there is
244 ** only one source window (either source or disassembly), but
245 ** both can be displayed at the same time.
246 */
247 void
248 #ifdef __STDC__
249 addToSourceWindows (
250 TuiWinInfoPtr winInfo)
251 #else
252 addToSourceWindows (winInfo)
253 TuiWinInfoPtr winInfo;
254 #endif
255 {
256 if (_sourceWindows.count < 2)
257 _sourceWindows.list[_sourceWindows.count++] = (Opaque) winInfo;
258
259 return;
260 } /* addToSourceWindows */
261
262
263 /*
264 ** clearWinDetail()
265 ** Clear the pertinant detail in the windows.
266 */
267 void
268 #ifdef __STDC__
269 clearWinDetail (
270 TuiWinInfoPtr winInfo)
271 #else
272 clearWinDetail (winInfo)
273 TuiWinInfoPtr winInfo;
274 #endif
275 {
276 if (m_winPtrNotNull (winInfo))
277 {
278 switch (winInfo->generic.type)
279 {
280 case SRC_WIN:
281 case DISASSEM_WIN:
282 winInfo->detail.sourceInfo.startLineOrAddr.addr = (Opaque) NULL;
283 winInfo->detail.sourceInfo.horizontalOffset = 0;
284 break;
285 case CMD_WIN:
286 winInfo->detail.commandInfo.curLine =
287 winInfo->detail.commandInfo.curch = 0;
288 break;
289 case DATA_WIN:
290 winInfo->detail.dataDisplayInfo.dataContent =
291 (TuiWinContent) NULL;
292 winInfo->detail.dataDisplayInfo.dataContentCount = 0;
293 winInfo->detail.dataDisplayInfo.regsContent =
294 (TuiWinContent) NULL;
295 winInfo->detail.dataDisplayInfo.regsContentCount = 0;
296 winInfo->detail.dataDisplayInfo.regsDisplayType =
297 TUI_UNDEFINED_REGS;
298 winInfo->detail.dataDisplayInfo.regsColumnCount = 1;
299 winInfo->detail.dataDisplayInfo.displayRegs = FALSE;
300 break;
301 default:
302 break;
303 }
304 }
305
306 return;
307 } /* clearWinDetail */
308
309
310 /*
311 ** blankStr()
312 ** Accessor for the blank string.
313 */
314 char *
315 #ifdef __STDC__
316 blankStr (void)
317 #else
318 blankStr ()
319 #endif
320 {
321 return _tuiBlankStr;
322 } /* blankStr */
323
324
325 /*
326 ** locationStr()
327 ** Accessor for the location string.
328 */
329 char *
330 #ifdef __STDC__
331 locationStr (void)
332 #else
333 locationStr ()
334 #endif
335 {
336 return _tuiLocationStr;
337 } /* locationStr */
338
339
340 /*
341 ** breakStr()
342 ** Accessor for the break string.
343 */
344 char *
345 #ifdef __STDC__
346 breakStr (void)
347 #else
348 breakStr ()
349 #endif
350 {
351 return _tuiBreakStr;
352 } /* breakStr */
353
354
355 /*
356 ** breakLocationStr()
357 ** Accessor for the breakLocation string.
358 */
359 char *
360 #ifdef __STDC__
361 breakLocationStr (void)
362 #else
363 breakLocationStr ()
364 #endif
365 {
366 return _tuiBreakLocationStr;
367 } /* breakLocationStr */
368
369
370 /*
371 ** nullStr()
372 ** Accessor for the null string.
373 */
374 char *
375 #ifdef __STDC__
376 nullStr (void)
377 #else
378 nullStr ()
379 #endif
380 {
381 return _tuiNullStr;
382 } /* nullStr */
383
384
385 /*
386 ** sourceExecInfoPtr().
387 ** Accessor for the source execution info ptr.
388 */
389 TuiGenWinInfoPtr
390 #ifdef __STDC__
391 sourceExecInfoWinPtr (void)
392 #else
393 sourceExecInfoWinPtr ()
394 #endif
395 {
396 return &_execInfo[0];
397 } /* sourceExecInfoWinPtr */
398
399
400 /*
401 ** disassemExecInfoPtr().
402 ** Accessor for the disassem execution info ptr.
403 */
404 TuiGenWinInfoPtr
405 #ifdef __STDC__
406 disassemExecInfoWinPtr (void)
407 #else
408 disassemExecInfoWinPtr ()
409 #endif
410 {
411 return &_execInfo[1];
412 } /* disassemExecInfoWinPtr */
413
414
415 /*
416 ** locatorWinInfoPtr().
417 ** Accessor for the locator win info. Answers a pointer to the
418 ** static locator win info struct.
419 */
420 TuiGenWinInfoPtr
421 #ifdef __STDC__
422 locatorWinInfoPtr (void)
423 #else
424 locatorWinInfoPtr ()
425 #endif
426 {
427 return &_locator;
428 } /* locatorWinInfoPtr */
429
430
431 /*
432 ** historyLimit().
433 ** Accessor for the history limit
434 */
435 int
436 #ifdef __STDC__
437 historyLimit (void)
438 #else
439 historyLimit ()
440 #endif
441 {
442 return _historyLimit;
443 } /* historyLimit */
444
445
446 /*
447 ** setHistoryLimitTo().
448 ** Mutator for the history limit
449 */
450 void
451 #ifdef __STDC__
452 setHistoryLimitTo (
453 int h)
454 #else
455 setHistoryLimitTo (h)
456 int h;
457 #endif
458 {
459 _historyLimit = h;
460
461 return;
462 } /* setHistoryLimitTo */
463
464 /*
465 ** termHeight().
466 ** Accessor for the termHeight
467 */
468 int
469 #ifdef __STDC__
470 termHeight (void)
471 #else
472 termHeight ()
473 #endif
474 {
475 return _termHeight;
476 } /* termHeight */
477
478
479 /*
480 ** setTermHeightTo().
481 ** Mutator for the term height
482 */
483 void
484 #ifdef __STDC__
485 setTermHeightTo (
486 int h)
487 #else
488 setTermHeightTo (h)
489 int h;
490 #endif
491 {
492 _termHeight = h;
493
494 return;
495 } /* setTermHeightTo */
496
497
498 /*
499 ** termWidth().
500 ** Accessor for the termWidth
501 */
502 int
503 #ifdef __STDC__
504 termWidth (void)
505 #else
506 termWidth ()
507 #endif
508 {
509 return _termWidth;
510 } /* termWidth */
511
512
513 /*
514 ** setTermWidth().
515 ** Mutator for the termWidth
516 */
517 void
518 #ifdef __STDC__
519 setTermWidthTo (
520 int w)
521 #else
522 setTermWidthTo (w)
523 int w;
524 #endif
525 {
526 _termWidth = w;
527
528 return;
529 } /* setTermWidthTo */
530
531
532 /*
533 ** currentLayout().
534 ** Accessor for the current layout
535 */
536 TuiLayoutType
537 #ifdef __STDC__
538 currentLayout (void)
539 #else
540 currentLayout ()
541 #endif
542 {
543 return _currentLayout;
544 } /* currentLayout */
545
546
547 /*
548 ** setCurrentLayoutTo().
549 ** Mutator for the current layout
550 */
551 void
552 #ifdef __STDC__
553 setCurrentLayoutTo (
554 TuiLayoutType newLayout)
555 #else
556 setCurrentLayoutTo (newLayout)
557 TuiLayoutType newLayout;
558 #endif
559 {
560 _currentLayout = newLayout;
561
562 return;
563 } /* setCurrentLayoutTo */
564
565
566 /*
567 ** setGenWinOrigin().
568 ** Set the origin of the window
569 */
570 void
571 #ifdef __STDC__
572 setGenWinOrigin (
573 TuiGenWinInfoPtr winInfo,
574 int x,
575 int y)
576 #else
577 setGenWinOrigin (winInfo, x, y)
578 TuiGenWinInfoPtr winInfo;
579 int x;
580 int y;
581 #endif
582 {
583 winInfo->origin.x = x;
584 winInfo->origin.y = y;
585
586 return;
587 } /* setGenWinOrigin */
588
589
590 /*****************************
591 ** OTHER PUBLIC FUNCTIONS
592 *****************************/
593
594
595 /*
596 ** tuiNextWin().
597 ** Answer the next window in the list, cycling back to the top
598 ** if necessary
599 */
600 TuiWinInfoPtr
601 #ifdef __STDC__
602 tuiNextWin (
603 TuiWinInfoPtr curWin)
604 #else
605 tuiNextWin (curWin)
606 TuiWinInfoPtr curWin;
607 #endif
608 {
609 TuiWinType type = curWin->generic.type;
610 TuiWinInfoPtr nextWin = (TuiWinInfoPtr) NULL;
611
612 if (curWin->generic.type == CMD_WIN)
613 type = SRC_WIN;
614 else
615 type = curWin->generic.type + 1;
616 while (type != curWin->generic.type && m_winPtrIsNull (nextWin))
617 {
618 if (winList[type]->generic.isVisible)
619 nextWin = winList[type];
620 else
621 {
622 if (type == CMD_WIN)
623 type = SRC_WIN;
624 else
625 type++;
626 }
627 }
628
629 return nextWin;
630 } /* tuiNextWin */
631
632
633 /*
634 ** tuiPrevWin().
635 ** Answer the prev window in the list, cycling back to the bottom
636 ** if necessary
637 */
638 TuiWinInfoPtr
639 #ifdef __STDC__
640 tuiPrevWin (
641 TuiWinInfoPtr curWin)
642 #else
643 tuiPrevWin (curWin)
644 TuiWinInfoPtr curWin;
645 #endif
646 {
647 TuiWinType type = curWin->generic.type;
648 TuiWinInfoPtr prev = (TuiWinInfoPtr) NULL;
649
650 if (curWin->generic.type == SRC_WIN)
651 type = CMD_WIN;
652 else
653 type = curWin->generic.type - 1;
654 while (type != curWin->generic.type && m_winPtrIsNull (prev))
655 {
656 if (winList[type]->generic.isVisible)
657 prev = winList[type];
658 else
659 {
660 if (type == SRC_WIN)
661 type = CMD_WIN;
662 else
663 type--;
664 }
665 }
666
667 return prev;
668 } /* tuiPrevWin */
669
670
671 /*
672 ** displayableWinContentOf().
673 ** Answer a the content at the location indicated by index. Note
674 ** that if this is a locator window, the string returned should be
675 ** freed after use.
676 */
677 char *
678 #ifdef __STDC__
679 displayableWinContentOf (
680 TuiGenWinInfoPtr winInfo,
681 TuiWinElementPtr elementPtr)
682 #else
683 displayableWinContentOf (winInfo, elementPtr)
684 TuiGenWinInfoPtr winInfo;
685 TuiWinElementPtr elementPtr;
686 #endif
687 {
688
689 char *string = nullStr ();
690
691 if (elementPtr != (TuiWinElementPtr) NULL || winInfo->type == LOCATOR_WIN)
692 {
693 /*
694 ** Now convert the line to a displayable string
695 */
696 switch (winInfo->type)
697 {
698 case SRC_WIN:
699 case DISASSEM_WIN:
700 string = elementPtr->whichElement.source.line;
701 break;
702 case CMD_WIN:
703 string = elementPtr->whichElement.command.line;
704 break;
705 case LOCATOR_WIN:
706 if ((string = (char *) xmalloc (
707 (termWidth () + 1) * sizeof (char))) == (char *) NULL)
708 string = nullStr ();
709 else
710 {
711 char lineNo[50], pc[50], buf[50], *fname, *pname;
712 register int strSize = termWidth (), i, procWidth, fileWidth;
713
714 /*
715 ** First determine the amount of file/proc name width
716 ** we have available
717 */
718 i = strSize - (PC_WIDTH + LINE_WIDTH
719 + 25 /* pc and line labels */
720 + strlen (FILE_PREFIX) + 1 /* file label */
721 + 15 /* procedure label */ );
722 if (i >= FILE_WIDTH + PROC_WIDTH)
723 {
724 fileWidth = FILE_WIDTH;
725 procWidth = PROC_WIDTH;
726 }
727 else
728 {
729 fileWidth = i / 2;
730 procWidth = i - fileWidth;
731 }
732
733 /* Now convert elements to string form */
734 if (elementPtr != (TuiWinElementPtr) NULL &&
735 *elementPtr->whichElement.locator.fileName != (char) 0 &&
736 srcWin->generic.isVisible)
737 fname = elementPtr->whichElement.locator.fileName;
738 else
739 fname = "??";
740 if (elementPtr != (TuiWinElementPtr) NULL &&
741 *elementPtr->whichElement.locator.procName != (char) 0)
742 pname = elementPtr->whichElement.locator.procName;
743 else
744 pname = "??";
745 if (elementPtr != (TuiWinElementPtr) NULL &&
746 elementPtr->whichElement.locator.lineNo > 0)
747 sprintf (lineNo, "%d",
748 elementPtr->whichElement.locator.lineNo);
749 else
750 strcpy (lineNo, "??");
751 if (elementPtr != (TuiWinElementPtr) NULL &&
752 elementPtr->whichElement.locator.addr > (Opaque) 0)
753 sprintf (pc, "0x%x",
754 elementPtr->whichElement.locator.addr);
755 else
756 strcpy (pc, "??");
757 /*
758 ** Now create the locator line from the string version
759 ** of the elements. We could use sprintf() here but
760 ** that wouldn't ensure that we don't overrun the size
761 ** of the allocated buffer. strcat_to_buf() will.
762 */
763 *string = (char) 0;
764 /* Filename */
765 strcat_to_buf (string, strSize, " ");
766 strcat_to_buf (string, strSize, FILE_PREFIX);
767 if (strlen (fname) > fileWidth)
768 {
769 strncpy (buf, fname, fileWidth - 1);
770 buf[fileWidth - 1] = '*';
771 buf[fileWidth] = (char) 0;
772 }
773 else
774 strcpy (buf, fname);
775 strcat_to_buf (string, strSize, buf);
776 /* procedure/class name */
777 sprintf (buf, "%15s", PROC_PREFIX);
778 strcat_to_buf (string, strSize, buf);
779 if (strlen (pname) > procWidth)
780 {
781 strncpy (buf, pname, procWidth - 1);
782 buf[procWidth - 1] = '*';
783 buf[procWidth] = (char) 0;
784 }
785 else
786 strcpy (buf, pname);
787 strcat_to_buf (string, strSize, buf);
788 sprintf (buf, "%10s", LINE_PREFIX);
789 strcat_to_buf (string, strSize, buf);
790 strcat_to_buf (string, strSize, lineNo);
791 sprintf (buf, "%10s", PC_PREFIX);
792 strcat_to_buf (string, strSize, buf);
793 strcat_to_buf (string, strSize, pc);
794 for (i = strlen (string); i < strSize; i++)
795 string[i] = ' ';
796 string[strSize] = (char) 0;
797 }
798 break;
799 case EXEC_INFO_WIN:
800 string = elementPtr->whichElement.simpleString;
801 break;
802 default:
803 break;
804 }
805 }
806 return string;
807 } /* displayableWinContentOf */
808
809
810 /*
811 ** winContentAt().
812 ** Answer a the content at the location indicated by index
813 */
814 char *
815 #ifdef __STDC__
816 displayableWinContentAt (
817 TuiGenWinInfoPtr winInfo,
818 int index)
819 #else
820 displayableWinContentAt (winInfo, index)
821 TuiGenWinInfoPtr winInfo;
822 int index;
823 #endif
824 {
825 return (displayableWinContentOf (winInfo, (TuiWinElementPtr) winInfo->content[index]));
826 } /* winContentAt */
827
828
829 /*
830 ** winElementHeight().
831 ** Answer the height of the element in lines
832 */
833 int
834 #ifdef __STDC__
835 winElementHeight (
836 TuiGenWinInfoPtr winInfo,
837 TuiWinElementPtr element)
838 #else
839 winElementHeight (winInfo, element)
840 TuiGenWinInfoPtr winInfo;
841 TuiWinElementPtr element;
842 #endif
843 {
844 int h;
845
846 if (winInfo->type == DATA_WIN)
847 /* FOR NOW SAY IT IS ONLY ONE LINE HIGH */
848 h = 1;
849 else
850 h = 1;
851
852 return h;
853 } /* winElementHeight */
854
855
856 /*
857 ** winByName().
858 ** Answer the window represented by name
859 */
860 TuiWinInfoPtr
861 #ifdef __STDC__
862 winByName (
863 char *name)
864 #else
865 winByName (name)
866 char *name;
867 #endif
868 {
869 TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL;
870 int i = 0;
871
872 while (i < MAX_MAJOR_WINDOWS && m_winPtrIsNull (winInfo))
873 {
874 if (strcmp (name, winName (&(winList[i]->generic))) == 0)
875 winInfo = winList[i];
876 i++;
877 }
878
879 return winInfo;
880 } /* winByName */
881
882
883 /*
884 ** partialWinByName().
885 ** Answer the window represented by name
886 */
887 TuiWinInfoPtr
888 #ifdef __STDC__
889 partialWinByName (
890 char *name)
891 #else
892 partialWinByName (name)
893 char *name;
894 #endif
895 {
896 TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL;
897
898 if (name != (char *) NULL)
899 {
900 int i = 0;
901
902 while (i < MAX_MAJOR_WINDOWS && m_winPtrIsNull (winInfo))
903 {
904 char *curName = winName (&winList[i]->generic);
905 if (strlen (name) <= strlen (curName) &&
906 strncmp (name, curName, strlen (name)) == 0)
907 winInfo = winList[i];
908 i++;
909 }
910 }
911
912 return winInfo;
913 } /* partialWinByName */
914
915
916 /*
917 ** winName().
918 ** Answer the name of the window
919 */
920 char *
921 #ifdef __STDC__
922 winName (
923 TuiGenWinInfoPtr winInfo)
924 #else
925 winName (winInfo)
926 TuiGenWinInfoPtr winInfo;
927 #endif
928 {
929 char *name = (char *) NULL;
930
931 switch (winInfo->type)
932 {
933 case SRC_WIN:
934 name = SRC_NAME;
935 break;
936 case CMD_WIN:
937 name = CMD_NAME;
938 break;
939 case DISASSEM_WIN:
940 name = DISASSEM_NAME;
941 break;
942 case DATA_WIN:
943 name = DATA_NAME;
944 break;
945 default:
946 name = "";
947 break;
948 }
949
950 return name;
951 } /* winName */
952
953
954 /*
955 ** initializeStaticData
956 */
957 void
958 #ifdef __STDC__
959 initializeStaticData (void)
960 #else
961 initializeStaticData ()
962 #endif
963 {
964 initGenericPart (sourceExecInfoWinPtr ());
965 initGenericPart (disassemExecInfoWinPtr ());
966 initGenericPart (locatorWinInfoPtr ());
967
968 return;
969 } /* initializeStaticData */
970
971
972 /*
973 ** allocGenericWinInfo().
974 */
975 TuiGenWinInfoPtr
976 #ifdef __STDC__
977 allocGenericWinInfo (void)
978 #else
979 allocGenericWinInfo ()
980 #endif
981 {
982 TuiGenWinInfoPtr win;
983
984 if ((win = (TuiGenWinInfoPtr) xmalloc (
985 sizeof (TuiGenWinInfoPtr))) != (TuiGenWinInfoPtr) NULL)
986 initGenericPart (win);
987
988 return win;
989 } /* allocGenericWinInfo */
990
991
992 /*
993 ** initGenericPart().
994 */
995 void
996 #ifdef __STDC__
997 initGenericPart (
998 TuiGenWinInfoPtr win)
999 #else
1000 initGenericPart (win)
1001 TuiGenWinInfoPtr win;
1002 #endif
1003 {
1004 win->width =
1005 win->height =
1006 win->origin.x =
1007 win->origin.y =
1008 win->viewportHeight =
1009 win->contentSize =
1010 win->lastVisibleLine = 0;
1011 win->handle = (WINDOW *) NULL;
1012 win->content = (OpaquePtr) NULL;
1013 win->contentInUse =
1014 win->isVisible = FALSE;
1015
1016 return;
1017 } /* initGenericPart */
1018
1019
1020 /*
1021 ** initContentElement().
1022 */
1023 void
1024 #ifdef __STDC__
1025 initContentElement (
1026 TuiWinElementPtr element,
1027 TuiWinType type)
1028 #else
1029 initContentElement (element, type)
1030 TuiWinElementPtr element;
1031 TuiWinType type;
1032 #endif
1033 {
1034 element->highlight = FALSE;
1035 switch (type)
1036 {
1037 case SRC_WIN:
1038 case DISASSEM_WIN:
1039 element->whichElement.source.line = (char *) NULL;
1040 element->whichElement.source.lineOrAddr.lineNo = 0;
1041 element->whichElement.source.isExecPoint = FALSE;
1042 element->whichElement.source.hasBreak = FALSE;
1043 break;
1044 case DATA_WIN:
1045 initGenericPart (&element->whichElement.dataWindow);
1046 element->whichElement.dataWindow.type = DATA_ITEM_WIN;
1047 ((TuiGenWinInfoPtr) & element->whichElement.dataWindow)->content =
1048 (OpaquePtr) allocContent (1, DATA_ITEM_WIN);
1049 ((TuiGenWinInfoPtr)
1050 & element->whichElement.dataWindow)->contentSize = 1;
1051 break;
1052 case CMD_WIN:
1053 element->whichElement.command.line = (char *) NULL;
1054 break;
1055 case DATA_ITEM_WIN:
1056 element->whichElement.data.name = (char *) NULL;
1057 element->whichElement.data.type = TUI_REGISTER;
1058 element->whichElement.data.itemNo = UNDEFINED_ITEM;
1059 element->whichElement.data.value = (Opaque) NULL;
1060 element->whichElement.data.highlight = FALSE;
1061 break;
1062 case LOCATOR_WIN:
1063 element->whichElement.locator.fileName[0] =
1064 element->whichElement.locator.procName[0] = (char) 0;
1065 element->whichElement.locator.lineNo = 0;
1066 element->whichElement.locator.addr = 0;
1067 break;
1068 case EXEC_INFO_WIN:
1069 element->whichElement.simpleString = blankStr ();
1070 break;
1071 default:
1072 break;
1073 }
1074 return;
1075 } /* initContentElement */
1076
1077 /*
1078 ** initWinInfo().
1079 */
1080 void
1081 #ifdef __STDC__
1082 initWinInfo (
1083 TuiWinInfoPtr winInfo)
1084 #else
1085 initWinInfo (winInfo)
1086 TuiWinInfoPtr winInfo;
1087 #endif
1088 {
1089 initGenericPart (&winInfo->generic);
1090 winInfo->canHighlight =
1091 winInfo->isHighlighted = FALSE;
1092 switch (winInfo->generic.type)
1093 {
1094 case SRC_WIN:
1095 case DISASSEM_WIN:
1096 winInfo->detail.sourceInfo.executionInfo = (TuiGenWinInfoPtr) NULL;
1097 winInfo->detail.sourceInfo.hasLocator = FALSE;
1098 winInfo->detail.sourceInfo.horizontalOffset = 0;
1099 winInfo->detail.sourceInfo.startLineOrAddr.addr = (Opaque) NULL;
1100 break;
1101 case DATA_WIN:
1102 winInfo->detail.dataDisplayInfo.dataContent = (TuiWinContent) NULL;
1103 winInfo->detail.dataDisplayInfo.dataContentCount = 0;
1104 winInfo->detail.dataDisplayInfo.regsContent = (TuiWinContent) NULL;
1105 winInfo->detail.dataDisplayInfo.regsContentCount = 0;
1106 winInfo->detail.dataDisplayInfo.regsDisplayType =
1107 TUI_UNDEFINED_REGS;
1108 winInfo->detail.dataDisplayInfo.regsColumnCount = 1;
1109 winInfo->detail.dataDisplayInfo.displayRegs = FALSE;
1110 break;
1111 case CMD_WIN:
1112 winInfo->detail.commandInfo.curLine = 0;
1113 winInfo->detail.commandInfo.curch = 0;
1114 break;
1115 default:
1116 winInfo->detail.opaque = (Opaque) NULL;
1117 break;
1118 }
1119
1120 return;
1121 } /* initWinInfo */
1122
1123
1124 /*
1125 ** allocWinInfo().
1126 */
1127 TuiWinInfoPtr
1128 #ifdef __STDC__
1129 allocWinInfo (
1130 TuiWinType type)
1131 #else
1132 allocWinInfo (type)
1133 TuiWinType type;
1134 #endif
1135 {
1136 TuiWinInfoPtr winInfo = (TuiWinInfoPtr) NULL;
1137
1138 winInfo = (TuiWinInfoPtr) xmalloc (sizeof (TuiWinInfo));
1139 if (m_winPtrNotNull (winInfo))
1140 {
1141 winInfo->generic.type = type;
1142 initWinInfo (winInfo);
1143 }
1144
1145 return winInfo;
1146 } /* allocWinInfo */
1147
1148
1149 /*
1150 ** allocContent().
1151 ** Allocates the content and elements in a block.
1152 */
1153 TuiWinContent
1154 #ifdef __STDC__
1155 allocContent (
1156 int numElements,
1157 TuiWinType type)
1158 #else
1159 allocContent (numElements, type)
1160 int numElements;
1161 TuiWinType type;
1162 #endif
1163 {
1164 TuiWinContent content = (TuiWinContent) NULL;
1165 char *elementBlockPtr = (char *) NULL;
1166 int i;
1167
1168 if ((content = (TuiWinContent)
1169 xmalloc (sizeof (TuiWinElementPtr) * numElements)) != (TuiWinContent) NULL)
1170 { /*
1171 ** All windows, except the data window, can allocate the elements
1172 ** in a chunk. The data window cannot because items can be
1173 ** added/removed from the data display by the user at any time.
1174 */
1175 if (type != DATA_WIN)
1176 {
1177 if ((elementBlockPtr = (char *)
1178 xmalloc (sizeof (TuiWinElement) * numElements)) != (char *) NULL)
1179 {
1180 for (i = 0; i < numElements; i++)
1181 {
1182 content[i] = (TuiWinElementPtr) elementBlockPtr;
1183 initContentElement (content[i], type);
1184 elementBlockPtr += sizeof (TuiWinElement);
1185 }
1186 }
1187 else
1188 {
1189 tuiFree ((char *) content);
1190 content = (TuiWinContent) NULL;
1191 }
1192 }
1193 }
1194
1195 return content;
1196 } /* allocContent */
1197
1198
1199 /*
1200 ** addContentElements().
1201 ** Adds the input number of elements to the windows's content. If
1202 ** no content has been allocated yet, allocContent() is called to
1203 ** do this. The index of the first element added is returned,
1204 ** unless there is a memory allocation error, in which case, (-1)
1205 ** is returned.
1206 */
1207 int
1208 #ifdef __STDC__
1209 addContentElements (
1210 TuiGenWinInfoPtr winInfo,
1211 int numElements)
1212 #else
1213 addContentElements (winInfo, numElements)
1214 TuiGenWinInfoPtr winInfo;
1215 int numElements;
1216 #endif
1217 {
1218 TuiWinElementPtr elementPtr;
1219 int i, indexStart;
1220
1221 if (winInfo->content == (OpaquePtr) NULL)
1222 {
1223 winInfo->content = (OpaquePtr) allocContent (numElements, winInfo->type);
1224 indexStart = 0;
1225 }
1226 else
1227 indexStart = winInfo->contentSize;
1228 if (winInfo->content != (OpaquePtr) NULL)
1229 {
1230 for (i = indexStart; (i < numElements + indexStart); i++)
1231 {
1232 if ((elementPtr = (TuiWinElementPtr)
1233 xmalloc (sizeof (TuiWinElement))) != (TuiWinElementPtr) NULL)
1234 {
1235 winInfo->content[i] = (Opaque) elementPtr;
1236 initContentElement (elementPtr, winInfo->type);
1237 winInfo->contentSize++;
1238 }
1239 else /* things must be really hosed now! We ran out of memory!?*/
1240 return (-1);
1241 }
1242 }
1243
1244 return indexStart;
1245 } /* addContentElements */
1246
1247
1248 /*
1249 ** tuiDelWindow().
1250 ** Delete all curses windows associated with winInfo, leaving everything
1251 ** else in tact.
1252 */
1253 void
1254 #ifdef __STDC__
1255 tuiDelWindow (
1256 TuiWinInfoPtr winInfo)
1257 #else
1258 tuiDelWindow (winInfo)
1259 TuiWinInfoPtr winInfo;
1260 #endif
1261 {
1262 Opaque detail;
1263 int i;
1264 TuiGenWinInfoPtr genericWin;
1265
1266
1267 switch (winInfo->generic.type)
1268 {
1269 case SRC_WIN:
1270 case DISASSEM_WIN:
1271 genericWin = locatorWinInfoPtr ();
1272 if (genericWin != (TuiGenWinInfoPtr) NULL)
1273 {
1274 tuiDelwin (genericWin->handle);
1275 genericWin->handle = (WINDOW *) NULL;
1276 genericWin->isVisible = FALSE;
1277 }
1278 genericWin = winInfo->detail.sourceInfo.executionInfo;
1279 if (genericWin != (TuiGenWinInfoPtr) NULL)
1280 {
1281 tuiDelwin (genericWin->handle);
1282 genericWin->handle = (WINDOW *) NULL;
1283 genericWin->isVisible = FALSE;
1284 }
1285 break;
1286 case DATA_WIN:
1287 if (winInfo->generic.content != (OpaquePtr) NULL)
1288 {
1289 int i;
1290
1291 tuiDelDataWindows (
1292 winInfo->detail.dataDisplayInfo.regsContent,
1293 winInfo->detail.dataDisplayInfo.regsContentCount);
1294 tuiDelDataWindows (
1295 winInfo->detail.dataDisplayInfo.dataContent,
1296 winInfo->detail.dataDisplayInfo.dataContentCount);
1297 }
1298 break;
1299 default:
1300 break;
1301 }
1302 if (winInfo->generic.handle != (WINDOW *) NULL)
1303 {
1304 tuiDelwin (winInfo->generic.handle);
1305 winInfo->generic.handle = (WINDOW *) NULL;
1306 winInfo->generic.isVisible = FALSE;
1307 }
1308
1309 return;
1310 } /* tuiDelWindow */
1311
1312
1313 /*
1314 ** freeWindow().
1315 */
1316 void
1317 #ifdef __STDC__
1318 freeWindow (
1319 TuiWinInfoPtr winInfo)
1320 #else
1321 freeWindow (winInfo)
1322 TuiWinInfoPtr winInfo;
1323 #endif
1324 {
1325 Opaque detail;
1326 int i;
1327 TuiGenWinInfoPtr genericWin;
1328
1329
1330 switch (winInfo->generic.type)
1331 {
1332 case SRC_WIN:
1333 case DISASSEM_WIN:
1334 genericWin = locatorWinInfoPtr ();
1335 if (genericWin != (TuiGenWinInfoPtr) NULL)
1336 {
1337 tuiDelwin (genericWin->handle);
1338 genericWin->handle = (WINDOW *) NULL;
1339 }
1340 freeWinContent (genericWin);
1341 genericWin = winInfo->detail.sourceInfo.executionInfo;
1342 if (genericWin != (TuiGenWinInfoPtr) NULL)
1343 {
1344 tuiDelwin (genericWin->handle);
1345 genericWin->handle = (WINDOW *) NULL;
1346 freeWinContent (genericWin);
1347 }
1348 break;
1349 case DATA_WIN:
1350 if (winInfo->generic.content != (OpaquePtr) NULL)
1351 {
1352 freeDataContent (
1353 winInfo->detail.dataDisplayInfo.regsContent,
1354 winInfo->detail.dataDisplayInfo.regsContentCount);
1355 winInfo->detail.dataDisplayInfo.regsContent =
1356 (TuiWinContent) NULL;
1357 winInfo->detail.dataDisplayInfo.regsContentCount = 0;
1358 freeDataContent (
1359 winInfo->detail.dataDisplayInfo.dataContent,
1360 winInfo->detail.dataDisplayInfo.dataContentCount);
1361 winInfo->detail.dataDisplayInfo.dataContent =
1362 (TuiWinContent) NULL;
1363 winInfo->detail.dataDisplayInfo.dataContentCount = 0;
1364 winInfo->detail.dataDisplayInfo.regsDisplayType =
1365 TUI_UNDEFINED_REGS;
1366 winInfo->detail.dataDisplayInfo.regsColumnCount = 1;
1367 winInfo->detail.dataDisplayInfo.displayRegs = FALSE;
1368 winInfo->generic.content = (OpaquePtr) NULL;
1369 winInfo->generic.contentSize = 0;
1370 }
1371 break;
1372 default:
1373 break;
1374 }
1375 if (winInfo->generic.handle != (WINDOW *) NULL)
1376 {
1377 tuiDelwin (winInfo->generic.handle);
1378 winInfo->generic.handle = (WINDOW *) NULL;
1379 freeWinContent (&winInfo->generic);
1380 }
1381 free (winInfo);
1382
1383 return;
1384 } /* freeWindow */
1385
1386
1387 /*
1388 ** freeAllSourceWinsContent().
1389 */
1390 void
1391 #ifdef __STDC__
1392 freeAllSourceWinsContent (void)
1393 #else
1394 freeAllSourceWinsContent ()
1395 #endif
1396 {
1397 int i;
1398
1399 for (i = 0; i < (sourceWindows ())->count; i++)
1400 {
1401 TuiWinInfoPtr winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i];
1402
1403 if (m_winPtrNotNull (winInfo))
1404 {
1405 freeWinContent (&(winInfo->generic));
1406 freeWinContent (winInfo->detail.sourceInfo.executionInfo);
1407 }
1408 }
1409
1410 return;
1411 } /* freeAllSourceWinsContent */
1412
1413
1414 /*
1415 ** freeWinContent().
1416 */
1417 void
1418 #ifdef __STDC__
1419 freeWinContent (
1420 TuiGenWinInfoPtr winInfo)
1421 #else
1422 freeWinContent (winInfo)
1423 TuiGenWinInfoPtr winInfo;
1424 #endif
1425 {
1426 if (winInfo->content != (OpaquePtr) NULL)
1427 {
1428 freeContent ((TuiWinContent) winInfo->content,
1429 winInfo->contentSize,
1430 winInfo->type);
1431 winInfo->content = (OpaquePtr) NULL;
1432 }
1433 winInfo->contentSize = 0;
1434
1435 return;
1436 } /* freeWinContent */
1437
1438
1439 /*
1440 ** freeAllWindows().
1441 */
1442 void
1443 #ifdef __STDC__
1444 freeAllWindows (void)
1445 #else
1446 freeAllWindows ()
1447 #endif
1448 {
1449 TuiWinType type = SRC_WIN;
1450
1451 for (; type < MAX_MAJOR_WINDOWS; type++)
1452 if (m_winPtrNotNull (winList[type]) &&
1453 winList[type]->generic.type != UNDEFINED_WIN)
1454 freeWindow (winList[type]);
1455 return;
1456 } /* freeAllWindows */
1457
1458
1459 void
1460 #ifdef __STDC__
1461 tuiDelDataWindows (
1462 TuiWinContent content,
1463 int contentSize)
1464 #else
1465 tuiDelDataWindows (content, contentSize)
1466 TuiWinContent content;
1467 int contentSize;
1468 #endif
1469 {
1470 int i;
1471
1472 /*
1473 ** Remember that data window content elements are of type TuiGenWinInfoPtr,
1474 ** each of which whose single element is a data element.
1475 */
1476 for (i = 0; i < contentSize; i++)
1477 {
1478 TuiGenWinInfoPtr genericWin = &content[i]->whichElement.dataWindow;
1479
1480 if (genericWin != (TuiGenWinInfoPtr) NULL)
1481 {
1482 tuiDelwin (genericWin->handle);
1483 genericWin->handle = (WINDOW *) NULL;
1484 genericWin->isVisible = FALSE;
1485 }
1486 }
1487
1488 return;
1489 } /* tuiDelDataWindows */
1490
1491
1492 void
1493 #ifdef __STDC__
1494 freeDataContent (
1495 TuiWinContent content,
1496 int contentSize)
1497 #else
1498 freeDataContent (content, contentSize)
1499 TuiWinContent content;
1500 int contentSize;
1501 #endif
1502 {
1503 int i;
1504
1505 /*
1506 ** Remember that data window content elements are of type TuiGenWinInfoPtr,
1507 ** each of which whose single element is a data element.
1508 */
1509 for (i = 0; i < contentSize; i++)
1510 {
1511 TuiGenWinInfoPtr genericWin = &content[i]->whichElement.dataWindow;
1512
1513 if (genericWin != (TuiGenWinInfoPtr) NULL)
1514 {
1515 tuiDelwin (genericWin->handle);
1516 genericWin->handle = (WINDOW *) NULL;
1517 freeWinContent (genericWin);
1518 }
1519 }
1520 freeContent (content,
1521 contentSize,
1522 DATA_WIN);
1523
1524 return;
1525 } /* freeDataContent */
1526
1527
1528 /**********************************
1529 ** LOCAL STATIC FUNCTIONS **
1530 **********************************/
1531
1532
1533 /*
1534 ** freeContent().
1535 */
1536 static void
1537 #ifdef __STDC__
1538 freeContent (
1539 TuiWinContent content,
1540 int contentSize,
1541 TuiWinType winType)
1542 #else
1543 freeContent (content, contentSize, winType)
1544 TuiWinContent content;
1545 int contentSize;
1546 TuiWinType winType;
1547 #endif
1548 {
1549 if (content != (TuiWinContent) NULL)
1550 {
1551 freeContentElements (content, contentSize, winType);
1552 tuiFree ((char *) content);
1553 }
1554
1555 return;
1556 } /* freeContent */
1557
1558
1559 /*
1560 ** freeContentElements().
1561 */
1562 static void
1563 #ifdef __STDC__
1564 freeContentElements (
1565 TuiWinContent content,
1566 int contentSize,
1567 TuiWinType type)
1568 #else
1569 freeContentElements (content, contentSize, type)
1570 TuiWinContent content;
1571 int contentSize;
1572 TuiWinType type;
1573 #endif
1574 {
1575 if (content != (TuiWinContent) NULL)
1576 {
1577 int i;
1578
1579 if (type == SRC_WIN || type == DISASSEM_WIN)
1580 {
1581 /* free whole source block */
1582 if (content[0]->whichElement.source.line != (char *) NULL)
1583 tuiFree (content[0]->whichElement.source.line);
1584 }
1585 else
1586 {
1587 for (i = 0; i < contentSize; i++)
1588 {
1589 TuiWinElementPtr element;
1590
1591 element = content[i];
1592 if (element != (TuiWinElementPtr) NULL)
1593 {
1594 switch (type)
1595 {
1596 case DATA_WIN:
1597 tuiFree ((char *) element);
1598 break;
1599 case DATA_ITEM_WIN:
1600 /*
1601 ** Note that data elements are not allocated
1602 ** in a single block, but individually, as needed.
1603 */
1604 if (element->whichElement.data.type != TUI_REGISTER)
1605 tuiFree ((char *)
1606 element->whichElement.data.name);
1607 tuiFree ((char *) element->whichElement.data.value);
1608 tuiFree ((char *) element);
1609 break;
1610 case CMD_WIN:
1611 tuiFree ((char *) element->whichElement.command.line);
1612 break;
1613 default:
1614 break;
1615 }
1616 }
1617 }
1618 }
1619 if (type != DATA_WIN && type != DATA_ITEM_WIN)
1620 tuiFree ((char *) content[0]); /* free the element block */
1621 }
1622
1623 return;
1624 } /* freeContentElements */