📄 tuisourcewin.c
字号:
} winInfo->detail.sourceInfo.horizontalOffset = offset; tuiUpdateSourceWindowAsIs ( winInfo, s, ((TuiWinElementPtr) winInfo->generic.content[0])->whichElement.source.lineOrAddr, FALSE); } return;} /* tuiHorizontalSourceScroll *//* Set or clear the hasBreak flag in the line whose line is lineNo. */voidtuiSetIsExecPointAt (TuiLineOrAddress l, TuiWinInfoPtr winInfo){ int changed = 0; int i; TuiWinContent content = (TuiWinContent) winInfo->generic.content; i = 0; while (i < winInfo->generic.contentSize) { int newState; if (content[i]->whichElement.source.lineOrAddr.addr == l.addr) newState = TRUE; else newState = FALSE; if (newState != content[i]->whichElement.source.isExecPoint) { changed++; content[i]->whichElement.source.isExecPoint = newState; tui_show_source_line (winInfo, i + 1); } i++; } if (changed) tuiRefreshWin (&winInfo->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 (){ TuiList* list = sourceWindows (); int i; for (i = 0; i < list->count; i++) { TuiWinInfoPtr win = (TuiWinInfoPtr) list->list[i]; if (tui_update_breakpoint_info (win, FALSE)) { tuiUpdateExecInfo (win); } }}/* Scan the source window and the breakpoints to update the hasBreak information for each line. Returns 1 if something changed and the execution window must be refreshed. */inttui_update_breakpoint_info (TuiWinInfoPtr win, int current_only){ int i; int need_refresh = 0; TuiSourceInfoPtr src = &win->detail.sourceInfo; for (i = 0; i < win->generic.contentSize; i++) { struct breakpoint *bp; extern struct breakpoint *breakpoint_chain; int mode; TuiSourceElement* line; line = &((TuiWinElementPtr) win->generic.content[i])->whichElement.source; if (current_only && !line->isExecPoint) 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 == srcWin && bp->source_file && (strcmp (src->filename, bp->source_file) == 0) && bp->line_number == line->lineOrAddr.lineNo) || (win == disassemWin && bp->address == line->lineOrAddr.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->hasBreak != mode) { line->hasBreak = mode; need_refresh = 1; } } return need_refresh;}/* ** tuiSetExecInfoContent(). ** Function to initialize the content of the execution info window, ** based upon the input window which is either the source or ** disassembly window. */TuiStatustuiSetExecInfoContent (TuiWinInfoPtr winInfo){ TuiStatus ret = TUI_SUCCESS; if (winInfo->detail.sourceInfo.executionInfo != (TuiGenWinInfoPtr) NULL) { TuiGenWinInfoPtr execInfoPtr = winInfo->detail.sourceInfo.executionInfo; if (execInfoPtr->content == (OpaquePtr) NULL) execInfoPtr->content = (OpaquePtr) allocContent (winInfo->generic.height, execInfoPtr->type); if (execInfoPtr->content != (OpaquePtr) NULL) { int i; tui_update_breakpoint_info (winInfo, 1); for (i = 0; i < winInfo->generic.contentSize; i++) { TuiWinElementPtr element; TuiWinElementPtr srcElement; int mode; element = (TuiWinElementPtr) execInfoPtr->content[i]; srcElement = (TuiWinElementPtr) winInfo->generic.content[i]; memset(element->whichElement.simpleString, ' ', sizeof(element->whichElement.simpleString)); element->whichElement.simpleString[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 = srcElement->whichElement.source.hasBreak; if (mode & TUI_BP_HIT) element->whichElement.simpleString[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B'; else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED)) element->whichElement.simpleString[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b'; if (mode & TUI_BP_ENABLED) element->whichElement.simpleString[TUI_BP_BREAK_POS] = '+'; else if (mode & TUI_BP_DISABLED) element->whichElement.simpleString[TUI_BP_BREAK_POS] = '-'; if (srcElement->whichElement.source.isExecPoint) element->whichElement.simpleString[TUI_EXEC_POS] = '>'; } execInfoPtr->contentSize = winInfo->generic.contentSize; } else ret = TUI_FAILURE; } return ret;}/* ** tuiShowExecInfoContent(). */voidtuiShowExecInfoContent (TuiWinInfoPtr winInfo){ TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo; int curLine; werase (execInfo->handle); tuiRefreshWin (execInfo); for (curLine = 1; (curLine <= execInfo->contentSize); curLine++) mvwaddstr (execInfo->handle, curLine, 0, ((TuiWinElementPtr) execInfo->content[curLine - 1])->whichElement.simpleString); tuiRefreshWin (execInfo); execInfo->contentInUse = TRUE; return;} /* tuiShowExecInfoContent *//* ** tuiEraseExecInfoContent(). */voidtuiEraseExecInfoContent (TuiWinInfoPtr winInfo){ TuiGenWinInfoPtr execInfo = winInfo->detail.sourceInfo.executionInfo; werase (execInfo->handle); tuiRefreshWin (execInfo); return;} /* tuiEraseExecInfoContent *//* ** tuiClearExecInfoContent(). */voidtuiClearExecInfoContent (TuiWinInfoPtr winInfo){ winInfo->detail.sourceInfo.executionInfo->contentInUse = FALSE; tuiEraseExecInfoContent (winInfo); return;} /* tuiClearExecInfoContent *//* ** tuiUpdateExecInfo(). ** Function to update the execution info window */voidtuiUpdateExecInfo (TuiWinInfoPtr winInfo){ tuiSetExecInfoContent (winInfo); tuiShowExecInfoContent (winInfo);} /* tuiUpdateExecInfo */TuiStatustuiAllocSourceBuffer (TuiWinInfoPtr winInfo){ register char *srcLineBuf; register int i, lineWidth, maxLines; TuiStatus ret = TUI_FAILURE; maxLines = winInfo->generic.height; /* less the highlight box */ lineWidth = winInfo->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 (winInfo->generic.content == (OpaquePtr) NULL) { srcLineBuf = (char *) xmalloc ((maxLines * lineWidth) * sizeof (char)); if (srcLineBuf == (char *) NULL) fputs_unfiltered ( "Unable to Allocate Memory for Source or Disassembly Display.\n", gdb_stderr); else { /* allocate the content list */ if ((winInfo->generic.content = (OpaquePtr) allocContent (maxLines, SRC_WIN)) == (OpaquePtr) NULL) { tuiFree (srcLineBuf); srcLineBuf = (char *) NULL; fputs_unfiltered ( "Unable to Allocate Memory for Source or Disassembly Display.\n", gdb_stderr); } } for (i = 0; i < maxLines; i++) ((TuiWinElementPtr) winInfo->generic.content[i])->whichElement.source.line = srcLineBuf + (lineWidth * i); ret = TUI_SUCCESS; } else ret = TUI_SUCCESS; return ret;} /* tuiAllocSourceBuffer *//* ** tuiLineIsDisplayed(). ** Answer whether the a particular line number or address is displayed ** in the current source window. */inttuiLineIsDisplayed (int line, TuiWinInfoPtr winInfo, int checkThreshold){ int isDisplayed = FALSE; int i, threshold; if (checkThreshold) threshold = SCROLL_THRESHOLD; else threshold = 0; i = 0; while (i < winInfo->generic.contentSize - threshold && !isDisplayed) { isDisplayed = (((TuiWinElementPtr) winInfo->generic.content[i])->whichElement.source.lineOrAddr.lineNo == (int) line); i++; } return isDisplayed;} /* tuiLineIsDisplayed *//* ** tuiLineIsDisplayed(). ** Answer whether the a particular line number or address is displayed ** in the current source window. */inttuiAddrIsDisplayed (CORE_ADDR addr, TuiWinInfoPtr winInfo, int checkThreshold){ int isDisplayed = FALSE; int i, threshold; if (checkThreshold) threshold = SCROLL_THRESHOLD; else threshold = 0; i = 0; while (i < winInfo->generic.contentSize - threshold && !isDisplayed) { isDisplayed = (((TuiWinElementPtr) winInfo->generic.content[i])->whichElement.source.lineOrAddr.addr == addr); i++; } return isDisplayed;}/******************************************* STATIC LOCAL FUNCTIONS ********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -