]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-data.c
run copyright.sh for 2011.
[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,
7b6bb8da 4 2009, 2010, 2011 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);
1c5313c5 405
e5908723
MS
406 if (strlen (name) <= strlen (cur_name)
407 && strncmp (name, cur_name, strlen (name)) == 0)
6d012f14 408 win_info = tui_win_list[i];
a4b99e53 409 }
c906108c
SS
410 i++;
411 }
412 }
413
6d012f14 414 return win_info;
6ba8e26f 415}
c906108c
SS
416
417
6ba8e26f 418/* Answer the name of the window. */
c906108c 419char *
5b6fe301 420tui_win_name (struct tui_gen_win_info *win_info)
c906108c
SS
421{
422 char *name = (char *) NULL;
423
6d012f14 424 switch (win_info->type)
c906108c
SS
425 {
426 case SRC_WIN:
427 name = SRC_NAME;
428 break;
429 case CMD_WIN:
430 name = CMD_NAME;
431 break;
432 case DISASSEM_WIN:
433 name = DISASSEM_NAME;
434 break;
435 case DATA_WIN:
436 name = DATA_NAME;
437 break;
438 default:
439 name = "";
440 break;
441 }
442
443 return name;
6ba8e26f 444}
c906108c
SS
445
446
c906108c 447void
dd1abb8c 448tui_initialize_static_data (void)
c906108c 449{
dd1abb8c
AC
450 tui_init_generic_part (tui_source_exec_info_win_ptr ());
451 tui_init_generic_part (tui_disassem_exec_info_win_ptr ());
452 tui_init_generic_part (tui_locator_win_info_ptr ());
453}
c906108c
SS
454
455
2a8854a7 456struct tui_gen_win_info *
dd1abb8c 457tui_alloc_generic_win_info (void)
c906108c 458{
5b6fe301 459 struct tui_gen_win_info *win;
c906108c 460
c0645fb5 461 if ((win = XMALLOC (struct tui_gen_win_info)) != NULL)
dd1abb8c 462 tui_init_generic_part (win);
c906108c
SS
463
464 return win;
6ba8e26f 465}
c906108c
SS
466
467
c906108c 468void
5b6fe301 469tui_init_generic_part (struct tui_gen_win_info *win)
c906108c
SS
470{
471 win->width =
472 win->height =
473 win->origin.x =
474 win->origin.y =
6d012f14
AC
475 win->viewport_height =
476 win->content_size =
477 win->last_visible_line = 0;
c906108c 478 win->handle = (WINDOW *) NULL;
22940a24 479 win->content = NULL;
6d012f14
AC
480 win->content_in_use =
481 win->is_visible = FALSE;
bc6b7f04
SC
482 win->title = 0;
483}
c906108c
SS
484
485
ef5eab5a 486/* init_content_element().
c5aa993b 487 */
2c0b251b 488static void
08ef48c5
MS
489init_content_element (struct tui_win_element *element,
490 enum tui_win_type type)
c906108c
SS
491{
492 element->highlight = FALSE;
493 switch (type)
494 {
495 case SRC_WIN:
496 case DISASSEM_WIN:
6d012f14 497 element->which_element.source.line = (char *) NULL;
362c05fe
AS
498 element->which_element.source.line_or_addr.loa = LOA_LINE;
499 element->which_element.source.line_or_addr.u.line_no = 0;
6d012f14
AC
500 element->which_element.source.is_exec_point = FALSE;
501 element->which_element.source.has_break = FALSE;
c906108c
SS
502 break;
503 case DATA_WIN:
6d012f14
AC
504 tui_init_generic_part (&element->which_element.data_window);
505 element->which_element.data_window.type = DATA_ITEM_WIN;
506 ((struct tui_gen_win_info *) & element->which_element.data_window)->content =
22940a24 507 (void **) tui_alloc_content (1, DATA_ITEM_WIN);
2a8854a7 508 ((struct tui_gen_win_info *)
6d012f14 509 & element->which_element.data_window)->content_size = 1;
c906108c
SS
510 break;
511 case CMD_WIN:
6d012f14 512 element->which_element.command.line = (char *) NULL;
c906108c
SS
513 break;
514 case DATA_ITEM_WIN:
6d012f14
AC
515 element->which_element.data.name = (char *) NULL;
516 element->which_element.data.type = TUI_REGISTER;
517 element->which_element.data.item_no = UNDEFINED_ITEM;
518 element->which_element.data.value = NULL;
519 element->which_element.data.highlight = FALSE;
10f59415 520 element->which_element.data.content = (char*) NULL;
c906108c
SS
521 break;
522 case LOCATOR_WIN:
6d012f14
AC
523 element->which_element.locator.file_name[0] =
524 element->which_element.locator.proc_name[0] = (char) 0;
525 element->which_element.locator.line_no = 0;
526 element->which_element.locator.addr = 0;
c906108c
SS
527 break;
528 case EXEC_INFO_WIN:
6d012f14
AC
529 memset(element->which_element.simple_string, ' ',
530 sizeof(element->which_element.simple_string));
c906108c
SS
531 break;
532 default:
533 break;
534 }
6ba8e26f 535}
c906108c 536
2c0b251b 537static void
5b6fe301 538init_win_info (struct tui_win_info *win_info)
c906108c 539{
6d012f14
AC
540 tui_init_generic_part (&win_info->generic);
541 win_info->can_highlight =
542 win_info->is_highlighted = FALSE;
543 switch (win_info->generic.type)
c906108c
SS
544 {
545 case SRC_WIN:
546 case DISASSEM_WIN:
6d012f14
AC
547 win_info->detail.source_info.execution_info = (struct tui_gen_win_info *) NULL;
548 win_info->detail.source_info.has_locator = FALSE;
549 win_info->detail.source_info.horizontal_offset = 0;
13274fc3 550 win_info->detail.source_info.gdbarch = NULL;
362c05fe
AS
551 win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
552 win_info->detail.source_info.start_line_or_addr.u.addr = 0;
6d012f14 553 win_info->detail.source_info.filename = 0;
c906108c
SS
554 break;
555 case DATA_WIN:
6d012f14
AC
556 win_info->detail.data_display_info.data_content = (tui_win_content) NULL;
557 win_info->detail.data_display_info.data_content_count = 0;
558 win_info->detail.data_display_info.regs_content = (tui_win_content) NULL;
559 win_info->detail.data_display_info.regs_content_count = 0;
560 win_info->detail.data_display_info.regs_display_type =
c906108c 561 TUI_UNDEFINED_REGS;
6d012f14
AC
562 win_info->detail.data_display_info.regs_column_count = 1;
563 win_info->detail.data_display_info.display_regs = FALSE;
10f59415 564 win_info->detail.data_display_info.current_group = 0;
c906108c
SS
565 break;
566 case CMD_WIN:
6d012f14
AC
567 win_info->detail.command_info.cur_line = 0;
568 win_info->detail.command_info.curch = 0;
c906108c
SS
569 break;
570 default:
6d012f14 571 win_info->detail.opaque = NULL;
c906108c
SS
572 break;
573 }
6ba8e26f 574}
c906108c
SS
575
576
2a8854a7 577struct tui_win_info *
22940a24 578tui_alloc_win_info (enum tui_win_type type)
c906108c 579{
5b6fe301 580 struct tui_win_info *win_info;
c906108c 581
c0645fb5
MS
582 win_info = XMALLOC (struct tui_win_info);
583 if (win_info != NULL)
c906108c 584 {
6d012f14 585 win_info->generic.type = type;
6ba8e26f 586 init_win_info (win_info);
c906108c
SS
587 }
588
6d012f14 589 return win_info;
6ba8e26f 590}
c906108c
SS
591
592
6ba8e26f 593/* Allocates the content and elements in a block. */
2a8854a7 594tui_win_content
6ba8e26f 595tui_alloc_content (int num_elements, enum tui_win_type type)
c906108c 596{
c0645fb5
MS
597 tui_win_content content;
598 char *element_block_ptr;
c906108c
SS
599 int i;
600
5b6fe301 601 content = xmalloc (sizeof (struct tui_win_element *) *num_elements);
c0645fb5
MS
602 if (content != NULL)
603 {
604 /*
605 * All windows, except the data window, can allocate the
606 * elements in a chunk. The data window cannot because items
607 * can be added/removed from the data display by the user at any
608 * time.
609 */
c906108c
SS
610 if (type != DATA_WIN)
611 {
c0645fb5
MS
612 element_block_ptr =
613 xmalloc (sizeof (struct tui_win_element) * num_elements);
614 if (element_block_ptr != NULL)
c906108c 615 {
6ba8e26f 616 for (i = 0; i < num_elements; i++)
c906108c 617 {
6ba8e26f
AC
618 content[i] = (struct tui_win_element *) element_block_ptr;
619 init_content_element (content[i], type);
620 element_block_ptr += sizeof (struct tui_win_element);
c906108c
SS
621 }
622 }
623 else
624 {
22940a24 625 xfree (content);
2a8854a7 626 content = (tui_win_content) NULL;
c906108c
SS
627 }
628 }
629 }
630
631 return content;
6ba8e26f 632}
c906108c
SS
633
634
dd1abb8c 635/* Adds the input number of elements to the windows's content. If no
6ba8e26f 636 content has been allocated yet, alloc_content() is called to do
dd1abb8c
AC
637 this. The index of the first element added is returned, unless
638 there is a memory allocation error, in which case, (-1) is
639 returned. */
c906108c 640int
08ef48c5
MS
641tui_add_content_elements (struct tui_gen_win_info *win_info,
642 int num_elements)
c906108c 643{
5b6fe301 644 struct tui_win_element *element_ptr;
6ba8e26f 645 int i, index_start;
c906108c 646
6d012f14 647 if (win_info->content == NULL)
c906108c 648 {
6ba8e26f
AC
649 win_info->content = (void **) tui_alloc_content (num_elements, win_info->type);
650 index_start = 0;
c906108c
SS
651 }
652 else
6ba8e26f 653 index_start = win_info->content_size;
6d012f14 654 if (win_info->content != NULL)
c906108c 655 {
6ba8e26f 656 for (i = index_start; (i < num_elements + index_start); i++)
c906108c 657 {
c0645fb5 658 if ((element_ptr = XMALLOC (struct tui_win_element)) != NULL)
c906108c 659 {
6ba8e26f
AC
660 win_info->content[i] = (void *) element_ptr;
661 init_content_element (element_ptr, win_info->type);
6d012f14 662 win_info->content_size++;
c906108c 663 }
1cc6d956
MS
664 else /* Things must be really hosed now! We ran out of
665 memory!? */
c906108c
SS
666 return (-1);
667 }
668 }
669
6ba8e26f
AC
670 return index_start;
671}
c906108c
SS
672
673
1cc6d956
MS
674/* Delete all curses windows associated with win_info, leaving
675 everything else intact. */
c906108c 676void
5b6fe301 677tui_del_window (struct tui_win_info *win_info)
c906108c 678{
5b6fe301 679 struct tui_gen_win_info *generic_win;
c906108c 680
6d012f14 681 switch (win_info->generic.type)
c906108c
SS
682 {
683 case SRC_WIN:
684 case DISASSEM_WIN:
6ba8e26f
AC
685 generic_win = tui_locator_win_info_ptr ();
686 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 687 {
6ba8e26f
AC
688 tui_delete_win (generic_win->handle);
689 generic_win->handle = (WINDOW *) NULL;
690 generic_win->is_visible = FALSE;
c906108c 691 }
6d012f14 692 if (win_info->detail.source_info.filename)
bc6b7f04 693 {
6d012f14
AC
694 xfree (win_info->detail.source_info.filename);
695 win_info->detail.source_info.filename = 0;
bc6b7f04 696 }
6ba8e26f
AC
697 generic_win = win_info->detail.source_info.execution_info;
698 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 699 {
6ba8e26f
AC
700 tui_delete_win (generic_win->handle);
701 generic_win->handle = (WINDOW *) NULL;
702 generic_win->is_visible = FALSE;
c906108c
SS
703 }
704 break;
705 case DATA_WIN:
6d012f14 706 if (win_info->generic.content != NULL)
c906108c 707 {
6d012f14
AC
708 tui_del_data_windows (win_info->detail.data_display_info.regs_content,
709 win_info->detail.data_display_info.regs_content_count);
710 tui_del_data_windows (win_info->detail.data_display_info.data_content,
711 win_info->detail.data_display_info.data_content_count);
c906108c
SS
712 }
713 break;
714 default:
715 break;
716 }
6d012f14 717 if (win_info->generic.handle != (WINDOW *) NULL)
c906108c 718 {
6d012f14
AC
719 tui_delete_win (win_info->generic.handle);
720 win_info->generic.handle = (WINDOW *) NULL;
721 win_info->generic.is_visible = FALSE;
c906108c 722 }
bc6b7f04 723}
c906108c
SS
724
725
c906108c 726void
5b6fe301 727tui_free_window (struct tui_win_info *win_info)
c906108c 728{
5b6fe301 729 struct tui_gen_win_info *generic_win;
c906108c 730
6d012f14 731 switch (win_info->generic.type)
c906108c
SS
732 {
733 case SRC_WIN:
734 case DISASSEM_WIN:
6ba8e26f
AC
735 generic_win = tui_locator_win_info_ptr ();
736 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 737 {
6ba8e26f
AC
738 tui_delete_win (generic_win->handle);
739 generic_win->handle = (WINDOW *) NULL;
c906108c 740 }
6ba8e26f 741 tui_free_win_content (generic_win);
6d012f14 742 if (win_info->detail.source_info.filename)
bc6b7f04 743 {
6d012f14
AC
744 xfree (win_info->detail.source_info.filename);
745 win_info->detail.source_info.filename = 0;
bc6b7f04 746 }
6ba8e26f
AC
747 generic_win = win_info->detail.source_info.execution_info;
748 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 749 {
6ba8e26f
AC
750 tui_delete_win (generic_win->handle);
751 generic_win->handle = (WINDOW *) NULL;
752 tui_free_win_content (generic_win);
c906108c
SS
753 }
754 break;
755 case DATA_WIN:
6d012f14 756 if (win_info->generic.content != NULL)
c906108c 757 {
6d012f14
AC
758 tui_free_data_content (win_info->detail.data_display_info.regs_content,
759 win_info->detail.data_display_info.regs_content_count);
760 win_info->detail.data_display_info.regs_content =
2a8854a7 761 (tui_win_content) NULL;
6d012f14
AC
762 win_info->detail.data_display_info.regs_content_count = 0;
763 tui_free_data_content (win_info->detail.data_display_info.data_content,
764 win_info->detail.data_display_info.data_content_count);
765 win_info->detail.data_display_info.data_content =
2a8854a7 766 (tui_win_content) NULL;
6d012f14
AC
767 win_info->detail.data_display_info.data_content_count = 0;
768 win_info->detail.data_display_info.regs_display_type =
c906108c 769 TUI_UNDEFINED_REGS;
6d012f14
AC
770 win_info->detail.data_display_info.regs_column_count = 1;
771 win_info->detail.data_display_info.display_regs = FALSE;
772 win_info->generic.content = NULL;
773 win_info->generic.content_size = 0;
c906108c
SS
774 }
775 break;
776 default:
777 break;
778 }
6d012f14 779 if (win_info->generic.handle != (WINDOW *) NULL)
c906108c 780 {
6d012f14
AC
781 tui_delete_win (win_info->generic.handle);
782 win_info->generic.handle = (WINDOW *) NULL;
783 tui_free_win_content (&win_info->generic);
c906108c 784 }
6d012f14
AC
785 if (win_info->generic.title)
786 xfree (win_info->generic.title);
787 xfree (win_info);
bc6b7f04 788}
c906108c
SS
789
790
c906108c 791void
dd1abb8c 792tui_free_all_source_wins_content (void)
c906108c
SS
793{
794 int i;
795
dd1abb8c 796 for (i = 0; i < (tui_source_windows ())->count; i++)
c906108c 797 {
5b6fe301 798 struct tui_win_info *win_info = (tui_source_windows ())->list[i];
c906108c 799
6d012f14 800 if (win_info != NULL)
c906108c 801 {
6d012f14
AC
802 tui_free_win_content (&(win_info->generic));
803 tui_free_win_content (win_info->detail.source_info.execution_info);
c906108c
SS
804 }
805 }
dd1abb8c 806}
c906108c
SS
807
808
c906108c 809void
5b6fe301 810tui_free_win_content (struct tui_gen_win_info *win_info)
c906108c 811{
6d012f14 812 if (win_info->content != NULL)
c906108c 813 {
6ba8e26f 814 free_content ((tui_win_content) win_info->content,
6d012f14
AC
815 win_info->content_size,
816 win_info->type);
817 win_info->content = NULL;
c906108c 818 }
6d012f14 819 win_info->content_size = 0;
6ba8e26f 820}
c906108c
SS
821
822
c906108c 823void
08ef48c5
MS
824tui_del_data_windows (tui_win_content content,
825 int content_size)
c906108c
SS
826{
827 int i;
828
ef5eab5a
MS
829 /* Remember that data window content elements are of type struct
830 tui_gen_win_info *, each of which whose single element is a data
831 element. */
6ba8e26f 832 for (i = 0; i < content_size; i++)
c906108c 833 {
5b6fe301 834 struct tui_gen_win_info *generic_win = &content[i]->which_element.data_window;
c906108c 835
6ba8e26f 836 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 837 {
6ba8e26f
AC
838 tui_delete_win (generic_win->handle);
839 generic_win->handle = (WINDOW *) NULL;
840 generic_win->is_visible = FALSE;
c906108c
SS
841 }
842 }
dd1abb8c 843}
c906108c
SS
844
845
846void
08ef48c5
MS
847tui_free_data_content (tui_win_content content,
848 int content_size)
c906108c
SS
849{
850 int i;
851
ef5eab5a
MS
852 /* Remember that data window content elements are of type struct
853 tui_gen_win_info *, each of which whose single element is a data
854 element. */
6ba8e26f 855 for (i = 0; i < content_size; i++)
c906108c 856 {
5b6fe301 857 struct tui_gen_win_info *generic_win = &content[i]->which_element.data_window;
c906108c 858
6ba8e26f 859 if (generic_win != (struct tui_gen_win_info *) NULL)
c906108c 860 {
6ba8e26f
AC
861 tui_delete_win (generic_win->handle);
862 generic_win->handle = (WINDOW *) NULL;
863 tui_free_win_content (generic_win);
c906108c
SS
864 }
865 }
6ba8e26f 866 free_content (content,
08ef48c5
MS
867 content_size,
868 DATA_WIN);
6ba8e26f 869}
c906108c
SS
870
871
872/**********************************
873** LOCAL STATIC FUNCTIONS **
874**********************************/
875
876
c906108c 877static void
08ef48c5
MS
878free_content (tui_win_content content,
879 int content_size,
880 enum tui_win_type win_type)
c906108c 881{
2a8854a7 882 if (content != (tui_win_content) NULL)
c906108c 883 {
6ba8e26f 884 free_content_elements (content, content_size, win_type);
22940a24 885 xfree (content);
c906108c 886 }
6ba8e26f 887}
c906108c
SS
888
889
ef5eab5a 890/* free_content_elements().
c5aa993b 891 */
c906108c 892static void
08ef48c5
MS
893free_content_elements (tui_win_content content,
894 int content_size,
895 enum tui_win_type type)
c906108c 896{
2a8854a7 897 if (content != (tui_win_content) NULL)
c906108c
SS
898 {
899 int i;
900
901 if (type == SRC_WIN || type == DISASSEM_WIN)
902 {
1cc6d956 903 /* Free whole source block. */
6d012f14 904 xfree (content[0]->which_element.source.line);
c906108c
SS
905 }
906 else
907 {
6ba8e26f 908 for (i = 0; i < content_size; i++)
c906108c 909 {
5b6fe301 910 struct tui_win_element *element;
c906108c
SS
911
912 element = content[i];
2a8854a7 913 if (element != (struct tui_win_element *) NULL)
c906108c
SS
914 {
915 switch (type)
916 {
917 case DATA_WIN:
22940a24 918 xfree (element);
c906108c
SS
919 break;
920 case DATA_ITEM_WIN:
ef5eab5a
MS
921 /* Note that data elements are not allocated in
922 a single block, but individually, as
923 needed. */
6d012f14
AC
924 if (element->which_element.data.type != TUI_REGISTER)
925 xfree ((void *)element->which_element.data.name);
926 xfree (element->which_element.data.value);
10f59415 927 xfree (element->which_element.data.content);
22940a24 928 xfree (element);
c906108c
SS
929 break;
930 case CMD_WIN:
6d012f14 931 xfree (element->which_element.command.line);
c906108c
SS
932 break;
933 default:
934 break;
935 }
936 }
937 }
938 }
939 if (type != DATA_WIN && type != DATA_ITEM_WIN)
1cc6d956 940 xfree (content[0]); /* Free the element block. */
c906108c 941 }
6ba8e26f 942}