Ejemplo n.º 1
0
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 = 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 = NULL;
      tui_free_win_content (&win_info->generic);
    }
  if (win_info->generic.title)
    xfree (win_info->generic.title);
  xfree (win_info);
}
Ejemplo n.º 2
0
static enum tui_status
tui_show_register_group (struct reggroup *group,
                         struct frame_info *frame,
                         int refresh_values_only)
{
    struct gdbarch *gdbarch = get_frame_arch (frame);
    enum tui_status ret = TUI_FAILURE;
    int nr_regs;
    int allocated_here = FALSE;
    int regnum, pos;
    char title[80];
    struct tui_data_info *display_info = &TUI_DATA_WIN->detail.data_display_info;

    /* Make a new title showing which group we display.  */
    snprintf (title, sizeof (title) - 1, "Register group: %s",
    reggroup_name (group));
    xfree (TUI_DATA_WIN->generic.title);
    TUI_DATA_WIN->generic.title = xstrdup (title);

    /* See how many registers must be displayed.  */
    nr_regs = 0;
    for (regnum = 0;
    regnum < gdbarch_num_regs (gdbarch)
    + gdbarch_num_pseudo_regs (gdbarch);
    regnum++)
    {
        const char *name;

        /* Must be in the group.  */
        if (!gdbarch_register_reggroup_p (gdbarch, regnum, group))
            continue;

        /* If the register name is empty, it is undefined for this
        processor, so don't display anything.  */
        name = gdbarch_register_name (gdbarch, regnum);
        if (name == 0 || *name == '\0')
            continue;

        nr_regs++;
    }

    if (display_info->regs_content_count > 0 && !refresh_values_only)
    {
        tui_free_data_content (display_info->regs_content,
        display_info->regs_content_count);
        display_info->regs_content_count = 0;
    }

    if (display_info->regs_content_count <= 0)
    {
        display_info->regs_content = tui_alloc_content (nr_regs, DATA_WIN);
        allocated_here = TRUE;
        refresh_values_only = FALSE;
    }

    if (display_info->regs_content != (tui_win_content) NULL)
    {
        if (!refresh_values_only || allocated_here)
        {
            TUI_DATA_WIN->generic.content = (void*) NULL;
            TUI_DATA_WIN->generic.content_size = 0;
            tui_add_content_elements (&TUI_DATA_WIN->generic, nr_regs);
            display_info->regs_content
            = (tui_win_content) TUI_DATA_WIN->generic.content;
            display_info->regs_content_count = nr_regs;
        }

        /* Now set the register names and values.  */
        pos = 0;
        for (regnum = 0;
                regnum < gdbarch_num_regs (gdbarch)
                + gdbarch_num_pseudo_regs (gdbarch);
                regnum++)
        {
            struct tui_gen_win_info *data_item_win;
            struct tui_data_element *data;
            const char *name;

            /* Must be in the group.  */
            if (!gdbarch_register_reggroup_p (gdbarch, regnum, group))
                continue;

            /* If the register name is empty, it is undefined for this
               processor, so don't display anything.  */
            name = gdbarch_register_name (gdbarch, regnum);
            if (name == 0 || *name == '\0')
                continue;

            data_item_win =
                &display_info->regs_content[pos]->which_element.data_window;
            data = &((struct tui_win_element *)
                     data_item_win->content[0])->which_element.data;
            if (data)
            {
                if (!refresh_values_only)
                {
                    data->item_no = regnum;
                    data->name = name;
                    data->highlight = FALSE;
                }
                tui_get_register (frame, data, regnum, 0);
            }
            pos++;
        }

        TUI_DATA_WIN->generic.content_size =
            display_info->regs_content_count + display_info->data_content_count;
        ret = TUI_SUCCESS;
    }

    return ret;
}
Ejemplo n.º 3
0
static enum tui_status
tui_show_register_group (struct gdbarch *gdbarch, struct reggroup *group,
                         struct frame_info *frame, int refresh_values_only)
{
    enum tui_status ret = TUI_FAILURE;
    int nr_regs;
    int allocated_here = FALSE;
    int regnum, pos;
    char title[80];
    struct tui_data_info *display_info = &TUI_DATA_WIN->detail.data_display_info;

    /* Make a new title showing which group we display.  */
    snprintf (title, sizeof (title) - 1, "Register group: %s",
    reggroup_name (group));
    xfree (TUI_DATA_WIN->generic.title);
    TUI_DATA_WIN->generic.title = xstrdup (title);

    /* See how many registers must be displayed.  */
    nr_regs = 0;
    for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
    {
        /* Must be in the group and have a name.  */
        if (gdbarch_register_reggroup_p (gdbarch, regnum, group)
        && gdbarch_register_name (gdbarch, regnum) != 0)
            nr_regs++;
    }

    if (display_info->regs_content_count > 0 && !refresh_values_only)
    {
        tui_free_data_content (display_info->regs_content,
        display_info->regs_content_count);
        display_info->regs_content_count = 0;
    }

    if (display_info->regs_content_count <= 0)
    {
        display_info->regs_content = tui_alloc_content (nr_regs, DATA_WIN);
        allocated_here = TRUE;
        refresh_values_only = FALSE;
    }

    if (display_info->regs_content != (tui_win_content) NULL)
    {
        if (!refresh_values_only || allocated_here)
        {
            TUI_DATA_WIN->generic.content = (void*) NULL;
            TUI_DATA_WIN->generic.content_size = 0;
            tui_add_content_elements (&TUI_DATA_WIN->generic, nr_regs);
            display_info->regs_content
            = (tui_win_content) TUI_DATA_WIN->generic.content;
            display_info->regs_content_count = nr_regs;
        }

        /* Now set the register names and values */
        pos = 0;
        for (regnum = 0; regnum < NUM_REGS + NUM_PSEUDO_REGS; regnum++)
        {
            struct tui_gen_win_info *data_item_win;
            struct tui_data_element *data;
            const char *name;

            if (!gdbarch_register_reggroup_p (gdbarch, regnum, group))
                continue;

            name = gdbarch_register_name (gdbarch, regnum);
            if (name == 0)
                continue;

            data_item_win =
                &display_info->regs_content[pos]->which_element.data_window;
            data =
                &((struct tui_win_element *) data_item_win->content[0])->which_element.data;
            if (data)
            {
                if (!refresh_values_only)
                {
                    data->item_no = regnum;
                    data->name = name;
                    data->highlight = FALSE;
                }
                if (data->value == (void*) NULL)
                    data->value = (void*) xmalloc (MAX_REGISTER_SIZE);

                tui_get_register (gdbarch, frame, data, regnum, 0);
            }
            pos++;
        }

        TUI_DATA_WIN->generic.content_size =
            display_info->regs_content_count + display_info->data_content_count;
        ret = TUI_SUCCESS;
    }

    return ret;
}