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; }
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; }