⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tui-winsource.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
				       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 + -