2004-02-07 Andrew Cagney <cagney@redhat.com>
[platform/upstream/binutils.git] / gdb / tui / tui-data.h
1 /* TUI data manipulation routines.
2
3    Copyright 1998, 1999, 2000, 2001, 2002, 2004 Free Software
4    Foundation, Inc.
5
6    Contributed by Hewlett-Packard Company.
7
8    This file is part of GDB.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330,
23    Boston, MA 02111-1307, USA.  */
24
25 #ifndef TUI_DATA_H
26 #define TUI_DATA_H
27
28 #if defined (HAVE_NCURSES_H)
29 #include <ncurses.h>
30 #elif defined (HAVE_CURSES_H)
31 #include <curses.h>
32 #endif
33
34 /* Generic window information */
35 struct tui_gen_win_info
36 {
37   WINDOW *handle;       /* window handle */
38   enum tui_win_type type;       /* type of window */
39   int width;            /* window width */
40   int height;           /* window height */
41   struct tui_point origin;      /* origin of window */
42   void **content;       /* content of window */
43   int contentSize;      /* Size of content (# of elements) */
44   int contentInUse;     /* Can it be used, or is it already used? */
45   int viewportHeight;   /* viewport height */
46   int lastVisibleLine;  /* index of last visible line */
47   int isVisible;                /* whether the window is visible or not */
48   char* title;          /* Window title to display.  */
49 };
50
51 /* Constant definitions */
52 #define DEFAULT_TAB_LEN                8
53 #define NO_SRC_STRING                  "[ No Source Available ]"
54 #define NO_DISASSEM_STRING             "[ No Assembly Available ]"
55 #define NO_REGS_STRING                 "[ Register Values Unavailable ]"
56 #define NO_DATA_STRING                 "[ No Data Values Displayed ]"
57 #define MAX_CONTENT_COUNT              100
58 #define SRC_NAME                       "SRC"
59 #define CMD_NAME                       "CMD"
60 #define DATA_NAME                      "REGS"
61 #define DISASSEM_NAME                  "ASM"
62 #define TUI_NULL_STR                   ""
63 #define DEFAULT_HISTORY_COUNT          25
64 #define BOX_WINDOW                     TRUE
65 #define DONT_BOX_WINDOW                FALSE
66 #define HILITE                         TRUE
67 #define NO_HILITE                      FALSE
68 #define WITH_LOCATOR                   TRUE
69 #define NO_LOCATOR                     FALSE
70 #define EMPTY_SOURCE_PROMPT            TRUE
71 #define NO_EMPTY_SOURCE_PROMPT         FALSE
72 #define UNDEFINED_ITEM                 -1
73 #define MIN_WIN_HEIGHT                 3
74 #define MIN_CMD_WIN_HEIGHT             3
75
76 /* Strings to display in the TUI status line.  */
77 #define PROC_PREFIX                    "In: "
78 #define LINE_PREFIX                    "Line: "
79 #define PC_PREFIX                      "PC: "
80 #define SINGLE_KEY                     "(SingleKey)"
81
82 /* Minimum/Maximum length of some fields displayed in the TUI status line.  */
83 #define MIN_LINE_WIDTH     4 /* Use at least 4 digits for line numbers.  */
84 #define MIN_PROC_WIDTH    12
85 #define MAX_TARGET_WIDTH  10
86 #define MAX_PID_WIDTH     14
87
88 #define TUI_FLOAT_REGS_NAME                  "$FREGS"
89 #define TUI_FLOAT_REGS_NAME_LOWER            "$fregs"
90 #define TUI_GENERAL_REGS_NAME                "$GREGS"
91 #define TUI_GENERAL_REGS_NAME_LOWER          "$gregs"
92 #define TUI_SPECIAL_REGS_NAME                "$SREGS"
93 #define TUI_SPECIAL_REGS_NAME_LOWER          "$sregs"
94 #define TUI_GENERAL_SPECIAL_REGS_NAME        "$REGS"
95 #define TUI_GENERAL_SPECIAL_REGS_NAME_LOWER  "$regs"
96
97 /* Scroll direction enum.  */
98 enum tui_scroll_direction
99 {
100   FORWARD_SCROLL,
101   BACKWARD_SCROLL,
102   LEFT_SCROLL,
103   RIGHT_SCROLL
104 };
105
106
107 /* General list struct.  */
108 struct tui_list
109 {
110   void **list;
111   int count;
112 };
113
114
115 /* The kinds of layouts available */
116 enum tui_layout_type
117 {
118   SRC_COMMAND,
119   DISASSEM_COMMAND,
120   SRC_DISASSEM_COMMAND,
121   SRC_DATA_COMMAND,
122   DISASSEM_DATA_COMMAND,
123   UNDEFINED_LAYOUT
124 };
125
126 /* Basic data types that can be displayed in the data window. */
127 enum tui_data_type
128 {
129   TUI_REGISTER,
130   TUI_SCALAR,
131   TUI_COMPLEX,
132   TUI_STRUCT
133 };
134
135 /* Types of register displays */
136 enum tui_register_display_type
137 {
138   TUI_UNDEFINED_REGS,
139   TUI_GENERAL_REGS,
140   TUI_SFLOAT_REGS,
141   TUI_DFLOAT_REGS,
142   TUI_SPECIAL_REGS,
143   TUI_GENERAL_AND_SPECIAL_REGS
144 };
145
146 /* Structure describing source line or line address */
147 union tui_line_or_address
148 {
149   int lineNo;
150   CORE_ADDR addr;
151 };
152
153 /* Current Layout definition */
154 struct tui_layout_def
155 {
156   enum tui_win_type displayMode;
157   int split;
158   enum tui_register_display_type regsDisplayType;
159   enum tui_register_display_type floatRegsDisplayType;
160 };
161
162 /* Elements in the Source/Disassembly Window */
163 struct tui_source_element
164 {
165   char *line;
166   union tui_line_or_address lineOrAddr;
167   int isExecPoint;
168   int hasBreak;
169 };
170
171
172 /* Elements in the data display window content */
173 struct tui_data_element
174 {
175   const char *name;
176   int itemNo;                   /* the register number, or data display number */
177   enum tui_data_type type;
178   void *value;
179   int highlight;
180 };
181
182
183 /* Elements in the command window content */
184 struct tui_command_element
185 {
186   char *line;
187 };
188
189
190 #define MAX_LOCATOR_ELEMENT_LEN        100
191
192 /* Elements in the locator window content */
193 struct tui_locator_element
194 {
195   char fileName[MAX_LOCATOR_ELEMENT_LEN];
196   char procName[MAX_LOCATOR_ELEMENT_LEN];
197   int lineNo;
198   CORE_ADDR addr;
199 };
200
201 /* Flags to tell what kind of breakpoint is at current line.  */
202 #define TUI_BP_ENABLED      0x01
203 #define TUI_BP_DISABLED     0x02
204 #define TUI_BP_HIT          0x04
205 #define TUI_BP_CONDITIONAL  0x08
206 #define TUI_BP_HARDWARE     0x10
207
208 /* Position of breakpoint markers in the exec info string.  */
209 #define TUI_BP_HIT_POS      0
210 #define TUI_BP_BREAK_POS    1
211 #define TUI_EXEC_POS        2
212 #define TUI_EXECINFO_SIZE   4
213
214 typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
215
216 /* An content element in a window */
217 union tui_which_element
218 {
219   struct tui_source_element source;     /* the source elements */
220   struct tui_gen_win_info dataWindow;   /* data display elements */
221   struct tui_data_element data; /* elements of dataWindow */
222   struct tui_command_element command;   /* command elements */
223   struct tui_locator_element locator;   /* locator elements */
224   tui_exec_info_content simpleString;   /* simple char based elements */
225 };
226
227 struct tui_win_element
228 {
229   int highlight;
230   union tui_which_element whichElement;
231 };
232
233
234 /* This describes the content of the window. */
235 typedef struct tui_win_element **tui_win_content;
236
237
238 /* This struct defines the specific information about a data display window */
239 struct tui_data_info
240 {
241   tui_win_content dataContent;  /* start of data display content */
242   int dataContentCount;
243   tui_win_content regsContent;  /* start of regs display content */
244   int regsContentCount;
245   enum tui_register_display_type regsDisplayType;
246   int regsColumnCount;
247   int displayRegs;              /* Should regs be displayed at all? */
248 };
249
250
251 struct tui_source_info
252 {
253   int hasLocator;               /* Does locator belongs to this window? */
254   /* Execution information window.  */
255   struct tui_gen_win_info *executionInfo;
256   int horizontalOffset; /* used for horizontal scroll */
257   union tui_line_or_address startLineOrAddr;
258   char* filename;
259 };
260
261
262 struct tui_command_info
263 {
264   int curLine;          /* The current line position */
265   int curch;                    /* The current cursor position */
266   int start_line;
267 };
268
269
270 /* This defines information about each logical window */
271 struct tui_win_info
272 {
273   struct tui_gen_win_info generic;      /* general window information */
274   union
275   {
276     struct tui_source_info sourceInfo;
277     struct tui_data_info dataDisplayInfo;
278     struct tui_command_info commandInfo;
279     void *opaque;
280   }
281   detail;
282   int canHighlight;             /* Can this window ever be highlighted? */
283   int isHighlighted;            /* Is this window highlighted? */
284 };
285
286 /* MACROS (prefixed with m_) */
287
288 /* Testing macros */
289 #define        m_genWinPtrIsNull(winInfo) \
290                 ((winInfo) == (struct tui_gen_win_info *)NULL)
291 #define        m_genWinPtrNotNull(winInfo) \
292                 ((winInfo) != (struct tui_gen_win_info *)NULL)
293 #define        m_winPtrIsNull(winInfo) \
294                 ((winInfo) == (struct tui_win_info *)NULL)
295 #define        m_winPtrNotNull(winInfo) \
296                 ((winInfo) != (struct tui_win_info *)NULL)
297
298 #define        m_winIsSourceType(type) \
299                 (type == SRC_WIN || type == DISASSEM_WIN)
300 #define        m_winIsAuxillary(winType) \
301                 (winType > MAX_MAJOR_WINDOWS)
302 #define        m_hasLocator(winInfo) \
303                 ( ((winInfo) != (struct tui_win_info *)NULL) ? \
304                     (winInfo->detail.sourceInfo.hasLocator) : \
305                     FALSE )
306
307 #define     m_setWinHighlightOn(winInfo) \
308                 if ((winInfo) != (struct tui_win_info *)NULL) \
309                               (winInfo)->isHighlighted = TRUE
310 #define     m_setWinHighlightOff(winInfo) \
311                 if ((winInfo) != (struct tui_win_info *)NULL) \
312                               (winInfo)->isHighlighted = FALSE
313
314
315 /* Global Data */
316 extern struct tui_win_info *(winList[MAX_MAJOR_WINDOWS]);
317
318 /* Macros */
319 #define srcWin            winList[SRC_WIN]
320 #define disassemWin       winList[DISASSEM_WIN]
321 #define dataWin           winList[DATA_WIN]
322 #define cmdWin            winList[CMD_WIN]
323
324 /* Data Manipulation Functions */
325 extern void tui_initialize_static_data (void);
326 extern struct tui_gen_win_info *tui_alloc_generic_win_info (void);
327 extern struct tui_win_info *tui_alloc_win_info (enum tui_win_type);
328 extern void tui_init_generic_part (struct tui_gen_win_info *);
329 extern void tui_init_win_info (struct tui_win_info *);
330 extern tui_win_content tui_alloc_content (int, enum tui_win_type);
331 extern int tui_add_content_elements (struct tui_gen_win_info *, int);
332 extern void tui_init_content_element (struct tui_win_element *, enum tui_win_type);
333 extern void tui_free_window (struct tui_win_info *);
334 extern void tui_free_win_content (struct tui_gen_win_info *);
335 extern void tui_free_data_content (tui_win_content, int);
336 extern void tui_free_all_source_wins_content (void);
337 extern void tui_del_window (struct tui_win_info *);
338 extern void tui_del_data_windows (tui_win_content, int);
339 extern struct tui_win_info *tui_partial_win_by_name (char *);
340 extern char *tui_win_name (struct tui_gen_win_info *);
341 extern enum tui_layout_type tui_current_layout (void);
342 extern void tui_set_current_layout_to (enum tui_layout_type);
343 extern int tui_term_height (void);
344 extern void tui_set_term_height_to (int);
345 extern int tui_term_width (void);
346 extern void tui_set_term_width_to (int);
347 extern void tui_set_gen_win_origin (struct tui_gen_win_info *, int, int);
348 extern struct tui_gen_win_info *tui_locator_win_info_ptr (void);
349 extern struct tui_gen_win_info *tui_source_exec_info_win_ptr (void);
350 extern struct tui_gen_win_info *tui_disassem_exec_info_win_ptr (void);
351 extern struct tui_list * tui_source_windows (void);
352 extern void tui_clear_source_windows (void);
353 extern void tui_clear_source_windows_detail (void);
354 extern void tui_clear_win_detail (struct tui_win_info * winInfo);
355 extern void tui_add_to_source_windows (struct tui_win_info *);
356 extern int tui_default_tab_len (void);
357 extern void tui_set_default_tab_len (int);
358 extern struct tui_win_info *tui_win_with_focus (void);
359 extern void tui_set_win_with_focus (struct tui_win_info *);
360 extern struct tui_layout_def * tui_layout_def (void);
361 extern int tui_win_resized (void);
362 extern void tui_set_win_resized_to (int);
363
364 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
365 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
366
367 extern void tui_add_to_source_windows (struct tui_win_info * winInfo);
368
369 #endif /* TUI_DATA_H */