]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-data.c
2010-05-17 Michael Snyder <msnyder@vmware.com>
[thirdparty/binutils-gdb.git] / gdb / tui / tui-data.c
CommitLineData
f377b406 1/* TUI data manipulation routines.
f33c6cbf 2
0fb0cc75 3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
4c38e0a4 4 2009, 2010 Free Software Foundation, Inc.
f33c6cbf 5
f377b406
SC
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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
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
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 22
96ec9981
DJ
23#include "defs.h"
24#include "symtab.h"
d7b2e967
AC
25#include "tui/tui.h"
26#include "tui/tui-data.h"
27#include "tui/tui-wingeneral.h"
f33c6cbf 28
6d012f14 29#include "gdb_string.h"
6a83354a 30#include "gdb_curses.h"
4e8f7a8b 31
c906108c
SS
32/****************************
33** GLOBAL DECLARATIONS
34****************************/
6d012f14 35struct tui_win_info *(tui_win_list[MAX_MAJOR_WINDOWS]);
c906108c 36
c906108c
SS
37/***************************
38** Private data
39****************************/
6ba8e26f
AC
40static enum tui_layout_type current_layout = UNDEFINED_LAYOUT;
41static int term_height, term_width;
2a8854a7 42static struct tui_gen_win_info _locator;
6ba8e26f 43static struct tui_gen_win_info exec_info[2];
5b6fe301 44static struct tui_win_info *src_win_list[2];
96c1eda2 45static struct tui_list source_windows = {src_win_list, 0};
6ba8e26f 46static int default_tab_len = DEFAULT_TAB_LEN;
5b6fe301 47static struct tui_win_info *win_with_focus = (struct tui_win_info *) NULL;
08ef48c5
MS
48static struct tui_layout_def layout_def = {
49 SRC_WIN, /* DISPLAY_MODE */
50 FALSE, /* SPLIT */
51 TUI_UNDEFINED_REGS, /* REGS_DISPLAY_TYPE */
52 TUI_SFLOAT_REGS}; /* FLOAT_REGS_DISPLAY_TYPE */
53
6ba8e26f 54static int win_resized = FALSE;
c906108c
SS
55
56
57/*********************************
58** Static function forward decls
59**********************************/
08ef48c5
MS
60static void free_content (tui_win_content,
61 int,
62 enum tui_win_type);
63static void free_content_elements (tui_win_content,
64 int,
65 enum tui_win_type);
c906108c
SS
66
67
68
69/*********************************
70** PUBLIC FUNCTIONS
71**********************************/
72
6d012f14
AC
73int
74tui_win_is_source_type (enum tui_win_type win_type)
75{
76 return (win_type == SRC_WIN || win_type == DISASSEM_WIN);
77}
78
79int
80tui_win_is_auxillary (enum tui_win_type win_type)
81{
82 return (win_type > MAX_MAJOR_WINDOWS);
83}
84
85int
86tui_win_has_locator (struct tui_win_info *win_info)
87{
08ef48c5 88 return (win_info != NULL
6d012f14
AC
89 && win_info->detail.source_info.has_locator);
90}
91
92void
08ef48c5
MS
93tui_set_win_highlight (struct tui_win_info *win_info,
94 int highlight)
6d012f14
AC
95{
96 if (win_info != NULL)
97 win_info->is_highlighted = highlight;
98}
99
c906108c
SS
100/******************************************
101** ACCESSORS & MUTATORS FOR PRIVATE DATA
102******************************************/
103
1cc6d956 104/* Answer a whether the terminal window has been resized or not. */
c906108c 105int
dd1abb8c 106tui_win_resized (void)
c906108c 107{
6ba8e26f 108 return win_resized;
dd1abb8c 109}
c906108c
SS
110
111
1cc6d956 112/* Set a whether the terminal window has been resized or not. */
c906108c 113void
dd1abb8c 114tui_set_win_resized_to (int resized)
c906108c 115{
6ba8e26f 116 win_resized = resized;
dd1abb8c 117}
c906108c
SS
118
119
1cc6d956 120/* Answer a pointer to the current layout definition. */
2a8854a7 121struct tui_layout_def *
dd1abb8c 122tui_layout_def (void)
c906108c 123{
6ba8e26f 124 return &layout_def;
dd1abb8c 125}
c906108c
SS
126
127
1cc6d956 128/* Answer the window with the logical focus. */
2a8854a7 129struct tui_win_info *
dd1abb8c 130tui_win_with_focus (void)
c906108c 131{
6ba8e26f 132 return win_with_focus;
dd1abb8c 133}
c906108c
SS
134
135
1cc6d956 136/* Set the window that has the logical focus. */
c906108c 137void
5b6fe301 138tui_set_win_with_focus (struct tui_win_info *win_info)
c906108c 139{
6ba8e26f 140 win_with_focus = win_info;
dd1abb8c 141}
c906108c
SS
142
143
1cc6d956 144/* Answer the length in chars, of tabs. */
c906108c 145int
dd1abb8c 146tui_default_tab_len (void)
c906108c 147{
6ba8e26f 148 return default_tab_len;
dd1abb8c 149}
c906108c
SS
150
151
1cc6d956 152/* Set the length in chars, of tabs. */
c906108c 153void
dd1abb8c 154tui_set_default_tab_len (int len)
c906108c 155{
6ba8e26f 156 default_tab_len = len;
dd1abb8c 157}
c906108c
SS
158
159
6ba8e26f
AC
160/* Accessor for the current source window. Usually there is only one
161 source window (either source or disassembly), but both can be
162 displayed at the same time. */
2a8854a7 163struct tui_list *
dd1abb8c 164tui_source_windows (void)
c906108c 165{
6ba8e26f 166 return &source_windows;
dd1abb8c 167}
c906108c
SS
168
169
dd1abb8c
AC
170/* Clear the list of source windows. Usually there is only one source
171 window (either source or disassembly), but both can be displayed at
172 the same time. */
c906108c 173void
dd1abb8c 174tui_clear_source_windows (void)
c906108c 175{
6ba8e26f
AC
176 source_windows.list[0] = NULL;
177 source_windows.list[1] = NULL;
178 source_windows.count = 0;
dd1abb8c 179}
c906108c
SS
180
181
1cc6d956 182/* Clear the pertinant detail in the source windows. */
c906108c 183void
dd1abb8c 184tui_clear_source_windows_detail (void)
c906108c
SS
185{
186 int i;
187
dd1abb8c 188 for (i = 0; i < (tui_source_windows ())->count; i++)
96c1eda2 189 tui_clear_win_detail ((tui_source_windows ())->list[i]);
dd1abb8c 190}
c906108c
SS
191
192
dd1abb8c
AC
193/* Add a window to the list of source windows. Usually there is only
194 one source window (either source or disassembly), but both can be
195 displayed at the same time. */
c906108c 196void
5b6fe301 197tui_add_to_source_windows (struct tui_win_info *win_info)
c906108c 198{
6ba8e26f
AC
199 if (source_windows.count < 2)
200 source_windows.list[source_windows.count++] = (void *) win_info;
dd1abb8c 201}
c906108c
SS
202
203
1cc6d956 204/* Clear the pertinant detail in the windows. */
c906108c 205void
5b6fe301 206tui_clear_win_detail (struct tui_win_info *win_info)
c906108c 207{
6d012f14 208 if (win_info != NULL)
c906108c 209 {
6d012f14 210 switch (win_info->generic.type)
c906108c
SS
211 {
212 case SRC_WIN:
213 case DISASSEM_WIN:
13274fc3 214 win_info->detail.source_info.gdbarch = NULL;
362c05fe
AS
215 win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
216 win_info->detail.source_info.start_line_or_addr.u.addr = 0;
6d012f14 217 win_info->detail.source_info.horizontal_offset = 0;
c906108c
SS
218 break;
219 case CMD_WIN:
6d012f14
AC
220 win_info->detail.command_info.cur_line =
221 win_info->detail.command_info.curch = 0;
c906108c
SS
222 break;
223 case DATA_WIN:
6d012f14 224 win_info->detail.data_display_info.data_content =
2a8854a7 225 (tui_win_content) NULL;
6d012f14
AC
226 win_info->detail.data_display_info.data_content_count = 0;
227 win_info->detail.data_display_info.regs_content =
2a8854a7 228 (tui_win_content) NULL;
6d012f14
AC
229 win_info->detail.data_display_info.regs_content_count = 0;
230 win_info->detail.data_display_info.regs_display_type =
c906108c 231 TUI_UNDEFINED_REGS;
6d012f14
AC
232 win_info->detail.data_display_info.regs_column_count = 1;
233 win_info->detail.data_display_info.display_regs = FALSE;
c906108c
SS
234 break;
235 default:
236 break;
237 }
238 }
6ba8e26f 239}
c906108c
SS
240
241
6ba8e26f 242/* Accessor for the source execution info ptr. */
2a8854a7 243struct tui_gen_win_info *
dd1abb8c 244tui_source_exec_info_win_ptr (void)
c906108c 245{
6ba8e26f
AC
246 return &exec_info[0];
247}
c906108c
SS
248
249
6ba8e26f 250/* Accessor for the disassem execution info ptr. */
2a8854a7 251struct tui_gen_win_info *
dd1abb8c 252tui_disassem_exec_info_win_ptr (void)
c906108c 253{
6ba8e26f
AC
254 return &exec_info[1];
255}
c906108c
SS
256
257
dd1abb8c
AC
258/* Accessor for the locator win info. Answers a pointer to the static
259 locator win info struct. */
2a8854a7 260struct tui_gen_win_info *
dd1abb8c 261tui_locator_win_info_ptr (void)
c906108c
SS
262{
263 return &_locator;
2a8854a7 264}
c906108c
SS
265
266
6ba8e26f 267/* Accessor for the term_height. */
c906108c 268int
dd1abb8c 269tui_term_height (void)
c906108c 270{
6ba8e26f 271 return term_height;
dd1abb8c 272}
c906108c
SS
273
274
1cc6d956 275/* Mutator for the term height. */
c906108c 276void
dd1abb8c 277tui_set_term_height_to (int h)
c906108c 278{
6ba8e26f 279 term_height = h;
dd1abb8c 280}
c906108c
SS
281
282
1cc6d956 283/* Accessor for the term_width. */
c906108c 284int
dd1abb8c 285tui_term_width (void)
c906108c 286{
6ba8e26f 287 return term_width;
dd1abb8c 288}
c906108c
SS
289
290
6ba8e26f 291/* Mutator for the term_width. */
c906108c 292void
dd1abb8c 293tui_set_term_width_to (int w)
c906108c 294{
6ba8e26f 295 term_width = w;
dd1abb8c 296}
c906108c
SS
297
298
1cc6d956 299/* Accessor for the current layout. */
2a8854a7 300enum tui_layout_type
dd1abb8c 301tui_current_layout (void)
c906108c 302{
6ba8e26f 303 return current_layout;
dd1abb8c 304}
c906108c
SS
305
306
dd1abb8c 307/* Mutator for the current layout. */
c906108c 308void
6ba8e26f 309tui_set_current_layout_to (enum tui_layout_type new_layout)
c906108c 310{
6ba8e26f 311 current_layout = new_layout;
dd1abb8c 312}
c906108c
SS
313
314
6ba8e26f 315/* Set the origin of the window. */
c906108c 316void
08ef48c5
MS
317set_gen_win_origin (struct tui_gen_win_info *win_info,
318 int x, int y)
c906108c 319{
6d012f14
AC
320 win_info->origin.x = x;
321 win_info->origin.y = y;
6ba8e26f 322}
c906108c
SS
323
324
325/*****************************
326** OTHER PUBLIC FUNCTIONS
327*****************************/
328
329
dd1abb8c
AC
330/* Answer the next window in the list, cycling back to the top if
331 necessary. */
2a8854a7 332struct tui_win_info *
5b6fe301 333tui_next_win (struct tui_win_info *cur_win)
c906108c 334{
6ba8e26f 335 enum tui_win_type type = cur_win->generic.type;
5b6fe301 336 struct tui_win_info *next_win = (struct tui_win_info *) NULL;
c906108c 337
6ba8e26f 338 if (cur_win->generic.type == CMD_WIN)
c906108c
SS
339 type = SRC_WIN;
340 else
6ba8e26f
AC
341 type = cur_win->generic.type + 1;
342 while (type != cur_win->generic.type && (next_win == NULL))
c906108c 343 {
e5908723
MS
344 if (tui_win_list[type]
345 && tui_win_list[type]->generic.is_visible)
6ba8e26f 346 next_win = tui_win_list[type];
c906108c
SS
347 else
348 {
349 if (type == CMD_WIN)
350 type = SRC_WIN;
351 else
352 type++;
353 }
354 }
355
6ba8e26f
AC
356 return next_win;
357}
c906108c
SS
358
359
dd1abb8c
AC
360/* Answer the prev window in the list, cycling back to the bottom if
361 necessary. */
2a8854a7 362struct tui_win_info *
5b6fe301 363tui_prev_win (struct tui_win_info *cur_win)
c906108c 364{
6ba8e26f 365 enum tui_win_type type = cur_win->generic.type;
5b6fe301 366 struct tui_win_info *prev = (struct tui_win_info *) NULL;
c906108c 367
6ba8e26f 368 if (cur_win->generic.type == SRC_WIN)
c906108c
SS
369 type = CMD_WIN;
370 else
6ba8e26f
AC
371 type = cur_win->generic.type - 1;
372 while (type != cur_win->generic.type && (prev == NULL))
c906108c 373 {
37715c4c
TJB
374 if (tui_win_list[type]
375 && tui_win_list[type]->generic.is_visible)
6d012f14 376 prev = tui_win_list[type];
c906108c
SS
377 else
378 {
379 if (type == SRC_WIN)
380 type = CMD_WIN;
381 else
382 type--;
383 }
384 }
385
386 return prev;
cb50eddd 387}
c906108c
SS
388
389
1cc6d956 390/* Answer the window represented by name. */
2a8854a7 391struct tui_win_info *
dd1abb8c 392tui_partial_win_by_name (char *name)
c906108c 393{
5b6fe301 394 struct tui_win_info *win_info = (struct tui_win_info *) NULL;
c906108c
SS
395
396 if (name != (char *) NULL)
397 {
398 int i = 0;
399
6d012f14 400 while (i < MAX_MAJOR_WINDOWS && win_info == NULL)
c906108c 401 {
6d012f14 402 if (tui_win_list[i] != 0)
a4b99e53 403 {
6ba8e26f 404 char *cur_name = tui_win_name (&tui_win_list[i]->generic);
e5908723
MS
405 if (strlen (name) <= strlen (cur_name)
406 && strncmp (name, cur_name, strlen (name)) == 0)
6d012f14 407 win_info = tui_win_list[i];
a4b99e53 408 }
c906108c
SS
409 i++;
410 }
411 }
412
6d012f14 413 return win_info;
6ba8e26f 414}
c906108c
SS
415
416
6ba8e26f 417/* Answer the name of the window. */
c906108c 418char *
5b6fe301 419tui_win_name (struct tui_gen_win_info *win_info)
c906108c
SS
420{
421 char *name = (char *) NULL;
422
6d012f14 423 switch (win_info->type)
c906108c
SS
424 {
425 case SRC_WIN:
426 name = SRC_NAME;
427 break;
428 case CMD_WIN:
429 name = CMD_NAME;
430 break;
431 case DISASSEM_WIN:
432 name = DISASSEM_NAME;
433 break;
434 case DATA_WIN:
435 name = DATA_NAME;
436 break;
437 default:
438 name = "";
439 break;
440 }
441
442 return name;
6ba8e26f 443}
c906108c
SS
444
445
c906108c 446void
dd1abb8c 447tui_initialize_static_data (void)
c906108c 448{
dd1abb8c
AC
449 tui_init_generic_part (tui_source_exec_info_win_ptr ());
450 tui_init_generic_part (tui_disassem_exec_info_win_ptr ());
451 tui_init_generic_part (tui_locator_win_info_ptr ());
452}
c906108c
SS
453
454
2a8854a7 455struct tui_gen_win_info *
dd1abb8c 456tui_alloc_generic_win_info (void)
c906108c 457{
5b6fe301 458 struct tui_gen_win_info *win;
c906108c 459
c0645fb5 460 if ((win = XMALLOC (struct tui_gen_win_info)) != NULL)
dd1abb8c 461 tui_init_generic_part (win);
c906108c
SS
462
463 return win;
6ba8e26f 464}
c906108c
SS
465
466
c906108c 467void
5b6fe301 468tui_init_generic_part (struct tui_gen_win_info *win)
c906108c
SS
469{
470 win->width =
471 win->height =
472 win->origin.x =
473 win->origin.y =
6d012f14
AC
474 win->viewport_height =
475 win->content_size =
476 win->last_visible_line = 0;
c906108c 477 win->handle = (WINDOW *) NULL;
22940a24 478 win->content = NULL;
6d012f14
AC
479 win->content_in_use =
480 win->is_visible = FALSE;
bc6b7f04
SC
481 win->title = 0;
482}
c906108c
SS
483
484
ef5eab5a 485/* init_content_element().
c5aa993b 486 */
2c0b251b 487static void
08ef48c5
MS
488init_content_element (struct tui_win_element *element,
489 enum tui_win_type type)
c906108c
SS
490{
491 element->highlight = FALSE;
492 switch (type)
493 {
494 case SRC_WIN:
495 case DISASSEM_WIN:
6d012f14 496 element->which_element.source.line = (char *) NULL;
362c05fe
AS
497 element->which_element.source.line_or_addr.loa = LOA_LINE;
498 element->which_element.source.line_or_addr.u.line_no = 0;
6d012f14
AC
499 element->which_element.source.is_exec_point = FALSE;
500 element->which_element.source.has_break = FALSE;
c906108c
SS
501 break;
502 case DATA_WIN:
6d012f14
AC
503 tui_init_generic_part (&element->which_element.data_window);
504 element->which_element.data_window.type = DATA_ITEM_WIN;
505 ((struct tui_gen_win_info *) & element->which_element.data_window)->content =
22940a24 506 (void **) tui_alloc_content (1, DATA_ITEM_WIN);
2a8854a7 507 ((struct tui_gen_win_info *)
6d012f14 508 & element->which_element.data_window)->content_size = 1;
c906108c
SS
509 break;
510 case CMD_WIN:
6d012f14 511 element->which_element.command.line = (char *) NULL;
c906108c
SS
512 break;
513 case DATA_ITEM_WIN:
6d012f14
AC
514 element->which_element.data.name = (char *) NULL;
515 element->which_element.data.type = TUI_REGISTER;
516 element->which_element.data.item_no = UNDEFINED_ITEM;
517 element->which_element.data.value = NULL;
518 element->which_element.data.highlight = FALSE;
10f59415 519 element->which_element.data.content = (char*) NULL;
c906108c
SS
520 break;
521 case LOCATOR_WIN:
6d012f14
AC
522 element->which_element.locator.file_name[0] =
523 element->which_element.locator.proc_name[0] = (char) 0;
524 element->which_element.locator.line_no = 0;
525 element->which_element.locator.addr = 0;
c906108c
SS
526 break;
527 case EXEC_INFO_WIN:
6d012f14
AC
528 memset(element->which_element.simple_string, ' ',
529 sizeof(element->which_element.simple_string));
c906108c
SS
530 break;
531 default:
532 break;
533 }
6ba8e26f 534}
c906108c 535
2c0b251b 536static void
5b6fe301 537init_win_info (struct tui_win_info *win_info)
c906108c 538{
6d012f14
AC
539 tui_init_generic_part (&win_info->generic);
540 win_info->can_highlight =
541 win_info->is_highlighted = FALSE;
542 switch (win_info->generic.type)
c906108c
SS
543 {
544 case SRC_WIN:
545 case DISASSEM_WIN:
6d012f14
AC
546 win_info->detail.source_info.execution_info = (struct tui_gen_win_info *) NULL;
547 win_info->detail.source_info.has_locator = FALSE;
548 win_info->detail.source_info.horizontal_offset = 0;
13274fc3 549 win_info->detail.source_info.gdbarch = NULL;
362c05fe
AS
550 win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
551 win_info->detail.source_info.start_line_or_addr.u.addr = 0;
6d012f14 552 win_info->detail.source_info.filename = 0;
c906108c
SS
553 break;
554 case DATA_WIN:
6d012f14
AC
555 win_info->detail.data_display_info.data_content = (tui_win_content) NULL;
556 win_info->detail.data_display_info.data_content_count = 0;
557 win_info->detail.data_display_info.regs_content = (tui_win_content) NULL;
558 win_info->detail.data_display_info.regs_content_count = 0;
559 win_info->detail.data_display_info.regs_display_type =
c906108c 560 TUI_UNDEFINED_REGS;
6d012f14
AC
561 win_info->detail.data_display_info.regs_column_count = 1;
562 win_info->detail.data_display_info.display_regs = FALSE;
10f59415 563 win_info->detail.data_display_info.current_group = 0;
c906108c
SS
564 break;
565 case CMD_WIN:
6d012f14
AC
566 win_info->detail.command_info.cur_line = 0;
567 win_info->detail.command_info.curch = 0;
c906108c
SS
568 break;
569 default:
6d012f14 570 win_info->detail.opaque = NULL;
c906108c
SS
571 break;
572 }
6ba8e26f 573}
c906108c
SS
574
575
2a8854a7 576struct tui_win_info *
22940a24 577tui_alloc_win_info (enum tui_win_type type)
c906108c 578{
5b6fe301 579 struct tui_win_info *win_info;
c906108c 580
c0645fb5
MS
581 win_info = XMALLOC (struct tui_win_info);
582 if (win_info != NULL)
c906108c 583 {
6d012f14 584 win_info->generic.type = type;
6ba8e26f 585 init_win_info (win_info);
c906108c
SS
586 }
587
6d012f14 588 return win_info;
6ba8e26f 589}
c906108c
SS
590
591
6ba8e26f 592/* Allocates the content and elements in a block. */
2a8854a7 593tui_win_content
6ba8e26f 594tui_alloc_content (int num_elements, enum tui_win_type type)
c906108c 595{
c0645fb5
MS
596 tui_win_content content;
597 char *element_block_ptr;
c906108c
SS
598 int i;
599
5b6fe301 600 content = xmalloc (sizeof (struct tui_win_element *) *num_elements);
c0645fb5
MS
601 if (content != NULL)
602 {
603 /*
604 * All windows, except the data window, can allocate the
605 * elements in a chunk. The data window cannot because items
606 * can be added/removed from the data display by the user at any
607 * time.
608 */
c906108c
SS
609 if (type != DATA_WIN)
610 {
c0645fb5
MS
611 element_block_ptr =
612 xmalloc (sizeof (struct tui_win_element) * num_elements);
613 if (element_block_ptr != NULL)
c906108c 614 {
6ba8e26f 615 for (i = 0; i < num_elements; i++)
c906108c 616 {
6ba8e26f
AC
617 content[i] = (struct tui_win_element *) element_block_ptr;
618 init_content_element (content[i], type);
619 element_block_ptr += sizeof (struct tui_win_element);
c906108c
SS
620 }
621 }
622 else
623 {
22940a24 624 xfree (content);
2a8854a7 625 content = (tui_win_content) NULL;
c906108c
SS
626 }
627 }
628 }
629
630 return content;
6ba8e26f 631}
c906108c
SS
632
633
dd1abb8c 634/* Adds the input number of elements to the windows's content. If no
6ba8e26f 635 content has been allocated yet, alloc_content() is called to do
dd1abb8c
AC
636 this. The index of the first element added is returned, unless
637 there is a memory allocation error, in which case, (-1) is
638 returned. */
c906108c 639int
08ef48c5
MS
640tui_add_content_elements (struct tui_gen_win_info *win_info,
641 int num_elements)
c906108c 642{
5b6fe301 643 struct tui_win_element *element_ptr;
6ba8e26f 644 int i, index_start;
c906108c 645
6d012f14 646 if (win_info->content == NULL)
c906108c 647 {
6ba8e26f
AC
648 win_info->content = (void **) tui_alloc_content (num_elements, win_info->type);
649 index_start = 0;
c906108c
SS
650 }
651 else
6ba8e26f 652 index_start = win_info->content_size;
6d012f14 653 if (win_info->content != NULL)
c906108c 654 {
6ba8e26f 655 for (i = index_start; (i < num_elements + index_start); i++)
c906108c 656 {
c0645fb5 657 if ((element_ptr = XMALLOC (struct tui_win_element)) != NULL)
c906108c 658 {
6ba8e26f
AC
659 win_info->content[i] = (void *) element_ptr;
660 init_content_element (element_ptr, win_info->type);
6d012f14 661 win_info->content_size++;
c906108c 662 }
1cc6d956
MS
663 else /* Things must be really hosed now! We ran out of
664 memory!? */
c906108c
SS
665 return (-1);
666 }
667 }
668
6ba8e26f
AC
669 return index_start;
670}
c906108c
SS
671
672
1cc6d956
MS
673/* Delete all curses windows associated with win_info, leaving
674 everything else intact. */
c906108c 675void
5b6fe301 676tui_del_window (struct tui_win_info *win_info)
c906108c 677{
5b6fe301 678 struct tui_gen_win_info *generic_win;
c906108c 679
6d012f14 680 switch (win_info->generic.type)
c906108c
SS
681 {
682 case SRC_WIN:
683 case DISASSEM_WIN:
6ba8e26f
AC
684 generic_win = tui_locator_win_info_ptr ();
685 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 686 {
6ba8e26f
AC
687 tui_delete_win (generic_win->handle);
688 generic_win->handle = (WINDOW *) NULL;
689 generic_win->is_visible = FALSE;
c906108c 690 }
6d012f14 691 if (win_info->detail.source_info.filename)
bc6b7f04 692 {
6d012f14
AC
693 xfree (win_info->detail.source_info.filename);
694 win_info->detail.source_info.filename = 0;
bc6b7f04 695 }
6ba8e26f
AC
696 generic_win = win_info->detail.source_info.execution_info;
697 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 698 {
6ba8e26f
AC
699 tui_delete_win (generic_win->handle);
700 generic_win->handle = (WINDOW *) NULL;
701 generic_win->is_visible = FALSE;
c906108c
SS
702 }
703 break;
704 case DATA_WIN:
6d012f14 705 if (win_info->generic.content != NULL)
c906108c 706 {
6d012f14
AC
707 tui_del_data_windows (win_info->detail.data_display_info.regs_content,
708 win_info->detail.data_display_info.regs_content_count);
709 tui_del_data_windows (win_info->detail.data_display_info.data_content,
710 win_info->detail.data_display_info.data_content_count);
c906108c
SS
711 }
712 break;
713 default:
714 break;
715 }
6d012f14 716 if (win_info->generic.handle != (WINDOW *) NULL)
c906108c 717 {
6d012f14
AC
718 tui_delete_win (win_info->generic.handle);
719 win_info->generic.handle = (WINDOW *) NULL;
720 win_info->generic.is_visible = FALSE;
c906108c 721 }
bc6b7f04 722}
c906108c
SS
723
724
c906108c 725void
5b6fe301 726tui_free_window (struct tui_win_info *win_info)
c906108c 727{
5b6fe301 728 struct tui_gen_win_info *generic_win;
c906108c 729
6d012f14 730 switch (win_info->generic.type)
c906108c
SS
731 {
732 case SRC_WIN:
733 case DISASSEM_WIN:
6ba8e26f
AC
734 generic_win = tui_locator_win_info_ptr ();
735 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 736 {
6ba8e26f
AC
737 tui_delete_win (generic_win->handle);
738 generic_win->handle = (WINDOW *) NULL;
c906108c 739 }
6ba8e26f 740 tui_free_win_content (generic_win);
6d012f14 741 if (win_info->detail.source_info.filename)
bc6b7f04 742 {
6d012f14
AC
743 xfree (win_info->detail.source_info.filename);
744 win_info->detail.source_info.filename = 0;
bc6b7f04 745 }
6ba8e26f
AC
746 generic_win = win_info->detail.source_info.execution_info;
747 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 748 {
6ba8e26f
AC
749 tui_delete_win (generic_win->handle);
750 generic_win->handle = (WINDOW *) NULL;
751 tui_free_win_content (generic_win);
c906108c
SS
752 }
753 break;
754 case DATA_WIN:
6d012f14 755 if (win_info->generic.content != NULL)
c906108c 756 {
6d012f14
AC
757 tui_free_data_content (win_info->detail.data_display_info.regs_content,
758 win_info->detail.data_display_info.regs_content_count);
759 win_info->detail.data_display_info.regs_content =
2a8854a7 760 (tui_win_content) NULL;
6d012f14
AC
761 win_info->detail.data_display_info.regs_content_count = 0;
762 tui_free_data_content (win_info->detail.data_display_info.data_content,
763 win_info->detail.data_display_info.data_content_count);
764 win_info->detail.data_display_info.data_content =
2a8854a7 765 (tui_win_content) NULL;
6d012f14
AC
766 win_info->detail.data_display_info.data_content_count = 0;
767 win_info->detail.data_display_info.regs_display_type =
c906108c 768 TUI_UNDEFINED_REGS;
6d012f14
AC
769 win_info->detail.data_display_info.regs_column_count = 1;
770 win_info->detail.data_display_info.display_regs = FALSE;
771 win_info->generic.content = NULL;
772 win_info->generic.content_size = 0;
c906108c
SS
773 }
774 break;
775 default:
776 break;
777 }
6d012f14 778 if (win_info->generic.handle != (WINDOW *) NULL)
c906108c 779 {
6d012f14
AC
780 tui_delete_win (win_info->generic.handle);
781 win_info->generic.handle = (WINDOW *) NULL;
782 tui_free_win_content (&win_info->generic);
c906108c 783 }
6d012f14
AC
784 if (win_info->generic.title)
785 xfree (win_info->generic.title);
786 xfree (win_info);
bc6b7f04 787}
c906108c
SS
788
789
c906108c 790void
dd1abb8c 791tui_free_all_source_wins_content (void)
c906108c
SS
792{
793 int i;
794
dd1abb8c 795 for (i = 0; i < (tui_source_windows ())->count; i++)
c906108c 796 {
5b6fe301 797 struct tui_win_info *win_info = (tui_source_windows ())->list[i];
c906108c 798
6d012f14 799 if (win_info != NULL)
c906108c 800 {
6d012f14
AC
801 tui_free_win_content (&(win_info->generic));
802 tui_free_win_content (win_info->detail.source_info.execution_info);
c906108c
SS
803 }
804 }
dd1abb8c 805}
c906108c
SS
806
807
c906108c 808void
5b6fe301 809tui_free_win_content (struct tui_gen_win_info *win_info)
c906108c 810{
6d012f14 811 if (win_info->content != NULL)
c906108c 812 {
6ba8e26f 813 free_content ((tui_win_content) win_info->content,
6d012f14
AC
814 win_info->content_size,
815 win_info->type);
816 win_info->content = NULL;
c906108c 817 }
6d012f14 818 win_info->content_size = 0;
6ba8e26f 819}
c906108c
SS
820
821
c906108c 822void
08ef48c5
MS
823tui_del_data_windows (tui_win_content content,
824 int content_size)
c906108c
SS
825{
826 int i;
827
ef5eab5a
MS
828 /* Remember that data window content elements are of type struct
829 tui_gen_win_info *, each of which whose single element is a data
830 element. */
6ba8e26f 831 for (i = 0; i < content_size; i++)
c906108c 832 {
5b6fe301 833 struct tui_gen_win_info *generic_win = &content[i]->which_element.data_window;
c906108c 834
6ba8e26f 835 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 836 {
6ba8e26f
AC
837 tui_delete_win (generic_win->handle);
838 generic_win->handle = (WINDOW *) NULL;
839 generic_win->is_visible = FALSE;
c906108c
SS
840 }
841 }
dd1abb8c 842}
c906108c
SS
843
844
845void
08ef48c5
MS
846tui_free_data_content (tui_win_content content,
847 int content_size)
c906108c
SS
848{
849 int i;
850
ef5eab5a
MS
851 /* Remember that data window content elements are of type struct
852 tui_gen_win_info *, each of which whose single element is a data
853 element. */
6ba8e26f 854 for (i = 0; i < content_size; i++)
c906108c 855 {
5b6fe301 856 struct tui_gen_win_info *generic_win = &content[i]->which_element.data_window;
c906108c 857
6ba8e26f 858 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 859 {
6ba8e26f
AC
860 tui_delete_win (generic_win->handle);
861 generic_win->handle = (WINDOW *) NULL;
862 tui_free_win_content (generic_win);
c906108c
SS
863 }
864 }
6ba8e26f 865 free_content (content,
08ef48c5
MS
866 content_size,
867 DATA_WIN);
6ba8e26f 868}
c906108c
SS
869
870
871/**********************************
872** LOCAL STATIC FUNCTIONS **
873**********************************/
874
875
c906108c 876static void
08ef48c5
MS
877free_content (tui_win_content content,
878 int content_size,
879 enum tui_win_type win_type)
c906108c 880{
2a8854a7 881 if (content != (tui_win_content) NULL)
c906108c 882 {
6ba8e26f 883 free_content_elements (content, content_size, win_type);
22940a24 884 xfree (content);
c906108c 885 }
6ba8e26f 886}
c906108c
SS
887
888
ef5eab5a 889/* free_content_elements().
c5aa993b 890 */
c906108c 891static void
08ef48c5
MS
892free_content_elements (tui_win_content content,
893 int content_size,
894 enum tui_win_type type)
c906108c 895{
2a8854a7 896 if (content != (tui_win_content) NULL)
c906108c
SS
897 {
898 int i;
899
900 if (type == SRC_WIN || type == DISASSEM_WIN)
901 {
1cc6d956 902 /* Free whole source block. */
6d012f14 903 xfree (content[0]->which_element.source.line);
c906108c
SS
904 }
905 else
906 {
6ba8e26f 907 for (i = 0; i < content_size; i++)
c906108c 908 {
5b6fe301 909 struct tui_win_element *element;
c906108c
SS
910
911 element = content[i];
2a8854a7 912 if (element != (struct tui_win_element *) NULL)
c906108c
SS
913 {
914 switch (type)
915 {
916 case DATA_WIN:
22940a24 917 xfree (element);
c906108c
SS
918 break;
919 case DATA_ITEM_WIN:
ef5eab5a
MS
920 /* Note that data elements are not allocated in
921 a single block, but individually, as
922 needed. */
6d012f14
AC
923 if (element->which_element.data.type != TUI_REGISTER)
924 xfree ((void *)element->which_element.data.name);
925 xfree (element->which_element.data.value);
10f59415 926 xfree (element->which_element.data.content);
22940a24 927 xfree (element);
c906108c
SS
928 break;
929 case CMD_WIN:
6d012f14 930 xfree (element->which_element.command.line);
c906108c
SS
931 break;
932 default:
933 break;
934 }
935 }
936 }
937 }
938 if (type != DATA_WIN && type != DATA_ITEM_WIN)
1cc6d956 939 xfree (content[0]); /* Free the element block. */
c906108c 940 }
6ba8e26f 941}