📄 tui-data.c
字号:
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(). */voidinit_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.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; ((struct tui_gen_win_info *) & element->which_element.data_window)->content = (void **) tui_alloc_content (1, DATA_ITEM_WIN); ((struct tui_gen_win_info *) & 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.file_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; }}voidinit_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.start_line_or_addr.addr = 0; win_info->detail.source_info.filename = 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_display_type = TUI_UNDEFINED_REGS; 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: win_info->detail.command_info.cur_line = 0; win_info->detail.command_info.curch = 0; 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 = (struct tui_win_info *) NULL; win_info = (struct tui_win_info *) xmalloc (sizeof (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_contenttui_alloc_content (int num_elements, enum tui_win_type type){ tui_win_content content = (tui_win_content) NULL; char *element_block_ptr = (char *) NULL; int i; if ((content = (tui_win_content) xmalloc (sizeof (struct tui_win_element *) * num_elements)) != (tui_win_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) { if ((element_block_ptr = (char *) xmalloc (sizeof (struct tui_win_element) * num_elements)) != (char *) 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. */inttui_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 = (void **) 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++) { if ((element_ptr = (struct tui_win_element *) xmalloc (sizeof (struct tui_win_element))) != (struct tui_win_element *) 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. */voidtui_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.filename) { xfree (win_info->detail.source_info.filename); win_info->detail.source_info.filename = 0; } 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; }}voidtui_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: 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; } tui_free_win_content (generic_win); if (win_info->detail.source_info.filename) { xfree (win_info->detail.source_info.filename); win_info->detail.source_info.filename = 0; } 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_display_type = TUI_UNDEFINED_REGS; 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);}voidtui_free_all_source_wins_content (void){ int i; for (i = 0; i < (tui_source_windows ())->count; i++) { struct tui_win_info * win_info = (struct tui_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); } }}voidtui_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;}voidtui_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; } }}voidtui_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 voidfree_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 voidfree_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 */ }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -