#include "parser-defs.h"
#include "charset.h"
#include "arch-utils.h"
-#include "printcmd.h"
#include "cli/cli-utils.h"
#ifdef TUI
static int display_number;
-/* Walk the following statement or block through all displays. */
+/* Walk the following statement or block through all displays.
+ ALL_DISPLAYS_SAFE does so even if the statement deletes the current
+ display. */
#define ALL_DISPLAYS(B) \
for (B = display_chain; B; B = B->next)
+#define ALL_DISPLAYS_SAFE(B,TMP) \
+ for (B = display_chain; \
+ B ? (TMP = B->next, 1): 0; \
+ B = TMP)
+
/* Prototypes for exported functions. */
void output_command (char *, int);
|| TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
value_print (val, stream, options);
else
- /* User specified format, so don't look to the the type to
- tell us what to do. */
+ /* User specified format, so don't look to the type to tell us
+ what to do. */
val_print_scalar_formatted (type,
value_contents_for_printing (val),
value_embedded_offset (val),
if (*cp == '\0')
cp--;
}
- strcpy (buf, cp);
+ strncpy (buf, cp, sizeof (bits));
fputs_filtered (buf, stream);
}
break;
CORE_ADDR pc;
frame = get_selected_frame (NULL);
- pc = get_frame_pc (frame);
-
- if (pc == addr)
+ if (get_frame_pc_if_available (frame, &pc) && pc == addr)
return "=> ";
}
return " ";
free_display (display);
}
-/* Delete some values from the auto-display chain.
- Specify the element numbers. */
+/* Call FUNCTION on each of the displays whose numbers are given in
+ ARGS. DATA is passed unmodified to FUNCTION. */
static void
-undisplay_command (char *args, int from_tty)
+map_display_numbers (char *args,
+ void (*function) (struct display *,
+ void *),
+ void *data)
{
- char *p = args;
- char *p1;
+ struct get_number_or_range_state state;
+ struct display *b, *tmp;
int num;
- if (args == 0)
- {
- if (query (_("Delete all auto-display expressions? ")))
- clear_displays ();
- dont_repeat ();
- return;
- }
+ if (args == NULL)
+ error_no_arg (_("one or more display numbers"));
- while (*p)
+ init_number_or_range (&state, args);
+
+ while (!state.finished)
{
- p1 = p;
+ char *p = state.string;
- num = get_number_or_range (&p1);
+ num = get_number_or_range (&state);
if (num == 0)
warning (_("bad display number at or near '%s'"), p);
else
{
- struct display *d;
+ struct display *d, *tmp;
- ALL_DISPLAYS (d)
+ ALL_DISPLAYS_SAFE (d, tmp)
if (d->number == num)
break;
if (d == NULL)
printf_unfiltered (_("No display number %d.\n"), num);
else
- delete_display (d);
+ function (d, data);
}
+ }
+}
+
+/* Callback for map_display_numbers, that deletes a display. */
+
+static void
+do_delete_display (struct display *d, void *data)
+{
+ delete_display (d);
+}
+
+/* "undisplay" command. */
- p = p1;
+static void
+undisplay_command (char *args, int from_tty)
+{
+ int num;
+ struct get_number_or_range_state state;
+
+ if (args == NULL)
+ {
+ if (query (_("Delete all auto-display expressions? ")))
+ clear_displays ();
+ dont_repeat ();
+ return;
}
+
+ map_display_numbers (args, do_delete_display, NULL);
dont_repeat ();
}
}
}
+/* Callback fo map_display_numbers, that enables or disables the
+ passed in display D. */
+
static void
-enable_display (char *args, int from_tty)
+do_enable_disable_display (struct display *d, void *data)
{
- char *p = args;
- char *p1;
- int num;
- struct display *d;
+ d->enabled_p = *(int *) data;
+}
+
+/* Implamentation of both the "disable display" and "enable display"
+ commands. ENABLE decides what to do. */
- if (p == 0)
+static void
+enable_disable_display_command (char *args, int from_tty, int enable)
+{
+ if (args == NULL)
{
- for (d = display_chain; d; d = d->next)
- d->enabled_p = 1;
- }
- else
- while (*p)
- {
- p1 = p;
- while (*p1 >= '0' && *p1 <= '9')
- p1++;
- if (*p1 && *p1 != ' ' && *p1 != '\t')
- error (_("Arguments must be display numbers."));
+ struct display *d;
- num = atoi (p);
+ ALL_DISPLAYS (d)
+ d->enabled_p = enable;
+ return;
+ }
- for (d = display_chain; d; d = d->next)
- if (d->number == num)
- {
- d->enabled_p = 1;
- goto win;
- }
- printf_unfiltered (_("No display number %d.\n"), num);
- win:
- p = p1;
- while (*p == ' ' || *p == '\t')
- p++;
- }
+ map_display_numbers (args, do_enable_disable_display, &enable);
}
+/* The "enable display" command. */
+
static void
-disable_display_command (char *args, int from_tty)
+enable_display_command (char *args, int from_tty)
{
- char *p = args;
- char *p1;
- struct display *d;
-
- if (p == 0)
- {
- for (d = display_chain; d; d = d->next)
- d->enabled_p = 0;
- }
- else
- while (*p)
- {
- p1 = p;
- while (*p1 >= '0' && *p1 <= '9')
- p1++;
- if (*p1 && *p1 != ' ' && *p1 != '\t')
- error (_("Arguments must be display numbers."));
+ enable_disable_display_command (args, from_tty, 1);
+}
- disable_display (atoi (p));
+/* The "disable display" command. */
- p = p1;
- while (*p == ' ' || *p == '\t')
- p++;
- }
+static void
+disable_display_command (char *args, int from_tty)
+{
+ enable_disable_display_command (args, from_tty, 0);
}
/* display_chain items point to blocks and expressions. Some expressions in
fprintf_filtered (stream, "\n");
}
-void
-string_printf (char *arg, struct ui_file *stream, printf_callback callback,
- void *loc_v, void *aexpr_v)
+/* printf "printf format string" ARG to STREAM. */
+
+static void
+ui_printf (char *arg, struct ui_file *stream)
{
char *f = NULL;
char *s = arg;
int nargs = 0;
int allocated_args = 20;
struct cleanup *old_cleanups;
- struct bp_location *loc = loc_v;
- struct agent_expr *aexpr = aexpr_v;
val_args = xmalloc (allocated_args * sizeof (struct value *));
old_cleanups = make_cleanup (free_current_contents, &val_args);
/* Now, parse all arguments and evaluate them.
Store the VALUEs in VAL_ARGS. */
- if (callback)
- current_substring = substrings;
while (*s != '\0')
{
char *s1;
- s1 = s;
if (nargs == allocated_args)
val_args = (struct value **) xrealloc ((char *) val_args,
(allocated_args *= 2)
* sizeof (struct value *));
- if (callback)
- {
- if (nargs >= nargs_wanted)
- error (_("Wrong number of arguments for specified "
- "format-string"));
- callback (current_substring, &s1, loc, aexpr);
- current_substring += strlen (current_substring) + 1;
- }
- else
- val_args[nargs] = parse_to_comma_and_eval (&s1);
+ s1 = s;
+ val_args[nargs] = parse_to_comma_and_eval (&s1);
nargs++;
s = s1;
if (*s == ',')
s++;
}
- if (callback)
- callback (last_arg, NULL, loc, aexpr);
if (nargs != nargs_wanted)
error (_("Wrong number of arguments for specified format-string"));
- if (!stream)
- goto after_print;
-
/* Now actually print them. */
current_substring = substrings;
for (i = 0; i < nargs; i++)
by default, which will warn here if there is no argument. */
fprintf_filtered (stream, last_arg, 0);
}
-
-after_print:
do_cleanups (old_cleanups);
}
/* Implement the "printf" command. */
-void
+static void
printf_command (char *arg, int from_tty)
{
- string_printf (arg, gdb_stdout, NULL, NULL, NULL);
+ ui_printf (arg, gdb_stdout);
}
/* Implement the "eval" command. */
struct cleanup *cleanups = make_cleanup_ui_file_delete (ui_out);
char *expanded;
- string_printf (arg, ui_out, NULL, NULL, NULL);
+ ui_printf (arg, ui_out);
expanded = ui_file_xstrdup (ui_out, NULL);
make_cleanup (xfree, expanded);
With no argument, display all currently requested auto-display expressions.\n\
Use \"undisplay\" to cancel display requests previously made."));
- add_cmd ("display", class_vars, enable_display, _("\
+ add_cmd ("display", class_vars, enable_display_command, _("\
Enable some expressions to be displayed when program stops.\n\
Arguments are the code numbers of the expressions to resume displaying.\n\
No argument means enable all automatic-display expressions.\n\