📄 tui-winsource.c
字号:
win_info->generic.content[0])->which_element.source.line_or_addr, FALSE); } return;}/* Set or clear the has_break flag in the line whose line is line_no. */voidtui_set_is_exec_point_at (union tui_line_or_address l, struct tui_win_info * win_info){ int changed = 0; int i; tui_win_content content = (tui_win_content) win_info->generic.content; i = 0; while (i < win_info->generic.content_size) { int new_state; if (content[i]->which_element.source.line_or_addr.addr == l.addr) new_state = TRUE; else new_state = FALSE; if (new_state != content[i]->which_element.source.is_exec_point) { changed++; content[i]->which_element.source.is_exec_point = new_state; tui_show_source_line (win_info, i + 1); } i++; } if (changed) tui_refresh_win (&win_info->generic);}/* Update the execution windows to show the active breakpoints. This is called whenever a breakpoint is inserted, removed or has its state changed. */voidtui_update_all_breakpoint_info (void){ struct tui_list *list = tui_source_windows (); int i; for (i = 0; i < list->count; i++) { struct tui_win_info * win = (struct tui_win_info *) list->list[i]; if (tui_update_breakpoint_info (win, FALSE)) { tui_update_exec_info (win); } }}/* Scan the source window and the breakpoints to update the has_break information for each line. Returns 1 if something changed and the execution window must be refreshed. */inttui_update_breakpoint_info (struct tui_win_info * win, int current_only){ int i; int need_refresh = 0; struct tui_source_info * src = &win->detail.source_info; for (i = 0; i < win->generic.content_size; i++) { struct breakpoint *bp; extern struct breakpoint *breakpoint_chain; int mode; struct tui_source_element* line; line = &((struct tui_win_element *) win->generic.content[i])->which_element.source; if (current_only && !line->is_exec_point) continue; /* Scan each breakpoint to see if the current line has something to do with it. Identify enable/disabled breakpoints as well as those that we already hit. */ mode = 0; for (bp = breakpoint_chain; bp != (struct breakpoint *) NULL; bp = bp->next) { if ((win == TUI_SRC_WIN && bp->source_file && (strcmp (src->filename, bp->source_file) == 0) && bp->line_number == line->line_or_addr.line_no) || (win == TUI_DISASM_WIN && bp->loc->address == line->line_or_addr.addr)) { if (bp->enable_state == bp_disabled) mode |= TUI_BP_DISABLED; else mode |= TUI_BP_ENABLED; if (bp->hit_count) mode |= TUI_BP_HIT; if (bp->cond) mode |= TUI_BP_CONDITIONAL; if (bp->type == bp_hardware_breakpoint) mode |= TUI_BP_HARDWARE; } } if (line->has_break != mode) { line->has_break = mode; need_refresh = 1; } } return need_refresh;}/* Function to initialize the content of the execution info window, based upon the input window which is either the source or disassembly window. */enum tui_statustui_set_exec_info_content (struct tui_win_info * win_info){ enum tui_status ret = TUI_SUCCESS; if (win_info->detail.source_info.execution_info != (struct tui_gen_win_info *) NULL) { struct tui_gen_win_info * exec_info_ptr = win_info->detail.source_info.execution_info; if (exec_info_ptr->content == NULL) exec_info_ptr->content = (void **) tui_alloc_content (win_info->generic.height, exec_info_ptr->type); if (exec_info_ptr->content != NULL) { int i; tui_update_breakpoint_info (win_info, 1); for (i = 0; i < win_info->generic.content_size; i++) { struct tui_win_element * element; struct tui_win_element * src_element; int mode; element = (struct tui_win_element *) exec_info_ptr->content[i]; src_element = (struct tui_win_element *) win_info->generic.content[i]; memset(element->which_element.simple_string, ' ', sizeof(element->which_element.simple_string)); element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0; /* Now update the exec info content based upon the state of each line as indicated by the source content. */ mode = src_element->which_element.source.has_break; if (mode & TUI_BP_HIT) element->which_element.simple_string[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B'; else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED)) element->which_element.simple_string[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b'; if (mode & TUI_BP_ENABLED) element->which_element.simple_string[TUI_BP_BREAK_POS] = '+'; else if (mode & TUI_BP_DISABLED) element->which_element.simple_string[TUI_BP_BREAK_POS] = '-'; if (src_element->which_element.source.is_exec_point) element->which_element.simple_string[TUI_EXEC_POS] = '>'; } exec_info_ptr->content_size = win_info->generic.content_size; } else ret = TUI_FAILURE; } return ret;}voidtui_show_exec_info_content (struct tui_win_info * win_info){ struct tui_gen_win_info * exec_info = win_info->detail.source_info.execution_info; int cur_line; werase (exec_info->handle); tui_refresh_win (exec_info); for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++) mvwaddstr (exec_info->handle, cur_line, 0, ((struct tui_win_element *) exec_info->content[cur_line - 1])->which_element.simple_string); tui_refresh_win (exec_info); exec_info->content_in_use = TRUE;}voidtui_erase_exec_info_content (struct tui_win_info * win_info){ struct tui_gen_win_info * exec_info = win_info->detail.source_info.execution_info; werase (exec_info->handle); tui_refresh_win (exec_info);}voidtui_clear_exec_info_content (struct tui_win_info * win_info){ win_info->detail.source_info.execution_info->content_in_use = FALSE; tui_erase_exec_info_content (win_info); return;}/* Function to update the execution info window. */voidtui_update_exec_info (struct tui_win_info * win_info){ tui_set_exec_info_content (win_info); tui_show_exec_info_content (win_info);}enum tui_statustui_alloc_source_buffer (struct tui_win_info *win_info){ char *src_line_buf; int i, line_width, max_lines; enum tui_status ret = TUI_FAILURE; max_lines = win_info->generic.height; /* less the highlight box */ line_width = win_info->generic.width - 1; /* ** Allocate the buffer for the source lines. Do this only once since they ** will be re-used for all source displays. The only other time this will ** be done is when a window's size changes. */ if (win_info->generic.content == NULL) { src_line_buf = (char *) xmalloc ((max_lines * line_width) * sizeof (char)); if (src_line_buf == (char *) NULL) fputs_unfiltered ( "Unable to Allocate Memory for Source or Disassembly Display.\n", gdb_stderr); else { /* allocate the content list */ if ((win_info->generic.content = (void **) tui_alloc_content (max_lines, SRC_WIN)) == NULL) { xfree (src_line_buf); src_line_buf = (char *) NULL; fputs_unfiltered ( "Unable to Allocate Memory for Source or Disassembly Display.\n", gdb_stderr); } } for (i = 0; i < max_lines; i++) ((struct tui_win_element *) win_info->generic.content[i])->which_element.source.line = src_line_buf + (line_width * i); ret = TUI_SUCCESS; } else ret = TUI_SUCCESS; return ret;}/* Answer whether the a particular line number or address is displayed in the current source window. */inttui_line_is_displayed (int line, struct tui_win_info * win_info, int check_threshold){ int is_displayed = FALSE; int i, threshold; if (check_threshold) threshold = SCROLL_THRESHOLD; else threshold = 0; i = 0; while (i < win_info->generic.content_size - threshold && !is_displayed) { is_displayed = (((struct tui_win_element *) win_info->generic.content[i])->which_element.source.line_or_addr.line_no == (int) line); i++; } return is_displayed;}/* Answer whether the a particular line number or address is displayed in the current source window. */inttui_addr_is_displayed (CORE_ADDR addr, struct tui_win_info * win_info, int check_threshold){ int is_displayed = FALSE; int i, threshold; if (check_threshold) threshold = SCROLL_THRESHOLD; else threshold = 0; i = 0; while (i < win_info->generic.content_size - threshold && !is_displayed) { is_displayed = (((struct tui_win_element *) win_info->generic.content[i])->which_element.source.line_or_addr.addr == addr); i++; } return is_displayed;}/******************************************* STATIC LOCAL FUNCTIONS ********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -