1 /* TUI display registers in window.
3 Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
6 Contributed by Hewlett-Packard Company.
8 This file is part of GDB.
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.
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.
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. */
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>
52 #include "tuiLayout.h"
54 #include "tuiDataWin.h"
55 #include "tuiGeneralWin.h"
58 /*****************************************
59 ** LOCAL DEFINITIONS **
60 ******************************************/
61 #define DOUBLE_FLOAT_LABEL_WIDTH 6
62 #define DOUBLE_FLOAT_LABEL_FMT "%6.6s: "
63 #define DOUBLE_FLOAT_VALUE_WIDTH 30 /*min of 16 but may be in sci notation */
65 #define SINGLE_FLOAT_LABEL_WIDTH 6
66 #define SINGLE_FLOAT_LABEL_FMT "%6.6s: "
67 #define SINGLE_FLOAT_VALUE_WIDTH 25 /* min of 8 but may be in sci notation */
69 #define SINGLE_LABEL_WIDTH 16
70 #define SINGLE_LABEL_FMT "%10.10s: "
71 #define SINGLE_VALUE_WIDTH 20 /* minimum of 8 but may be in sci notation */
73 /* In the code HP gave Cygnus, this was actually a function call to a
74 PA-specific function, which was supposed to determine whether the
75 target was a 64-bit or 32-bit processor. However, the 64-bit
76 support wasn't complete, so we didn't merge that in, so we leave
77 this here as a stub. */
80 /*****************************************
82 ******************************************/
85 /*****************************************
86 ** STATIC LOCAL FUNCTIONS FORWARD DECLS **
87 ******************************************/
88 static TuiStatus _tuiSetRegsContent
89 (int, int, struct frame_info
*, TuiRegisterDisplayType
, int);
90 static const char *_tuiRegisterName (int);
91 static TuiStatus
_tuiGetRegisterRawValue (int, char *, struct frame_info
*);
92 static void _tuiSetRegisterElement
93 (int, struct frame_info
*, TuiDataElementPtr
, int);
94 static void _tuiDisplayRegister (int, TuiGenWinInfoPtr
, enum precision_type
);
95 static void _tuiRegisterFormat
96 (char *, int, int, TuiDataElementPtr
, enum precision_type
);
97 static TuiStatus
_tuiSetGeneralRegsContent (int);
98 static TuiStatus
_tuiSetSpecialRegsContent (int);
99 static TuiStatus
_tuiSetGeneralAndSpecialRegsContent (int);
100 static TuiStatus
_tuiSetFloatRegsContent (TuiRegisterDisplayType
, int);
101 static int _tuiRegValueHasChanged
102 (TuiDataElementPtr
, struct frame_info
*, char *);
103 static void _tuiShowFloat_command (char *, int);
104 static void _tuiShowGeneral_command (char *, int);
105 static void _tuiShowSpecial_command (char *, int);
106 static void _tui_vShowRegisters_commandSupport (TuiRegisterDisplayType
);
107 static void _tuiToggleFloatRegs_command (char *, int);
108 static void _tuiScrollRegsForward_command (char *, int);
109 static void _tuiScrollRegsBackward_command (char *, int);
113 /*****************************************
114 ** PUBLIC FUNCTIONS **
115 ******************************************/
118 ** tuiLastRegsLineNo()
119 ** Answer the number of the last line in the regs display.
120 ** If there are no registers (-1) is returned.
123 tuiLastRegsLineNo (void)
125 register int numLines
= (-1);
127 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
> 0)
129 numLines
= (dataWin
->detail
.dataDisplayInfo
.regsContentCount
/
130 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
);
131 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
%
132 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
)
136 } /* tuiLastRegsLineNo */
140 ** tuiLineFromRegElementNo()
141 ** Answer the line number that the register element at elementNo is
142 ** on. If elementNo is greater than the number of register elements
143 ** there are, -1 is returned.
146 tuiLineFromRegElementNo (int elementNo
)
148 if (elementNo
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
)
156 (dataWin
->detail
.dataDisplayInfo
.regsColumnCount
* i
))
166 } /* tuiLineFromRegElementNo */
170 ** tuiFirstRegElementNoInLine()
171 ** Answer the index of the first element in lineNo. If lineNo is
172 ** past the register area (-1) is returned.
175 tuiFirstRegElementNoInLine (int lineNo
)
177 if ((lineNo
* dataWin
->detail
.dataDisplayInfo
.regsColumnCount
)
178 <= dataWin
->detail
.dataDisplayInfo
.regsContentCount
)
179 return ((lineNo
+ 1) *
180 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
) -
181 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
;
184 } /* tuiFirstRegElementNoInLine */
188 ** tuiLastRegElementNoInLine()
189 ** Answer the index of the last element in lineNo. If lineNo is past
190 ** the register area (-1) is returned.
193 tuiLastRegElementNoInLine (int lineNo
)
195 if ((lineNo
* dataWin
->detail
.dataDisplayInfo
.regsColumnCount
) <=
196 dataWin
->detail
.dataDisplayInfo
.regsContentCount
)
197 return ((lineNo
+ 1) *
198 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
) - 1;
201 } /* tuiLastRegElementNoInLine */
205 ** tuiCalculateRegsColumnCount
206 ** Calculate the number of columns that should be used to display
210 tuiCalculateRegsColumnCount (TuiRegisterDisplayType dpyType
)
212 int colCount
, colWidth
;
214 if (IS_64BIT
|| dpyType
== TUI_DFLOAT_REGS
)
215 colWidth
= DOUBLE_FLOAT_VALUE_WIDTH
+ DOUBLE_FLOAT_LABEL_WIDTH
;
218 if (dpyType
== TUI_SFLOAT_REGS
)
219 colWidth
= SINGLE_FLOAT_VALUE_WIDTH
+ SINGLE_FLOAT_LABEL_WIDTH
;
221 colWidth
= SINGLE_VALUE_WIDTH
+ SINGLE_LABEL_WIDTH
;
223 colCount
= (dataWin
->generic
.width
- 2) / colWidth
;
226 } /* tuiCalulateRegsColumnCount */
230 ** tuiShowRegisters().
231 ** Show the registers int the data window as indicated by dpyType.
232 ** If there is any other registers being displayed, then they are
233 ** cleared. What registers are displayed is dependent upon dpyType.
236 tuiShowRegisters (TuiRegisterDisplayType dpyType
)
238 TuiStatus ret
= TUI_FAILURE
;
239 int refreshValuesOnly
= FALSE
;
241 /* Say that registers should be displayed, even if there is a problem */
242 dataWin
->detail
.dataDisplayInfo
.displayRegs
= TRUE
;
244 if (target_has_registers
)
247 (dpyType
== dataWin
->detail
.dataDisplayInfo
.regsDisplayType
);
250 case TUI_GENERAL_REGS
:
251 ret
= _tuiSetGeneralRegsContent (refreshValuesOnly
);
253 case TUI_SFLOAT_REGS
:
254 case TUI_DFLOAT_REGS
:
255 ret
= _tuiSetFloatRegsContent (dpyType
, refreshValuesOnly
);
258 /* could ifdef out */
260 case TUI_SPECIAL_REGS
:
261 ret
= _tuiSetSpecialRegsContent (refreshValuesOnly
);
263 case TUI_GENERAL_AND_SPECIAL_REGS
:
264 ret
= _tuiSetGeneralAndSpecialRegsContent (refreshValuesOnly
);
267 /* end of potential if def */
273 if (ret
== TUI_FAILURE
)
275 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
= TUI_UNDEFINED_REGS
;
276 tuiEraseDataContent (NO_REGS_STRING
);
282 /* Clear all notation of changed values */
283 for (i
= 0; (i
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
); i
++)
285 TuiGenWinInfoPtr dataItemWin
;
287 dataItemWin
= &dataWin
->detail
.dataDisplayInfo
.
288 regsContent
[i
]->whichElement
.dataWindow
;
289 (&((TuiWinElementPtr
)
290 dataItemWin
->content
[0])->whichElement
.data
)->highlight
= FALSE
;
292 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
= dpyType
;
293 tuiDisplayAllData ();
295 (tuiLayoutDef ())->regsDisplayType
= dpyType
;
298 } /* tuiShowRegisters */
302 ** tuiDisplayRegistersFrom().
303 ** Function to display the registers in the content from
304 ** 'startElementNo' until the end of the register content or the
305 ** end of the display height. No checking for displaying past
306 ** the end of the registers is done here.
309 tuiDisplayRegistersFrom (int startElementNo
)
311 if (dataWin
->detail
.dataDisplayInfo
.regsContent
!= (TuiWinContent
) NULL
&&
312 dataWin
->detail
.dataDisplayInfo
.regsContentCount
> 0)
314 register int i
= startElementNo
;
315 int j
, valueCharsWide
, itemWinWidth
, curY
, labelWidth
;
316 enum precision_type precision
;
318 precision
= (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
319 == TUI_DFLOAT_REGS
) ?
320 double_precision
: unspecified_precision
;
322 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
== TUI_DFLOAT_REGS
)
324 valueCharsWide
= DOUBLE_FLOAT_VALUE_WIDTH
;
325 labelWidth
= DOUBLE_FLOAT_LABEL_WIDTH
;
329 if (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
==
332 valueCharsWide
= SINGLE_FLOAT_VALUE_WIDTH
;
333 labelWidth
= SINGLE_FLOAT_LABEL_WIDTH
;
337 valueCharsWide
= SINGLE_VALUE_WIDTH
;
338 labelWidth
= SINGLE_LABEL_WIDTH
;
341 itemWinWidth
= valueCharsWide
+ labelWidth
;
343 ** Now create each data "sub" window, and write the display into it.
346 while (i
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
&&
347 curY
<= dataWin
->generic
.viewportHeight
)
350 (j
< dataWin
->detail
.dataDisplayInfo
.regsColumnCount
&&
351 i
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
); j
++)
353 TuiGenWinInfoPtr dataItemWin
;
354 TuiDataElementPtr dataElementPtr
;
356 /* create the window if necessary */
357 dataItemWin
= &dataWin
->detail
.dataDisplayInfo
.
358 regsContent
[i
]->whichElement
.dataWindow
;
359 dataElementPtr
= &((TuiWinElementPtr
)
360 dataItemWin
->content
[0])->whichElement
.data
;
361 if (dataItemWin
->handle
== (WINDOW
*) NULL
)
363 dataItemWin
->height
= 1;
364 dataItemWin
->width
= (precision
== double_precision
) ?
365 itemWinWidth
+ 2 : itemWinWidth
+ 1;
366 dataItemWin
->origin
.x
= (itemWinWidth
* j
) + 1;
367 dataItemWin
->origin
.y
= curY
;
368 makeWindow (dataItemWin
, DONT_BOX_WINDOW
);
369 scrollok (dataItemWin
->handle
, FALSE
);
371 touchwin (dataItemWin
->handle
);
374 ** Get the printable representation of the register
377 _tuiDisplayRegister (
378 dataElementPtr
->itemNo
, dataItemWin
, precision
);
379 i
++; /* next register */
381 curY
++; /* next row; */
386 } /* tuiDisplayRegistersFrom */
390 ** tuiDisplayRegElementAtLine().
391 ** Function to display the registers in the content from
392 ** 'startElementNo' on 'startLineNo' until the end of the
393 ** register content or the end of the display height.
394 ** This function checks that we won't display off the end
395 ** of the register display.
398 tuiDisplayRegElementAtLine (int startElementNo
, int startLineNo
)
400 if (dataWin
->detail
.dataDisplayInfo
.regsContent
!= (TuiWinContent
) NULL
&&
401 dataWin
->detail
.dataDisplayInfo
.regsContentCount
> 0)
403 register int elementNo
= startElementNo
;
405 if (startElementNo
!= 0 && startLineNo
!= 0)
407 register int lastLineNo
, firstLineOnLastPage
;
409 lastLineNo
= tuiLastRegsLineNo ();
410 firstLineOnLastPage
= lastLineNo
- (dataWin
->generic
.height
- 2);
411 if (firstLineOnLastPage
< 0)
412 firstLineOnLastPage
= 0;
414 ** If there is no other data displayed except registers,
415 ** and the elementNo causes us to scroll past the end of the
416 ** registers, adjust what element to really start the display at.
418 if (dataWin
->detail
.dataDisplayInfo
.dataContentCount
<= 0 &&
419 startLineNo
> firstLineOnLastPage
)
420 elementNo
= tuiFirstRegElementNoInLine (firstLineOnLastPage
);
422 tuiDisplayRegistersFrom (elementNo
);
426 } /* tuiDisplayRegElementAtLine */
431 ** tuiDisplayRegistersFromLine().
432 ** Function to display the registers starting at line lineNo in
433 ** the data window. Answers the line number that the display
434 ** actually started from. If nothing is displayed (-1) is returned.
437 tuiDisplayRegistersFromLine (int lineNo
, int forceDisplay
)
439 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
> 0)
445 else if (forceDisplay
)
447 ** If we must display regs (forceDisplay is true), then make
448 ** sure that we don't display off the end of the registers.
450 if (lineNo
>= tuiLastRegsLineNo ())
452 if ((line
= tuiLineFromRegElementNo (
453 dataWin
->detail
.dataDisplayInfo
.regsContentCount
- 1)) < 0)
462 elementNo
= tuiFirstRegElementNoInLine (line
);
463 if (elementNo
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
)
464 tuiDisplayRegElementAtLine (elementNo
, line
);
471 return (-1); /* nothing was displayed */
472 } /* tuiDisplayRegistersFromLine */
476 ** tuiCheckRegisterValues()
477 ** This function check all displayed registers for changes in
478 ** values, given a particular frame. If the values have changed,
479 ** they are updated with the new value and highlighted.
482 tuiCheckRegisterValues (struct frame_info
*frame
)
484 if (m_winPtrNotNull (dataWin
) && dataWin
->generic
.isVisible
)
486 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
<= 0 &&
487 dataWin
->detail
.dataDisplayInfo
.displayRegs
)
488 tuiShowRegisters ((tuiLayoutDef ())->regsDisplayType
);
492 char rawBuf
[MAX_REGISTER_RAW_SIZE
];
495 (i
< dataWin
->detail
.dataDisplayInfo
.regsContentCount
); i
++)
497 TuiDataElementPtr dataElementPtr
;
498 TuiGenWinInfoPtr dataItemWinPtr
;
501 dataItemWinPtr
= &dataWin
->detail
.dataDisplayInfo
.
502 regsContent
[i
]->whichElement
.dataWindow
;
503 dataElementPtr
= &((TuiWinElementPtr
)
504 dataItemWinPtr
->content
[0])->whichElement
.data
;
505 wasHilighted
= dataElementPtr
->highlight
;
506 dataElementPtr
->highlight
=
507 _tuiRegValueHasChanged (dataElementPtr
, frame
, &rawBuf
[0]);
508 if (dataElementPtr
->highlight
)
512 size
= REGISTER_RAW_SIZE (dataElementPtr
->itemNo
);
513 for (j
= 0; j
< size
; j
++)
514 ((char *) dataElementPtr
->value
)[j
] = rawBuf
[j
];
515 _tuiDisplayRegister (
516 dataElementPtr
->itemNo
,
518 ((dataWin
->detail
.dataDisplayInfo
.regsDisplayType
==
520 double_precision
: unspecified_precision
));
522 else if (wasHilighted
)
524 dataElementPtr
->highlight
= FALSE
;
525 _tuiDisplayRegister (
526 dataElementPtr
->itemNo
,
528 ((dataWin
->detail
.dataDisplayInfo
.regsDisplayType
==
530 double_precision
: unspecified_precision
));
536 } /* tuiCheckRegisterValues */
540 ** tuiToggleFloatRegs().
543 tuiToggleFloatRegs (void)
545 TuiLayoutDefPtr layoutDef
= tuiLayoutDef ();
547 if (layoutDef
->floatRegsDisplayType
== TUI_SFLOAT_REGS
)
548 layoutDef
->floatRegsDisplayType
= TUI_DFLOAT_REGS
;
550 layoutDef
->floatRegsDisplayType
= TUI_SFLOAT_REGS
;
552 if (m_winPtrNotNull (dataWin
) && dataWin
->generic
.isVisible
&&
553 (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
== TUI_SFLOAT_REGS
||
554 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
== TUI_DFLOAT_REGS
))
555 tuiShowRegisters (layoutDef
->floatRegsDisplayType
);
558 } /* tuiToggleFloatRegs */
562 _initialize_tuiRegs (void)
566 add_com ("fr", class_tui
, _tuiShowFloat_command
,
567 "Display only floating point registers\n");
568 add_com ("gr", class_tui
, _tuiShowGeneral_command
,
569 "Display only general registers\n");
570 add_com ("sr", class_tui
, _tuiShowSpecial_command
,
571 "Display only special registers\n");
572 add_com ("+r", class_tui
, _tuiScrollRegsForward_command
,
573 "Scroll the registers window forward\n");
574 add_com ("-r", class_tui
, _tuiScrollRegsBackward_command
,
575 "Scroll the register window backward\n");
576 add_com ("tf", class_tui
, _tuiToggleFloatRegs_command
,
577 "Toggle between single and double precision floating point registers.\n");
578 add_cmd (TUI_FLOAT_REGS_NAME_LOWER
,
580 _tuiToggleFloatRegs_command
,
581 "Toggle between single and double precision floating point \
588 /*****************************************
589 ** STATIC LOCAL FUNCTIONS **
590 ******************************************/
594 ** _tuiRegisterName().
595 ** Return the register name.
598 _tuiRegisterName (int regNum
)
600 return REGISTER_NAME (regNum
);
602 extern int pagination_enabled
;
605 tui_restore_gdbout (void *ui
)
607 ui_file_delete (gdb_stdout
);
608 gdb_stdout
= (struct ui_file
*) ui
;
609 pagination_enabled
= 1;
613 ** _tuiRegisterFormat
614 ** Function to format the register name and value into a buffer,
615 ** suitable for printing or display
618 _tuiRegisterFormat (char *buf
, int bufLen
, int regNum
,
619 TuiDataElementPtr dataElement
,
620 enum precision_type precision
)
622 struct ui_file
*stream
;
623 struct ui_file
*old_stdout
;
625 struct cleanup
*cleanups
;
629 name
= REGISTER_NAME (regNum
);
636 pagination_enabled
= 0;
637 old_stdout
= gdb_stdout
;
638 stream
= tui_sfileopen (bufLen
);
640 cleanups
= make_cleanup (tui_restore_gdbout
, (void*) old_stdout
);
641 gdbarch_print_registers_info (current_gdbarch
, stream
, deprecated_selected_frame
,
644 /* Save formatted output in the buffer. */
645 p
= tui_file_get_strbuf (stream
);
647 while (*p
&& *p
== *name
++ && bufLen
)
655 while (pos
< 8 && bufLen
)
661 strncpy (buf
, p
, bufLen
);
663 /* Remove the possible \n. */
664 p
= strchr (buf
, '\n');
668 do_cleanups (cleanups
);
672 #define NUM_GENERAL_REGS 32
674 ** _tuiSetGeneralRegsContent().
675 ** Set the content of the data window to consist of the general registers.
678 _tuiSetGeneralRegsContent (int refreshValuesOnly
)
680 return (_tuiSetRegsContent (0,
681 NUM_GENERAL_REGS
- 1,
682 deprecated_selected_frame
,
686 } /* _tuiSetGeneralRegsContent */
689 #ifndef PCOQ_HEAD_REGNUM
690 #define START_SPECIAL_REGS 0
692 #define START_SPECIAL_REGS PCOQ_HEAD_REGNUM
696 ** _tuiSetSpecialRegsContent().
697 ** Set the content of the data window to consist of the special registers.
700 _tuiSetSpecialRegsContent (int refreshValuesOnly
)
702 TuiStatus ret
= TUI_FAILURE
;
705 endRegNum
= FP0_REGNUM
- 1;
706 ret
= _tuiSetRegsContent (START_SPECIAL_REGS
,
708 deprecated_selected_frame
,
713 } /* _tuiSetSpecialRegsContent */
717 ** _tuiSetGeneralAndSpecialRegsContent().
718 ** Set the content of the data window to consist of the special registers.
721 _tuiSetGeneralAndSpecialRegsContent (int refreshValuesOnly
)
723 TuiStatus ret
= TUI_FAILURE
;
724 int endRegNum
= (-1);
726 endRegNum
= FP0_REGNUM
- 1;
727 ret
= _tuiSetRegsContent (
728 0, endRegNum
, deprecated_selected_frame
, TUI_SPECIAL_REGS
, refreshValuesOnly
);
731 } /* _tuiSetGeneralAndSpecialRegsContent */
734 ** _tuiSetFloatRegsContent().
735 ** Set the content of the data window to consist of the float registers.
738 _tuiSetFloatRegsContent (TuiRegisterDisplayType dpyType
, int refreshValuesOnly
)
740 TuiStatus ret
= TUI_FAILURE
;
743 startRegNum
= FP0_REGNUM
;
744 ret
= _tuiSetRegsContent (startRegNum
,
746 deprecated_selected_frame
,
751 } /* _tuiSetFloatRegsContent */
755 ** _tuiRegValueHasChanged().
756 ** Answer TRUE if the register's value has changed, FALSE otherwise.
757 ** If TRUE, newValue is filled in with the new value.
760 _tuiRegValueHasChanged (TuiDataElementPtr dataElement
,
761 struct frame_info
*frame
,
764 int hasChanged
= FALSE
;
766 if (dataElement
->itemNo
!= UNDEFINED_ITEM
&&
767 _tuiRegisterName (dataElement
->itemNo
) != (char *) NULL
)
769 char rawBuf
[MAX_REGISTER_RAW_SIZE
];
772 if (_tuiGetRegisterRawValue (
773 dataElement
->itemNo
, rawBuf
, frame
) == TUI_SUCCESS
)
775 int size
= REGISTER_RAW_SIZE (dataElement
->itemNo
);
777 for (i
= 0; (i
< size
&& !hasChanged
); i
++)
778 hasChanged
= (((char *) dataElement
->value
)[i
] != rawBuf
[i
]);
779 if (hasChanged
&& newValue
!= (char *) NULL
)
781 for (i
= 0; i
< size
; i
++)
782 newValue
[i
] = rawBuf
[i
];
787 } /* _tuiRegValueHasChanged */
792 ** _tuiGetRegisterRawValue().
793 ** Get the register raw value. The raw value is returned in regValue.
796 _tuiGetRegisterRawValue (int regNum
, char *regValue
, struct frame_info
*frame
)
798 TuiStatus ret
= TUI_FAILURE
;
800 if (target_has_registers
)
802 frame_read_register (frame
, regNum
, regValue
);
803 /* NOTE: cagney/2003-03-13: This is bogus. It is refering to
804 the register cache and not the frame which could have pulled
805 the register value off the stack. */
806 if (register_cached (regNum
) >= 0)
810 } /* _tuiGetRegisterRawValue */
815 ** _tuiSetRegisterElement().
816 ** Function to initialize a data element with the input and
817 ** the register value.
820 _tuiSetRegisterElement (int regNum
, struct frame_info
*frame
,
821 TuiDataElementPtr dataElement
,
822 int refreshValueOnly
)
824 if (dataElement
!= (TuiDataElementPtr
) NULL
)
826 if (!refreshValueOnly
)
828 dataElement
->itemNo
= regNum
;
829 dataElement
->name
= _tuiRegisterName (regNum
);
830 dataElement
->highlight
= FALSE
;
832 if (dataElement
->value
== (Opaque
) NULL
)
833 dataElement
->value
= (Opaque
) xmalloc (MAX_REGISTER_RAW_SIZE
);
834 if (dataElement
->value
!= (Opaque
) NULL
)
835 _tuiGetRegisterRawValue (regNum
, dataElement
->value
, frame
);
839 } /* _tuiSetRegisterElement */
843 ** _tuiSetRegsContent().
844 ** Set the content of the data window to consist of the registers
845 ** numbered from startRegNum to endRegNum. Note that if
846 ** refreshValuesOnly is TRUE, startRegNum and endRegNum are ignored.
849 _tuiSetRegsContent (int startRegNum
, int endRegNum
,
850 struct frame_info
*frame
,
851 TuiRegisterDisplayType dpyType
,
852 int refreshValuesOnly
)
854 TuiStatus ret
= TUI_FAILURE
;
855 int numRegs
= endRegNum
- startRegNum
+ 1;
856 int allocatedHere
= FALSE
;
858 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
> 0 &&
861 freeDataContent (dataWin
->detail
.dataDisplayInfo
.regsContent
,
862 dataWin
->detail
.dataDisplayInfo
.regsContentCount
);
863 dataWin
->detail
.dataDisplayInfo
.regsContentCount
= 0;
865 if (dataWin
->detail
.dataDisplayInfo
.regsContentCount
<= 0)
867 dataWin
->detail
.dataDisplayInfo
.regsContent
=
868 allocContent (numRegs
, DATA_WIN
);
869 allocatedHere
= TRUE
;
872 if (dataWin
->detail
.dataDisplayInfo
.regsContent
!= (TuiWinContent
) NULL
)
876 if (!refreshValuesOnly
|| allocatedHere
)
878 dataWin
->generic
.content
= (OpaquePtr
) NULL
;
879 dataWin
->generic
.contentSize
= 0;
880 addContentElements (&dataWin
->generic
, numRegs
);
881 dataWin
->detail
.dataDisplayInfo
.regsContent
=
882 (TuiWinContent
) dataWin
->generic
.content
;
883 dataWin
->detail
.dataDisplayInfo
.regsContentCount
= numRegs
;
886 ** Now set the register names and values
888 for (i
= startRegNum
; (i
<= endRegNum
); i
++)
890 TuiGenWinInfoPtr dataItemWin
;
892 dataItemWin
= &dataWin
->detail
.dataDisplayInfo
.
893 regsContent
[i
- startRegNum
]->whichElement
.dataWindow
;
894 _tuiSetRegisterElement (
897 &((TuiWinElementPtr
) dataItemWin
->content
[0])->whichElement
.data
,
898 !allocatedHere
&& refreshValuesOnly
);
900 dataWin
->detail
.dataDisplayInfo
.regsColumnCount
=
901 tuiCalculateRegsColumnCount (dpyType
);
903 if (dataWin
->detail
.dataDisplayInfo
.dataContentCount
> 0)
905 /* delete all the windows? */
906 /* realloc content equal to dataContentCount + regsContentCount */
907 /* append dataWin->detail.dataDisplayInfo.dataContent to content */
910 dataWin
->generic
.contentSize
=
911 dataWin
->detail
.dataDisplayInfo
.regsContentCount
+
912 dataWin
->detail
.dataDisplayInfo
.dataContentCount
;
917 } /* _tuiSetRegsContent */
921 ** _tuiDisplayRegister().
922 ** Function to display a register in a window. If hilite is TRUE,
923 ** than the value will be displayed in reverse video
926 _tuiDisplayRegister (int regNum
,
927 TuiGenWinInfoPtr winInfo
, /* the data item window */
928 enum precision_type precision
)
930 if (winInfo
->handle
!= (WINDOW
*) NULL
)
934 int valueCharsWide
, labelWidth
;
935 TuiDataElementPtr dataElementPtr
= &((TuiWinContent
)
936 winInfo
->content
)[0]->whichElement
.data
;
939 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
== TUI_DFLOAT_REGS
)
941 valueCharsWide
= DOUBLE_FLOAT_VALUE_WIDTH
;
942 labelWidth
= DOUBLE_FLOAT_LABEL_WIDTH
;
946 if (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
==
949 valueCharsWide
= SINGLE_FLOAT_VALUE_WIDTH
;
950 labelWidth
= SINGLE_FLOAT_LABEL_WIDTH
;
954 valueCharsWide
= SINGLE_VALUE_WIDTH
;
955 labelWidth
= SINGLE_LABEL_WIDTH
;
960 _tuiRegisterFormat (buf
,
961 valueCharsWide
+ labelWidth
,
966 if (dataElementPtr
->highlight
)
967 wstandout (winInfo
->handle
);
969 wmove (winInfo
->handle
, 0, 0);
970 for (i
= 1; i
< winInfo
->width
; i
++)
971 waddch (winInfo
->handle
, ' ');
972 wmove (winInfo
->handle
, 0, 0);
973 waddstr (winInfo
->handle
, buf
);
975 if (dataElementPtr
->highlight
)
976 wstandend (winInfo
->handle
);
977 tuiRefreshWin (winInfo
);
980 } /* _tuiDisplayRegister */
984 _tui_vShowRegisters_commandSupport (TuiRegisterDisplayType dpyType
)
987 if (m_winPtrNotNull (dataWin
) && dataWin
->generic
.isVisible
)
988 { /* Data window already displayed, show the registers */
989 if (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
!= dpyType
)
990 tuiShowRegisters (dpyType
);
993 (tuiLayoutDef ())->regsDisplayType
= dpyType
;
996 } /* _tui_vShowRegisters_commandSupport */
1000 _tuiShowFloat_command (char *arg
, int fromTTY
)
1002 if (m_winPtrIsNull (dataWin
) || !dataWin
->generic
.isVisible
||
1003 (dataWin
->detail
.dataDisplayInfo
.regsDisplayType
!= TUI_SFLOAT_REGS
&&
1004 dataWin
->detail
.dataDisplayInfo
.regsDisplayType
!= TUI_DFLOAT_REGS
))
1005 _tui_vShowRegisters_commandSupport ((tuiLayoutDef ())->floatRegsDisplayType
);
1008 } /* _tuiShowFloat_command */
1012 _tuiShowGeneral_command (char *arg
, int fromTTY
)
1014 _tui_vShowRegisters_commandSupport (TUI_GENERAL_REGS
);
1019 _tuiShowSpecial_command (char *arg
, int fromTTY
)
1021 _tui_vShowRegisters_commandSupport (TUI_SPECIAL_REGS
);
1026 _tuiToggleFloatRegs_command (char *arg
, int fromTTY
)
1028 if (m_winPtrNotNull (dataWin
) && dataWin
->generic
.isVisible
)
1029 tuiToggleFloatRegs ();
1032 TuiLayoutDefPtr layoutDef
= tuiLayoutDef ();
1034 if (layoutDef
->floatRegsDisplayType
== TUI_SFLOAT_REGS
)
1035 layoutDef
->floatRegsDisplayType
= TUI_DFLOAT_REGS
;
1037 layoutDef
->floatRegsDisplayType
= TUI_SFLOAT_REGS
;
1042 } /* _tuiToggleFloatRegs_command */
1046 _tuiScrollRegsForward_command (char *arg
, int fromTTY
)
1048 tui_scroll (FORWARD_SCROLL
, dataWin
, 1);
1053 _tuiScrollRegsBackward_command (char *arg
, int fromTTY
)
1055 tui_scroll (BACKWARD_SCROLL
, dataWin
, 1);