8d7493201c
This patch is part of the make-gdb-buildable-in-C++ effort. The idea is to change some calls to the xmalloc family of functions to calls to the equivalents in the XNEW family. This avoids adding an explicit cast, so it keeps the code a bit more readable. Some of them also map relatively well to a C++ equivalent (XNEW (struct foo) -> new foo), so it will be possible to do scripted replacements if needed. I only changed calls that were obviously allocating memory for one or multiple "objects". Allocation of variable sizes (such as strings or buffer handling) will be for later (and won't use XNEW). - xmalloc (sizeof (struct foo)) -> XNEW (struct foo) - xmalloc (num * sizeof (struct foo)) -> XNEWVEC (struct foo, num) - xcalloc (1, sizeof (struct foo)) -> XCNEW (struct foo) - xcalloc (num, sizeof (struct foo)) -> XCNEWVEC (struct foo, num) - xrealloc (p, num * sizeof (struct foo) -> XRESIZEVEC (struct foo, p, num) - obstack_alloc (ob, sizeof (struct foo)) -> XOBNEW (ob, struct foo) - obstack_alloc (ob, num * sizeof (struct foo)) -> XOBNEWVEC (ob, struct foo, num) - alloca (sizeof (struct foo)) -> XALLOCA (struct foo) - alloca (num * sizeof (struct foo)) -> XALLOCAVEC (struct foo, num) Some instances of xmalloc followed by memset to zero the buffer were replaced by XCNEW or XCNEWVEC. I regtested on x86-64, Ubuntu 14.04, but the patch touches many architecture-specific files. For those I'll have to rely on the buildbot or people complaining that I broke their gdb. gdb/ChangeLog: * aarch64-linux-nat.c (aarch64_add_process): Likewise. * aarch64-tdep.c (aarch64_gdbarch_init): Likewise. * ada-exp.y (write_ambiguous_var): Likewise. * ada-lang.c (resolve_subexp): Likewise. (user_select_syms): Likewise. (assign_aggregate): Likewise. (ada_evaluate_subexp): Likewise. (cache_symbol): Likewise. * addrmap.c (allocate_key): Likewise. (addrmap_create_mutable): Likewise. * aix-thread.c (sync_threadlists): Likewise. * alpha-tdep.c (alpha_push_dummy_call): Likewise. (alpha_gdbarch_init): Likewise. * amd64-windows-tdep.c (amd64_windows_push_arguments): Likewise. * arm-linux-nat.c (arm_linux_add_process): Likewise. * arm-linux-tdep.c (arm_linux_displaced_step_copy_insn): Likewise. * arm-tdep.c (push_stack_item): Likewise. (arm_displaced_step_copy_insn): Likewise. (arm_gdbarch_init): Likewise. (_initialize_arm_tdep): Likewise. * avr-tdep.c (push_stack_item): Likewise. * ax-general.c (new_agent_expr): Likewise. * block.c (block_initialize_namespace): Likewise. * breakpoint.c (alloc_counted_command_line): Likewise. (update_dprintf_command_list): Likewise. (parse_breakpoint_sals): Likewise. (decode_static_tracepoint_spec): Likewise. (until_break_command): Likewise. (clear_command): Likewise. (update_global_location_list): Likewise. (get_breakpoint_objfile_data) Likewise. * btrace.c (ftrace_new_function): Likewise. (btrace_set_insn_history): Likewise. (btrace_set_call_history): Likewise. * buildsym.c (add_symbol_to_list): Likewise. (record_pending_block): Likewise. (start_subfile): Likewise. (start_buildsym_compunit): Likewise. (push_subfile): Likewise. (end_symtab_get_static_block): Likewise. (buildsym_init): Likewise. * cli/cli-cmds.c (source_command): Likewise. * cli/cli-decode.c (add_cmd): Likewise. * cli/cli-script.c (build_command_line): Likewise. (setup_user_args): Likewise. (realloc_body_list): Likewise. (process_next_line): Likewise. (copy_command_lines): Likewise. * cli/cli-setshow.c (do_set_command): Likewise. * coff-pe-read.c (read_pe_exported_syms): Likewise. * coffread.c (coff_locate_sections): Likewise. (coff_symtab_read): Likewise. (coff_read_struct_type): Likewise. * common/cleanups.c (make_my_cleanup2): Likewise. * common/common-exceptions.c (throw_it): Likewise. * common/filestuff.c (make_cleanup_close): Likewise. * common/format.c (parse_format_string): Likewise. * common/queue.h (DEFINE_QUEUE_P): Likewise. * compile/compile-object-load.c (munmap_list_add): Likewise. (compile_object_load): Likewise. * compile/compile-object-run.c (compile_object_run): Likewise. * compile/compile.c (append_args): Likewise. * corefile.c (specify_exec_file_hook): Likewise. * cp-support.c (make_symbol_overload_list): Likewise. * cris-tdep.c (push_stack_item): Likewise. (cris_gdbarch_init): Likewise. * ctf.c (ctf_trace_file_writer_new): Likewise. * dbxread.c (init_header_files): Likewise. (add_new_header_file): Likewise. (init_bincl_list): Likewise. (dbx_end_psymtab): Likewise. (start_psymtab): Likewise. (dbx_end_psymtab): Likewise. * dcache.c (dcache_init): Likewise. * dictionary.c (dict_create_hashed): Likewise. (dict_create_hashed_expandable): Likewise. (dict_create_linear): Likewise. (dict_create_linear_expandable): Likewise. * dtrace-probe.c (dtrace_process_dof_probe): Likewise. * dummy-frame.c (register_dummy_frame_dtor): Likewise. * dwarf2-frame-tailcall.c (cache_new_ref1): Likewise. * dwarf2-frame.c (dwarf2_build_frame_info): Likewise. (decode_frame_entry_1): Likewise. * dwarf2expr.c (new_dwarf_expr_context): Likewise. * dwarf2loc.c (dwarf2_compile_expr_to_ax): Likewise. * dwarf2read.c (dwarf2_has_info): Likewise. (create_signatured_type_table_from_index): Likewise. (dwarf2_read_index): Likewise. (dw2_get_file_names_reader): Likewise. (create_all_type_units): Likewise. (read_cutu_die_from_dwo): Likewise. (init_tu_and_read_dwo_dies): Likewise. (init_cutu_and_read_dies): Likewise. (create_all_comp_units): Likewise. (queue_comp_unit): Likewise. (inherit_abstract_dies): Likewise. (read_call_site_scope): Likewise. (dwarf2_add_field): Likewise. (dwarf2_add_typedef): Likewise. (dwarf2_add_member_fn): Likewise. (attr_to_dynamic_prop): Likewise. (abbrev_table_alloc_abbrev): Likewise. (abbrev_table_read_table): Likewise. (add_include_dir): Likewise. (add_file_name): Likewise. (dwarf_decode_line_header): Likewise. (dwarf2_const_value_attr): Likewise. (dwarf_alloc_block): Likewise. (parse_macro_definition): Likewise. (set_die_type): Likewise. (write_psymtabs_to_index): Likewise. (create_cus_from_index): Likewise. (dwarf2_create_include_psymtab): Likewise. (process_psymtab_comp_unit_reader): Likewise. (build_type_psymtab_dependencies): Likewise. (read_comp_units_from_section): Likewise. (compute_compunit_symtab_includes): Likewise. (create_dwo_unit_in_dwp_v1): Likewise. (create_dwo_unit_in_dwp_v2): Likewise. (read_func_scope): Likewise. (process_structure_scope): Likewise. (mark_common_block_symbol_computed): Likewise. (load_partial_dies): Likewise. (dwarf2_symbol_mark_computed): Likewise. * elfread.c (elf_symfile_segments): Likewise. (elf_read_minimal_symbols): Likewise. * environ.c (make_environ): Likewise. * eval.c (evaluate_subexp_standard): Likewise. * event-loop.c (create_file_handler): Likewise. (create_async_signal_handler): Likewise. (create_async_event_handler): Likewise. (create_timer): Likewise. * exec.c (build_section_table): Likewise. * fbsd-nat.c (fbsd_remember_child): Likewise. * fork-child.c (fork_inferior): Likewise. * frv-tdep.c (new_variant): Likewise. * gdbarch.sh (gdbarch_alloc): Likewise. (append_name): Likewise. * gdbtypes.c (rank_function): Likewise. (copy_type_recursive): Likewise. (add_dyn_prop): Likewise. * gnu-nat.c (make_proc): Likewise. (make_inf): Likewise. (gnu_write_inferior): Likewise. * gnu-v3-abi.c (build_gdb_vtable_type): Likewise. (build_std_type_info_type): Likewise. * guile/scm-param.c (compute_enum_list): Likewise. * guile/scm-utils.c (gdbscm_parse_function_args): Likewise. * guile/scm-value.c (gdbscm_value_call): Likewise. * h8300-tdep.c (h8300_gdbarch_init): Likewise. * hppa-tdep.c (hppa_init_objfile_priv_data): Likewise. (read_unwind_info): Likewise. * ia64-tdep.c (ia64_gdbarch_init): Likewise. * infcall.c (dummy_frame_context_saver_setup): Likewise. (call_function_by_hand_dummy): Likewise. * infcmd.c (step_once): Likewise. (finish_forward): Likewise. (attach_command): Likewise. (notice_new_inferior): Likewise. * inferior.c (add_inferior_silent): Likewise. * infrun.c (add_displaced_stepping_state): Likewise. (save_infcall_control_state): Likewise. (save_inferior_ptid): Likewise. (_initialize_infrun): Likewise. * jit.c (bfd_open_from_target_memory): Likewise. (jit_gdbarch_data_init): Likewise. * language.c (add_language): Likewise. * linespec.c (decode_line_2): Likewise. * linux-nat.c (add_to_pid_list): Likewise. (add_initial_lwp): Likewise. * linux-thread-db.c (add_thread_db_info): Likewise. (record_thread): Likewise. (info_auto_load_libthread_db): Likewise. * m32c-tdep.c (m32c_gdbarch_init): Likewise. * m68hc11-tdep.c (m68hc11_gdbarch_init): Likewise. * m68k-tdep.c (m68k_gdbarch_init): Likewise. * m88k-tdep.c (m88k_analyze_prologue): Likewise. * macrocmd.c (macro_define_command): Likewise. * macroexp.c (gather_arguments): Likewise. * macroscope.c (sal_macro_scope): Likewise. * macrotab.c (new_macro_table): Likewise. * mdebugread.c (push_parse_stack): Likewise. (parse_partial_symbols): Likewise. (parse_symbol): Likewise. (psymtab_to_symtab_1): Likewise. (new_block): Likewise. (new_psymtab): Likewise. (mdebug_build_psymtabs): Likewise. (add_pending): Likewise. (elfmdebug_build_psymtabs): Likewise. * mep-tdep.c (mep_gdbarch_init): Likewise. * mi/mi-main.c (mi_execute_command): Likewise. * mi/mi-parse.c (mi_parse_argv): Likewise. * minidebug.c (lzma_open): Likewise. * minsyms.c (terminate_minimal_symbol_table): Likewise. * mips-linux-nat.c (mips_linux_insert_watchpoint): Likewise. * mips-tdep.c (mips_gdbarch_init): Likewise. * mn10300-tdep.c (mn10300_gdbarch_init): Likewise. * msp430-tdep.c (msp430_gdbarch_init): Likewise. * mt-tdep.c (mt_registers_info): Likewise. * nat/aarch64-linux.c (aarch64_linux_new_thread): Likewise. * nat/linux-btrace.c (linux_enable_bts): Likewise. (linux_enable_pt): Likewise. * nat/linux-osdata.c (linux_xfer_osdata_processes): Likewise. (linux_xfer_osdata_processgroups): Likewise. * nios2-tdep.c (nios2_gdbarch_init): Likewise. * nto-procfs.c (procfs_meminfo): Likewise. * objc-lang.c (start_msglist): Likewise. (selectors_info): Likewise. (classes_info): Likewise. (find_methods): Likewise. * objfiles.c (allocate_objfile): Likewise. (update_section_map): Likewise. * osabi.c (gdbarch_register_osabi): Likewise. (gdbarch_register_osabi_sniffer): Likewise. * parse.c (start_arglist): Likewise. * ppc-linux-nat.c (hwdebug_find_thread_points_by_tid): Likewise. (hwdebug_insert_point): Likewise. * printcmd.c (display_command): Likewise. (ui_printf): Likewise. * procfs.c (create_procinfo): Likewise. (load_syscalls): Likewise. (proc_get_LDT_entry): Likewise. (proc_update_threads): Likewise. * prologue-value.c (make_pv_area): Likewise. (pv_area_store): Likewise. * psymtab.c (extend_psymbol_list): Likewise. (init_psymbol_list): Likewise. (allocate_psymtab): Likewise. * python/py-inferior.c (add_thread_object): Likewise. * python/py-param.c (compute_enum_values): Likewise. * python/py-value.c (valpy_call): Likewise. * python/py-varobj.c (py_varobj_iter_next): Likewise. * python/python.c (ensure_python_env): Likewise. * record-btrace.c (record_btrace_start_replaying): Likewise. * record-full.c (record_full_reg_alloc): Likewise. (record_full_mem_alloc): Likewise. (record_full_end_alloc): Likewise. (record_full_core_xfer_partial): Likewise. * regcache.c (get_thread_arch_aspace_regcache): Likewise. * remote-fileio.c (remote_fileio_init_fd_map): Likewise. * remote-notif.c (remote_notif_state_allocate): Likewise. * remote.c (demand_private_info): Likewise. (remote_notif_stop_alloc_reply): Likewise. (remote_enable_btrace): Likewise. * reverse.c (save_bookmark_command): Likewise. * rl78-tdep.c (rl78_gdbarch_init): Likewise. * rx-tdep.c (rx_gdbarch_init): Likewise. * s390-linux-nat.c (s390_insert_watchpoint): Likewise. * ser-go32.c (dos_get_tty_state): Likewise. (dos_copy_tty_state): Likewise. * ser-mingw.c (ser_windows_open): Likewise. (ser_console_wait_handle): Likewise. (ser_console_get_tty_state): Likewise. (make_pipe_state): Likewise. (net_windows_open): Likewise. * ser-unix.c (hardwire_get_tty_state): Likewise. (hardwire_copy_tty_state): Likewise. * solib-aix.c (solib_aix_new_lm_info): Likewise. * solib-dsbt.c (dsbt_current_sos): Likewise. (dsbt_relocate_main_executable): Likewise. * solib-frv.c (frv_current_sos): Likewise. (frv_relocate_main_executable): Likewise. * solib-spu.c (spu_bfd_fopen): Likewise. * solib-svr4.c (lm_info_read): Likewise. (svr4_copy_library_list): Likewise. (svr4_default_sos): Likewise. * source.c (find_source_lines): Likewise. (line_info): Likewise. (add_substitute_path_rule): Likewise. * spu-linux-nat.c (spu_bfd_open): Likewise. * spu-tdep.c (info_spu_dma_cmdlist): Likewise. * stabsread.c (dbx_lookup_type): Likewise. (read_type): Likewise. (read_member_functions): Likewise. (read_struct_fields): Likewise. (read_baseclasses): Likewise. (read_args): Likewise. (_initialize_stabsread): Likewise. * stack.c (func_command): Likewise. * stap-probe.c (handle_stap_probe): Likewise. * symfile.c (addrs_section_sort): Likewise. (addr_info_make_relative): Likewise. (load_section_callback): Likewise. (add_symbol_file_command): Likewise. (init_filename_language_table): Likewise. * symtab.c (create_filename_seen_cache): Likewise. (sort_search_symbols_remove_dups): Likewise. (search_symbols): Likewise. * target.c (make_cleanup_restore_target_terminal): Likewise. * thread.c (new_thread): Likewise. (enable_thread_stack_temporaries): Likewise. (make_cleanup_restore_current_thread): Likewise. (thread_apply_all_command): Likewise. * tic6x-tdep.c (tic6x_gdbarch_init): Likewise. * top.c (gdb_readline_wrapper): Likewise. * tracefile-tfile.c (tfile_trace_file_writer_new): Likewise. * tracepoint.c (trace_find_line_command): Likewise. (all_tracepoint_actions_and_cleanup): Likewise. (make_cleanup_restore_current_traceframe): Likewise. (get_uploaded_tp): Likewise. (get_uploaded_tsv): Likewise. * tui/tui-data.c (tui_alloc_generic_win_info): Likewise. (tui_alloc_win_info): Likewise. (tui_alloc_content): Likewise. (tui_add_content_elements): Likewise. * tui/tui-disasm.c (tui_find_disassembly_address): Likewise. (tui_set_disassem_content): Likewise. * ui-file.c (ui_file_new): Likewise. (stdio_file_new): Likewise. (tee_file_new): Likewise. * utils.c (make_cleanup_restore_integer): Likewise. (add_internal_problem_command): Likewise. * v850-tdep.c (v850_gdbarch_init): Likewise. * valops.c (find_oload_champ): Likewise. * value.c (allocate_value_lazy): Likewise. (record_latest_value): Likewise. (create_internalvar): Likewise. * varobj.c (install_variable): Likewise. (new_variable): Likewise. (new_root_variable): Likewise. (cppush): Likewise. (_initialize_varobj): Likewise. * windows-nat.c (windows_make_so): Likewise. * x86-nat.c (x86_add_process): Likewise. * xcoffread.c (arrange_linetable): Likewise. (allocate_include_entry): Likewise. (process_linenos): Likewise. (SYMBOL_DUP): Likewise. (xcoff_start_psymtab): Likewise. (xcoff_end_psymtab): Likewise. * xml-support.c (gdb_xml_parse_attr_ulongest): Likewise. * xtensa-tdep.c (xtensa_register_type): Likewise. * gdbarch.c: Regenerate. * gdbarch.h: Regenerate. gdb/gdbserver/ChangeLog: * ax.c (gdb_parse_agent_expr): Likewise. (compile_bytecodes): Likewise. * dll.c (loaded_dll): Likewise. * event-loop.c (append_callback_event): Likewise. (create_file_handler): Likewise. (create_file_event): Likewise. * hostio.c (handle_open): Likewise. * inferiors.c (add_thread): Likewise. (add_process): Likewise. * linux-aarch64-low.c (aarch64_linux_new_process): Likewise. * linux-arm-low.c (arm_new_process): Likewise. (arm_new_thread): Likewise. * linux-low.c (add_to_pid_list): Likewise. (linux_add_process): Likewise. (handle_extended_wait): Likewise. (add_lwp): Likewise. (enqueue_one_deferred_signal): Likewise. (enqueue_pending_signal): Likewise. (linux_resume_one_lwp_throw): Likewise. (linux_resume_one_thread): Likewise. (linux_read_memory): Likewise. (linux_write_memory): Likewise. * linux-mips-low.c (mips_linux_new_process): Likewise. (mips_linux_new_thread): Likewise. (mips_add_watchpoint): Likewise. * linux-x86-low.c (initialize_low_arch): Likewise. * lynx-low.c (lynx_add_process): Likewise. * mem-break.c (set_raw_breakpoint_at): Likewise. (set_breakpoint): Likewise. (add_condition_to_breakpoint): Likewise. (add_commands_to_breakpoint): Likewise. (clone_agent_expr): Likewise. (clone_one_breakpoint): Likewise. * regcache.c (new_register_cache): Likewise. * remote-utils.c (look_up_one_symbol): Likewise. * server.c (queue_stop_reply): Likewise. (start_inferior): Likewise. (queue_stop_reply_callback): Likewise. (handle_target_event): Likewise. * spu-low.c (fetch_ppc_memory): Likewise. (store_ppc_memory): Likewise. * target.c (set_target_ops): Likewise. * thread-db.c (thread_db_load_search): Likewise. (try_thread_db_load_1): Likewise. * tracepoint.c (add_tracepoint): Likewise. (add_tracepoint_action): Likewise. (create_trace_state_variable): Likewise. (cmd_qtdpsrc): Likewise. (cmd_qtro): Likewise. (add_while_stepping_state): Likewise. * win32-low.c (child_add_thread): Likewise. (get_image_name): Likewise.
914 lines
22 KiB
C
914 lines
22 KiB
C
/* TUI data manipulation routines.
|
|
|
|
Copyright (C) 1998-2015 Free Software Foundation, Inc.
|
|
|
|
Contributed by Hewlett-Packard Company.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "symtab.h"
|
|
#include "tui/tui.h"
|
|
#include "tui/tui-data.h"
|
|
#include "tui/tui-wingeneral.h"
|
|
#include "gdb_curses.h"
|
|
|
|
/****************************
|
|
** GLOBAL DECLARATIONS
|
|
****************************/
|
|
struct tui_win_info *(tui_win_list[MAX_MAJOR_WINDOWS]);
|
|
|
|
/***************************
|
|
** Private data
|
|
****************************/
|
|
static enum tui_layout_type current_layout = UNDEFINED_LAYOUT;
|
|
static int term_height, term_width;
|
|
static struct tui_gen_win_info _locator;
|
|
static struct tui_gen_win_info exec_info[2];
|
|
static struct tui_win_info *src_win_list[2];
|
|
static struct tui_list source_windows = {src_win_list, 0};
|
|
static int default_tab_len = DEFAULT_TAB_LEN;
|
|
static struct tui_win_info *win_with_focus = (struct tui_win_info *) NULL;
|
|
static struct tui_layout_def layout_def = {
|
|
SRC_WIN, /* DISPLAY_MODE */
|
|
FALSE}; /* SPLIT */
|
|
|
|
static int win_resized = FALSE;
|
|
|
|
|
|
/*********************************
|
|
** Static function forward decls
|
|
**********************************/
|
|
static void free_content (tui_win_content,
|
|
int,
|
|
enum tui_win_type);
|
|
static void free_content_elements (tui_win_content,
|
|
int,
|
|
enum tui_win_type);
|
|
|
|
|
|
|
|
/*********************************
|
|
** PUBLIC FUNCTIONS
|
|
**********************************/
|
|
|
|
int
|
|
tui_win_is_source_type (enum tui_win_type win_type)
|
|
{
|
|
return (win_type == SRC_WIN || win_type == DISASSEM_WIN);
|
|
}
|
|
|
|
int
|
|
tui_win_is_auxillary (enum tui_win_type win_type)
|
|
{
|
|
return (win_type > MAX_MAJOR_WINDOWS);
|
|
}
|
|
|
|
int
|
|
tui_win_has_locator (struct tui_win_info *win_info)
|
|
{
|
|
return (win_info != NULL
|
|
&& win_info->detail.source_info.has_locator);
|
|
}
|
|
|
|
void
|
|
tui_set_win_highlight (struct tui_win_info *win_info,
|
|
int highlight)
|
|
{
|
|
if (win_info != NULL)
|
|
win_info->is_highlighted = highlight;
|
|
}
|
|
|
|
/******************************************
|
|
** ACCESSORS & MUTATORS FOR PRIVATE DATA
|
|
******************************************/
|
|
|
|
/* Answer a whether the terminal window has been resized or not. */
|
|
int
|
|
tui_win_resized (void)
|
|
{
|
|
return win_resized;
|
|
}
|
|
|
|
|
|
/* Set a whether the terminal window has been resized or not. */
|
|
void
|
|
tui_set_win_resized_to (int resized)
|
|
{
|
|
win_resized = resized;
|
|
}
|
|
|
|
|
|
/* Answer a pointer to the current layout definition. */
|
|
struct tui_layout_def *
|
|
tui_layout_def (void)
|
|
{
|
|
return &layout_def;
|
|
}
|
|
|
|
|
|
/* Answer the window with the logical focus. */
|
|
struct tui_win_info *
|
|
tui_win_with_focus (void)
|
|
{
|
|
return win_with_focus;
|
|
}
|
|
|
|
|
|
/* Set the window that has the logical focus. */
|
|
void
|
|
tui_set_win_with_focus (struct tui_win_info *win_info)
|
|
{
|
|
win_with_focus = win_info;
|
|
}
|
|
|
|
|
|
/* Answer the length in chars, of tabs. */
|
|
int
|
|
tui_default_tab_len (void)
|
|
{
|
|
return default_tab_len;
|
|
}
|
|
|
|
|
|
/* Set the length in chars, of tabs. */
|
|
void
|
|
tui_set_default_tab_len (int len)
|
|
{
|
|
default_tab_len = len;
|
|
}
|
|
|
|
|
|
/* Accessor for the current source window. Usually there is only one
|
|
source window (either source or disassembly), but both can be
|
|
displayed at the same time. */
|
|
struct tui_list *
|
|
tui_source_windows (void)
|
|
{
|
|
return &source_windows;
|
|
}
|
|
|
|
|
|
/* Clear the list of source windows. Usually there is only one source
|
|
window (either source or disassembly), but both can be displayed at
|
|
the same time. */
|
|
void
|
|
tui_clear_source_windows (void)
|
|
{
|
|
source_windows.list[0] = NULL;
|
|
source_windows.list[1] = NULL;
|
|
source_windows.count = 0;
|
|
}
|
|
|
|
|
|
/* Clear the pertinant detail in the source windows. */
|
|
void
|
|
tui_clear_source_windows_detail (void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < (tui_source_windows ())->count; i++)
|
|
tui_clear_win_detail ((tui_source_windows ())->list[i]);
|
|
}
|
|
|
|
|
|
/* Add a window to the list of source windows. Usually there is only
|
|
one source window (either source or disassembly), but both can be
|
|
displayed at the same time. */
|
|
void
|
|
tui_add_to_source_windows (struct tui_win_info *win_info)
|
|
{
|
|
if (source_windows.count < 2)
|
|
source_windows.list[source_windows.count++] = (void *) win_info;
|
|
}
|
|
|
|
|
|
/* Clear the pertinant detail in the windows. */
|
|
void
|
|
tui_clear_win_detail (struct tui_win_info *win_info)
|
|
{
|
|
if (win_info != NULL)
|
|
{
|
|
switch (win_info->generic.type)
|
|
{
|
|
case SRC_WIN:
|
|
case DISASSEM_WIN:
|
|
win_info->detail.source_info.gdbarch = NULL;
|
|
win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
|
|
win_info->detail.source_info.start_line_or_addr.u.addr = 0;
|
|
win_info->detail.source_info.horizontal_offset = 0;
|
|
break;
|
|
case CMD_WIN:
|
|
wmove (win_info->generic.handle, 0, 0);
|
|
break;
|
|
case DATA_WIN:
|
|
win_info->detail.data_display_info.data_content =
|
|
(tui_win_content) NULL;
|
|
win_info->detail.data_display_info.data_content_count = 0;
|
|
win_info->detail.data_display_info.regs_content =
|
|
(tui_win_content) NULL;
|
|
win_info->detail.data_display_info.regs_content_count = 0;
|
|
win_info->detail.data_display_info.regs_column_count = 1;
|
|
win_info->detail.data_display_info.display_regs = FALSE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* Accessor for the source execution info ptr. */
|
|
struct tui_gen_win_info *
|
|
tui_source_exec_info_win_ptr (void)
|
|
{
|
|
return &exec_info[0];
|
|
}
|
|
|
|
|
|
/* Accessor for the disassem execution info ptr. */
|
|
struct tui_gen_win_info *
|
|
tui_disassem_exec_info_win_ptr (void)
|
|
{
|
|
return &exec_info[1];
|
|
}
|
|
|
|
|
|
/* Accessor for the locator win info. Answers a pointer to the static
|
|
locator win info struct. */
|
|
struct tui_gen_win_info *
|
|
tui_locator_win_info_ptr (void)
|
|
{
|
|
return &_locator;
|
|
}
|
|
|
|
|
|
/* Accessor for the term_height. */
|
|
int
|
|
tui_term_height (void)
|
|
{
|
|
return term_height;
|
|
}
|
|
|
|
|
|
/* Mutator for the term height. */
|
|
void
|
|
tui_set_term_height_to (int h)
|
|
{
|
|
term_height = h;
|
|
}
|
|
|
|
|
|
/* Accessor for the term_width. */
|
|
int
|
|
tui_term_width (void)
|
|
{
|
|
return term_width;
|
|
}
|
|
|
|
|
|
/* Mutator for the term_width. */
|
|
void
|
|
tui_set_term_width_to (int w)
|
|
{
|
|
term_width = w;
|
|
}
|
|
|
|
|
|
/* Accessor for the current layout. */
|
|
enum tui_layout_type
|
|
tui_current_layout (void)
|
|
{
|
|
return current_layout;
|
|
}
|
|
|
|
|
|
/* Mutator for the current layout. */
|
|
void
|
|
tui_set_current_layout_to (enum tui_layout_type new_layout)
|
|
{
|
|
current_layout = new_layout;
|
|
}
|
|
|
|
|
|
/*****************************
|
|
** OTHER PUBLIC FUNCTIONS
|
|
*****************************/
|
|
|
|
|
|
/* Answer the next window in the list, cycling back to the top if
|
|
necessary. */
|
|
struct tui_win_info *
|
|
tui_next_win (struct tui_win_info *cur_win)
|
|
{
|
|
int type = cur_win->generic.type;
|
|
struct tui_win_info *next_win = (struct tui_win_info *) NULL;
|
|
|
|
if (cur_win->generic.type == CMD_WIN)
|
|
type = SRC_WIN;
|
|
else
|
|
type = cur_win->generic.type + 1;
|
|
while (type != cur_win->generic.type && (next_win == NULL))
|
|
{
|
|
if (tui_win_list[type]
|
|
&& tui_win_list[type]->generic.is_visible)
|
|
next_win = tui_win_list[type];
|
|
else
|
|
{
|
|
if (type == CMD_WIN)
|
|
type = SRC_WIN;
|
|
else
|
|
type++;
|
|
}
|
|
}
|
|
|
|
return next_win;
|
|
}
|
|
|
|
|
|
/* Answer the prev window in the list, cycling back to the bottom if
|
|
necessary. */
|
|
struct tui_win_info *
|
|
tui_prev_win (struct tui_win_info *cur_win)
|
|
{
|
|
int type = cur_win->generic.type;
|
|
struct tui_win_info *prev = (struct tui_win_info *) NULL;
|
|
|
|
if (cur_win->generic.type == SRC_WIN)
|
|
type = CMD_WIN;
|
|
else
|
|
type = cur_win->generic.type - 1;
|
|
while (type != cur_win->generic.type && (prev == NULL))
|
|
{
|
|
if (tui_win_list[type]
|
|
&& tui_win_list[type]->generic.is_visible)
|
|
prev = tui_win_list[type];
|
|
else
|
|
{
|
|
if (type == SRC_WIN)
|
|
type = CMD_WIN;
|
|
else
|
|
type--;
|
|
}
|
|
}
|
|
|
|
return prev;
|
|
}
|
|
|
|
|
|
/* Answer the window represented by name. */
|
|
struct tui_win_info *
|
|
tui_partial_win_by_name (char *name)
|
|
{
|
|
struct tui_win_info *win_info = (struct tui_win_info *) NULL;
|
|
|
|
if (name != (char *) NULL)
|
|
{
|
|
int i = 0;
|
|
|
|
while (i < MAX_MAJOR_WINDOWS && win_info == NULL)
|
|
{
|
|
if (tui_win_list[i] != 0)
|
|
{
|
|
const char *cur_name =
|
|
tui_win_name (&tui_win_list[i]->generic);
|
|
|
|
if (strlen (name) <= strlen (cur_name)
|
|
&& startswith (cur_name, name))
|
|
win_info = tui_win_list[i];
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
return win_info;
|
|
}
|
|
|
|
|
|
/* Answer the name of the window. */
|
|
const char *
|
|
tui_win_name (const struct tui_gen_win_info *win_info)
|
|
{
|
|
char *name = (char *) NULL;
|
|
|
|
switch (win_info->type)
|
|
{
|
|
case SRC_WIN:
|
|
name = SRC_NAME;
|
|
break;
|
|
case CMD_WIN:
|
|
name = CMD_NAME;
|
|
break;
|
|
case DISASSEM_WIN:
|
|
name = DISASSEM_NAME;
|
|
break;
|
|
case DATA_WIN:
|
|
name = DATA_NAME;
|
|
break;
|
|
default:
|
|
name = "";
|
|
break;
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
|
|
void
|
|
tui_initialize_static_data (void)
|
|
{
|
|
tui_init_generic_part (tui_source_exec_info_win_ptr ());
|
|
tui_init_generic_part (tui_disassem_exec_info_win_ptr ());
|
|
tui_init_generic_part (tui_locator_win_info_ptr ());
|
|
}
|
|
|
|
|
|
struct tui_gen_win_info *
|
|
tui_alloc_generic_win_info (void)
|
|
{
|
|
struct tui_gen_win_info *win = XNEW (struct tui_gen_win_info);
|
|
|
|
if (win != NULL)
|
|
tui_init_generic_part (win);
|
|
|
|
return win;
|
|
}
|
|
|
|
|
|
void
|
|
tui_init_generic_part (struct tui_gen_win_info *win)
|
|
{
|
|
win->width =
|
|
win->height =
|
|
win->origin.x =
|
|
win->origin.y =
|
|
win->viewport_height =
|
|
win->content_size =
|
|
win->last_visible_line = 0;
|
|
win->handle = (WINDOW *) NULL;
|
|
win->content = NULL;
|
|
win->content_in_use =
|
|
win->is_visible = FALSE;
|
|
win->title = 0;
|
|
}
|
|
|
|
|
|
/* init_content_element().
|
|
*/
|
|
static void
|
|
init_content_element (struct tui_win_element *element,
|
|
enum tui_win_type type)
|
|
{
|
|
element->highlight = FALSE;
|
|
switch (type)
|
|
{
|
|
case SRC_WIN:
|
|
case DISASSEM_WIN:
|
|
element->which_element.source.line = (char *) NULL;
|
|
element->which_element.source.line_or_addr.loa = LOA_LINE;
|
|
element->which_element.source.line_or_addr.u.line_no = 0;
|
|
element->which_element.source.is_exec_point = FALSE;
|
|
element->which_element.source.has_break = FALSE;
|
|
break;
|
|
case DATA_WIN:
|
|
tui_init_generic_part (&element->which_element.data_window);
|
|
element->which_element.data_window.type = DATA_ITEM_WIN;
|
|
element->which_element.data_window.content =
|
|
tui_alloc_content (1, DATA_ITEM_WIN);
|
|
element->which_element.data_window.content_size = 1;
|
|
break;
|
|
case CMD_WIN:
|
|
element->which_element.command.line = (char *) NULL;
|
|
break;
|
|
case DATA_ITEM_WIN:
|
|
element->which_element.data.name = (char *) NULL;
|
|
element->which_element.data.type = TUI_REGISTER;
|
|
element->which_element.data.item_no = UNDEFINED_ITEM;
|
|
element->which_element.data.value = NULL;
|
|
element->which_element.data.highlight = FALSE;
|
|
element->which_element.data.content = (char*) NULL;
|
|
break;
|
|
case LOCATOR_WIN:
|
|
element->which_element.locator.full_name[0] =
|
|
element->which_element.locator.proc_name[0] = (char) 0;
|
|
element->which_element.locator.line_no = 0;
|
|
element->which_element.locator.addr = 0;
|
|
break;
|
|
case EXEC_INFO_WIN:
|
|
memset(element->which_element.simple_string, ' ',
|
|
sizeof(element->which_element.simple_string));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
init_win_info (struct tui_win_info *win_info)
|
|
{
|
|
tui_init_generic_part (&win_info->generic);
|
|
win_info->can_highlight =
|
|
win_info->is_highlighted = FALSE;
|
|
switch (win_info->generic.type)
|
|
{
|
|
case SRC_WIN:
|
|
case DISASSEM_WIN:
|
|
win_info->detail.source_info.execution_info
|
|
= (struct tui_gen_win_info *) NULL;
|
|
win_info->detail.source_info.has_locator = FALSE;
|
|
win_info->detail.source_info.horizontal_offset = 0;
|
|
win_info->detail.source_info.gdbarch = NULL;
|
|
win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
|
|
win_info->detail.source_info.start_line_or_addr.u.addr = 0;
|
|
win_info->detail.source_info.fullname = NULL;
|
|
break;
|
|
case DATA_WIN:
|
|
win_info->detail.data_display_info.data_content = (tui_win_content) NULL;
|
|
win_info->detail.data_display_info.data_content_count = 0;
|
|
win_info->detail.data_display_info.regs_content = (tui_win_content) NULL;
|
|
win_info->detail.data_display_info.regs_content_count = 0;
|
|
win_info->detail.data_display_info.regs_column_count = 1;
|
|
win_info->detail.data_display_info.display_regs = FALSE;
|
|
win_info->detail.data_display_info.current_group = 0;
|
|
break;
|
|
case CMD_WIN:
|
|
break;
|
|
default:
|
|
win_info->detail.opaque = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
struct tui_win_info *
|
|
tui_alloc_win_info (enum tui_win_type type)
|
|
{
|
|
struct tui_win_info *win_info = XNEW (struct tui_win_info);
|
|
|
|
if (win_info != NULL)
|
|
{
|
|
win_info->generic.type = type;
|
|
init_win_info (win_info);
|
|
}
|
|
|
|
return win_info;
|
|
}
|
|
|
|
|
|
/* Allocates the content and elements in a block. */
|
|
tui_win_content
|
|
tui_alloc_content (int num_elements, enum tui_win_type type)
|
|
{
|
|
tui_win_content content;
|
|
char *element_block_ptr;
|
|
int i;
|
|
|
|
content = XNEWVEC (struct tui_win_element *, num_elements);
|
|
if (content != NULL)
|
|
{
|
|
/*
|
|
* All windows, except the data window, can allocate the
|
|
* elements in a chunk. The data window cannot because items
|
|
* can be added/removed from the data display by the user at any
|
|
* time.
|
|
*/
|
|
if (type != DATA_WIN)
|
|
{
|
|
element_block_ptr =
|
|
xmalloc (sizeof (struct tui_win_element) * num_elements);
|
|
if (element_block_ptr != NULL)
|
|
{
|
|
for (i = 0; i < num_elements; i++)
|
|
{
|
|
content[i] = (struct tui_win_element *) element_block_ptr;
|
|
init_content_element (content[i], type);
|
|
element_block_ptr += sizeof (struct tui_win_element);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xfree (content);
|
|
content = (tui_win_content) NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
return content;
|
|
}
|
|
|
|
|
|
/* Adds the input number of elements to the windows's content. If no
|
|
content has been allocated yet, alloc_content() is called to do
|
|
this. The index of the first element added is returned, unless
|
|
there is a memory allocation error, in which case, (-1) is
|
|
returned. */
|
|
int
|
|
tui_add_content_elements (struct tui_gen_win_info *win_info,
|
|
int num_elements)
|
|
{
|
|
struct tui_win_element *element_ptr;
|
|
int i, index_start;
|
|
|
|
if (win_info->content == NULL)
|
|
{
|
|
win_info->content = tui_alloc_content (num_elements, win_info->type);
|
|
index_start = 0;
|
|
}
|
|
else
|
|
index_start = win_info->content_size;
|
|
if (win_info->content != NULL)
|
|
{
|
|
for (i = index_start; (i < num_elements + index_start); i++)
|
|
{
|
|
element_ptr = XNEW (struct tui_win_element);
|
|
if (element_ptr != NULL)
|
|
{
|
|
win_info->content[i] = (void *) element_ptr;
|
|
init_content_element (element_ptr, win_info->type);
|
|
win_info->content_size++;
|
|
}
|
|
else /* Things must be really hosed now! We ran out of
|
|
memory!? */
|
|
return (-1);
|
|
}
|
|
}
|
|
|
|
return index_start;
|
|
}
|
|
|
|
|
|
/* Delete all curses windows associated with win_info, leaving
|
|
everything else intact. */
|
|
void
|
|
tui_del_window (struct tui_win_info *win_info)
|
|
{
|
|
struct tui_gen_win_info *generic_win;
|
|
|
|
switch (win_info->generic.type)
|
|
{
|
|
case SRC_WIN:
|
|
case DISASSEM_WIN:
|
|
generic_win = tui_locator_win_info_ptr ();
|
|
if (generic_win != (struct tui_gen_win_info *) NULL)
|
|
{
|
|
tui_delete_win (generic_win->handle);
|
|
generic_win->handle = (WINDOW *) NULL;
|
|
generic_win->is_visible = FALSE;
|
|
}
|
|
if (win_info->detail.source_info.fullname)
|
|
{
|
|
xfree (win_info->detail.source_info.fullname);
|
|
win_info->detail.source_info.fullname = NULL;
|
|
}
|
|
generic_win = win_info->detail.source_info.execution_info;
|
|
if (generic_win != (struct tui_gen_win_info *) NULL)
|
|
{
|
|
tui_delete_win (generic_win->handle);
|
|
generic_win->handle = (WINDOW *) NULL;
|
|
generic_win->is_visible = FALSE;
|
|
}
|
|
break;
|
|
case DATA_WIN:
|
|
if (win_info->generic.content != NULL)
|
|
{
|
|
tui_del_data_windows (win_info->detail.data_display_info.regs_content,
|
|
win_info->detail.data_display_info.regs_content_count);
|
|
tui_del_data_windows (win_info->detail.data_display_info.data_content,
|
|
win_info->detail.data_display_info.data_content_count);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (win_info->generic.handle != (WINDOW *) NULL)
|
|
{
|
|
tui_delete_win (win_info->generic.handle);
|
|
win_info->generic.handle = (WINDOW *) NULL;
|
|
win_info->generic.is_visible = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
tui_free_window (struct tui_win_info *win_info)
|
|
{
|
|
struct tui_gen_win_info *generic_win;
|
|
|
|
switch (win_info->generic.type)
|
|
{
|
|
case SRC_WIN:
|
|
case DISASSEM_WIN:
|
|
if (win_info->detail.source_info.fullname)
|
|
{
|
|
xfree (win_info->detail.source_info.fullname);
|
|
win_info->detail.source_info.fullname = NULL;
|
|
}
|
|
generic_win = win_info->detail.source_info.execution_info;
|
|
if (generic_win != (struct tui_gen_win_info *) NULL)
|
|
{
|
|
tui_delete_win (generic_win->handle);
|
|
generic_win->handle = (WINDOW *) NULL;
|
|
tui_free_win_content (generic_win);
|
|
}
|
|
break;
|
|
case DATA_WIN:
|
|
if (win_info->generic.content != NULL)
|
|
{
|
|
tui_free_data_content (win_info->detail.data_display_info.regs_content,
|
|
win_info->detail.data_display_info.regs_content_count);
|
|
win_info->detail.data_display_info.regs_content =
|
|
(tui_win_content) NULL;
|
|
win_info->detail.data_display_info.regs_content_count = 0;
|
|
tui_free_data_content (win_info->detail.data_display_info.data_content,
|
|
win_info->detail.data_display_info.data_content_count);
|
|
win_info->detail.data_display_info.data_content =
|
|
(tui_win_content) NULL;
|
|
win_info->detail.data_display_info.data_content_count = 0;
|
|
win_info->detail.data_display_info.regs_column_count = 1;
|
|
win_info->detail.data_display_info.display_regs = FALSE;
|
|
win_info->generic.content = NULL;
|
|
win_info->generic.content_size = 0;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (win_info->generic.handle != (WINDOW *) NULL)
|
|
{
|
|
tui_delete_win (win_info->generic.handle);
|
|
win_info->generic.handle = (WINDOW *) NULL;
|
|
tui_free_win_content (&win_info->generic);
|
|
}
|
|
if (win_info->generic.title)
|
|
xfree (win_info->generic.title);
|
|
xfree (win_info);
|
|
}
|
|
|
|
|
|
void
|
|
tui_free_all_source_wins_content (void)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < (tui_source_windows ())->count; i++)
|
|
{
|
|
struct tui_win_info *win_info = (tui_source_windows ())->list[i];
|
|
|
|
if (win_info != NULL)
|
|
{
|
|
tui_free_win_content (&(win_info->generic));
|
|
tui_free_win_content (win_info->detail.source_info.execution_info);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
tui_free_win_content (struct tui_gen_win_info *win_info)
|
|
{
|
|
if (win_info->content != NULL)
|
|
{
|
|
free_content ((tui_win_content) win_info->content,
|
|
win_info->content_size,
|
|
win_info->type);
|
|
win_info->content = NULL;
|
|
}
|
|
win_info->content_size = 0;
|
|
}
|
|
|
|
|
|
void
|
|
tui_del_data_windows (tui_win_content content,
|
|
int content_size)
|
|
{
|
|
int i;
|
|
|
|
/* Remember that data window content elements are of type struct
|
|
tui_gen_win_info *, each of which whose single element is a data
|
|
element. */
|
|
for (i = 0; i < content_size; i++)
|
|
{
|
|
struct tui_gen_win_info *generic_win
|
|
= &content[i]->which_element.data_window;
|
|
|
|
if (generic_win != (struct tui_gen_win_info *) NULL)
|
|
{
|
|
tui_delete_win (generic_win->handle);
|
|
generic_win->handle = (WINDOW *) NULL;
|
|
generic_win->is_visible = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
tui_free_data_content (tui_win_content content,
|
|
int content_size)
|
|
{
|
|
int i;
|
|
|
|
/* Remember that data window content elements are of type struct
|
|
tui_gen_win_info *, each of which whose single element is a data
|
|
element. */
|
|
for (i = 0; i < content_size; i++)
|
|
{
|
|
struct tui_gen_win_info *generic_win
|
|
= &content[i]->which_element.data_window;
|
|
|
|
if (generic_win != (struct tui_gen_win_info *) NULL)
|
|
{
|
|
tui_delete_win (generic_win->handle);
|
|
generic_win->handle = (WINDOW *) NULL;
|
|
tui_free_win_content (generic_win);
|
|
}
|
|
}
|
|
free_content (content,
|
|
content_size,
|
|
DATA_WIN);
|
|
}
|
|
|
|
|
|
/**********************************
|
|
** LOCAL STATIC FUNCTIONS **
|
|
**********************************/
|
|
|
|
|
|
static void
|
|
free_content (tui_win_content content,
|
|
int content_size,
|
|
enum tui_win_type win_type)
|
|
{
|
|
if (content != (tui_win_content) NULL)
|
|
{
|
|
free_content_elements (content, content_size, win_type);
|
|
xfree (content);
|
|
}
|
|
}
|
|
|
|
|
|
/* free_content_elements().
|
|
*/
|
|
static void
|
|
free_content_elements (tui_win_content content,
|
|
int content_size,
|
|
enum tui_win_type type)
|
|
{
|
|
if (content != (tui_win_content) NULL)
|
|
{
|
|
int i;
|
|
|
|
if (type == SRC_WIN || type == DISASSEM_WIN)
|
|
{
|
|
/* Free whole source block. */
|
|
xfree (content[0]->which_element.source.line);
|
|
}
|
|
else
|
|
{
|
|
for (i = 0; i < content_size; i++)
|
|
{
|
|
struct tui_win_element *element;
|
|
|
|
element = content[i];
|
|
if (element != (struct tui_win_element *) NULL)
|
|
{
|
|
switch (type)
|
|
{
|
|
case DATA_WIN:
|
|
xfree (element);
|
|
break;
|
|
case DATA_ITEM_WIN:
|
|
/* Note that data elements are not allocated in
|
|
a single block, but individually, as
|
|
needed. */
|
|
if (element->which_element.data.type != TUI_REGISTER)
|
|
xfree ((void *)element->which_element.data.name);
|
|
xfree (element->which_element.data.value);
|
|
xfree (element->which_element.data.content);
|
|
xfree (element);
|
|
break;
|
|
case CMD_WIN:
|
|
xfree (element->which_element.command.line);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (type != DATA_WIN && type != DATA_ITEM_WIN)
|
|
xfree (content[0]); /* Free the element block. */
|
|
}
|
|
}
|