+ struct gdbarch *gdbarch = get_current_arch ();
+
+ if (args != NULL)
+ {
+ struct reggroup *group, *match = NULL;
+ size_t len = strlen (args);
+
+ /* Make sure the curses mode is enabled. */
+ tui_enable ();
+
+ /* Make sure the register window is visible. If not, select an
+ appropriate layout. We need to do this before trying to run the
+ 'next' or 'prev' commands. */
+ if (TUI_DATA_WIN == NULL || !TUI_DATA_WIN->generic.is_visible)
+ tui_set_layout_by_name (DATA_NAME);
+
+ if (strncmp (args, "next", len) == 0)
+ match = tui_reg_next (gdbarch);
+ else if (strncmp (args, "prev", len) == 0)
+ match = tui_reg_prev (gdbarch);
+
+ /* This loop matches on the initial part of a register group
+ name. If this initial part in ARGS matches only one register
+ group then the switch is made. */
+ for (group = reggroup_next (gdbarch, NULL);
+ group != NULL;
+ group = reggroup_next (gdbarch, group))
+ {
+ if (strncmp (reggroup_name (group), args, len) == 0)
+ {
+ if (match != NULL)
+ error (_("ambiguous register group name '%s'"), args);
+ match = group;
+ }
+ }
+
+ if (match == NULL)
+ error (_("unknown register group '%s'"), args);
+
+ tui_show_registers (match);
+ }
+ else
+ {
+ struct reggroup *group;
+ int first;
+
+ printf_unfiltered (_("\"tui reg\" must be followed by the name of "
+ "either a register group,\nor one of 'next' "
+ "or 'prev'. Known register groups are:\n"));
+
+ for (first = 1, group = reggroup_next (gdbarch, NULL);
+ group != NULL;
+ first = 0, group = reggroup_next (gdbarch, group))
+ {
+ if (!first)
+ printf_unfiltered (", ");
+ printf_unfiltered ("%s", reggroup_name (group));
+ }
+
+ printf_unfiltered ("\n");
+ }