aboutsummaryrefslogtreecommitdiff
path: root/gdb/printcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r--gdb/printcmd.c458
1 files changed, 367 insertions, 91 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index 56278ee..67b93a8 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -20,8 +20,8 @@ anyone else from sharing it farther. Help stamp out software hoarding!
#include <stdio.h>
#include "defs.h"
-#include "initialize.h"
#include "param.h"
+#include "frame.h"
#include "symtab.h"
#include "value.h"
#include "expression.h"
@@ -66,7 +66,6 @@ void do_displays ();
void print_address ();
void print_scalar_formatted ();
-START_FILE
/* Decode a format specification. *STRING_PTR should point to it.
OFORMAT and OSIZE are used as defaults for the format and size
@@ -98,15 +97,25 @@ decode_format (string_ptr, oformat, osize)
{
if (*p == 'b' || *p == 'h' || *p == 'w' || *p == 'g')
val.size = *p++;
+#ifdef LONG_LONG
+ else if (*p == 'l')
+ {
+ val.size = 'g';
+ p++;
+ }
+#endif
else if (*p >= 'a' && *p <= 'z')
val.format = *p++;
else
break;
}
- /* Make sure 'g' size is not used on integer types. */
- if (val.size == 'g' && val.format != 'f')
+#ifndef LONG_LONG
+ /* Make sure 'g' size is not used on integer types.
+ Well, actually, we can handle hex. */
+ if (val.size == 'g' && val.format != 'f' && val.format != 'x')
val.size = 'w';
+#endif
while (*p == ' ' || *p == '\t') p++;
*string_ptr = p;
@@ -126,7 +135,6 @@ print_formatted (val, format, size)
register char format;
char size;
{
- register CORE_ADDR val_long;
int len = TYPE_LENGTH (VALUE_TYPE (val));
if (VALUE_LVAL (val) == lval_memory)
@@ -148,7 +156,8 @@ print_formatted (val, format, size)
if (format == 0
|| TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_ARRAY
|| TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_STRUCT
- || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_UNION)
+ || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_UNION
+ || VALUE_REPEATED (val))
value_print (val, stdout, format);
else
print_scalar_formatted (VALUE_CONTENTS (val), VALUE_TYPE (val),
@@ -171,9 +180,39 @@ print_scalar_formatted (valaddr, type, format, size, stream)
int size;
FILE *stream;
{
- long val_long;
+ LONGEST val_long;
int len = TYPE_LENGTH (type);
+ if (size == 'g' && sizeof (LONGEST) < 8
+ && format == 'x')
+ {
+ /* ok, we're going to have to get fancy here. Assumption: a
+ long is four bytes. */
+ unsigned long v1, v2, tmp;
+
+ v1 = unpack_long (builtin_type_long, valaddr);
+ v2 = unpack_long (builtin_type_long, valaddr + 4);
+
+#ifdef BYTES_BIG_ENDIAN
+#else
+ /* Little endian -- swap the two for printing */
+ tmp = v1;
+ v1 = v2;
+ v2 = tmp;
+#endif
+
+ switch (format)
+ {
+ case 'x':
+ fprintf (stream, "0x%08x%08x", v1, v2);
+ break;
+ default:
+ error ("Output size \"g\" unimplemented for format \"%c\".",
+ format);
+ }
+ return;
+ }
+
val_long = unpack_long (type, valaddr);
/* If value is unsigned, truncate it in case negative. */
@@ -183,48 +222,85 @@ print_scalar_formatted (valaddr, type, format, size, stream)
val_long &= (1 << 8 * sizeof(char)) - 1;
else if (len == sizeof (short))
val_long &= (1 << 8 * sizeof(short)) - 1;
+ else if (len == sizeof (long))
+ val_long &= (unsigned long) - 1;
}
switch (format)
{
case 'x':
+#ifdef LONG_LONG
+ if (!size)
+ size = (len < sizeof (long long) ? 'w' : 'g');
+ switch (size)
+ {
+ case 'b':
+ fprintf (stream, "0x%02llx", val_long);
+ break;
+ case 'h':
+ fprintf (stream, "0x%04llx", val_long);
+ break;
+ case 0: /* no size specified, like in print */
+ case 'w':
+ fprintf (stream, "0x%08llx", val_long);
+ break;
+ case 'g':
+ fprintf (stream, "0x%16llx", val_long);
+ break;
+ default:
+ error ("Undefined output size \"%c\".", size);
+ }
+#else
switch (size)
{
case 'b':
- printf ("0x%02x", val_long);
+ fprintf (stream, "0x%02x", val_long);
break;
case 'h':
- printf ("0x%04x", val_long);
+ fprintf (stream, "0x%04x", val_long);
break;
case 0: /* no size specified, like in print */
case 'w':
- printf ("0x%08x", val_long);
+ fprintf (stream, "0x%08x", val_long);
break;
case 'g':
- printf ("0x%16x", val_long);
+ fprintf (stream, "0x%16x", val_long);
break;
default:
error ("Undefined output size \"%c\".", size);
}
+#endif /* not LONG_LONG */
break;
case 'd':
- printf ("%d", val_long);
+#ifdef LONG_LONG
+ fprintf (stream, "%lld", val_long);
+#else
+ fprintf (stream, "%d", val_long);
+#endif
break;
case 'u':
- printf ("%u", val_long);
+#ifdef LONG_LONG
+ fprintf (stream, "%llu", val_long);
+#else
+ fprintf (stream, "%u", val_long);
+#endif
break;
case 'o':
if (val_long)
- printf ("0%o", val_long);
+#ifdef LONG_LONG
+ fprintf (stream, "0%llo", val_long);
+#else
+ fprintf (stream, "0%o", val_long);
+#endif
else
- printf ("0");
+ fprintf (stream, "0");
break;
case 'a':
- print_address (val_long, stream);
+ print_address ((CORE_ADDR) val_long, stream);
break;
case 'c':
@@ -234,16 +310,27 @@ print_scalar_formatted (valaddr, type, format, size, stream)
case 'f':
if (len == sizeof (float))
type = builtin_type_float;
- if (len == sizeof (double))
+ else if (len == sizeof (double))
type = builtin_type_double;
+ else abort();
+
#ifdef IEEE_FLOAT
- if (is_nan (unpack_double (type, valaddr)))
+ if (is_nan (valaddr, len))
{
- printf ("Nan");
+ fprintf (stream, "NaN");
break;
}
#endif
- printf ("%g", unpack_double (type, valaddr));
+ {
+ double doub;
+ int inv;
+
+ doub = unpack_double (type, valaddr, &inv);
+ if (inv)
+ fprintf (stream, "Invalid float value");
+ else
+ fprintf (stream, len > 4? "%.16g": "%.6g", doub);
+ }
break;
case 0:
@@ -265,7 +352,7 @@ set_next_address (addr)
/* Make address available to the user as $_. */
set_internalvar (lookup_internalvar ("_"),
- value_from_long (builtin_type_int, addr));
+ value_from_long (builtin_type_int, (LONGEST) addr));
}
/* Print address ADDR symbolically on STREAM.
@@ -278,18 +365,36 @@ print_address (addr, stream)
FILE *stream;
{
register int i;
+ struct symbol *fs;
+ char *name;
+ int name_location;
fprintf (stream, "0x%x", addr);
- i = find_pc_misc_function (addr);
- if (i >= 0)
- if (misc_function_vector[i].address != addr)
- fprintf (stream, " <%s+%d>",
- misc_function_vector[i].name,
- addr - misc_function_vector[i].address);
- else
- fprintf (stream, " <%s>", misc_function_vector[i].name);
+ fs = find_pc_function (addr);
+
+ if (!fs)
+ {
+ i = find_pc_misc_function (addr);
+
+ if (i < 0) return; /* If nothing comes through, don't
+ print anything symbolic */
+ name = misc_function_vector[i].name;
+ name_location = misc_function_vector[i].address;
+ }
+ else
+ {
+ name = fs->name;
+ name_location = BLOCK_START (SYMBOL_BLOCK_VALUE (fs));
+ }
+
+ if (addr - name_location)
+ fprintf (stream, " <%s+%d>",
+ name,
+ addr - name_location);
+ else
+ fprintf (stream, " <%s>", name);
}
/* Examine data at address ADDR in format FMT.
@@ -324,7 +429,11 @@ do_examine (fmt, addr)
else if (size == 'w')
val_type = builtin_type_long;
else if (size == 'g')
+#ifndef LONG_LONG
val_type = builtin_type_double;
+#else
+ val_type = builtin_type_long_long;
+#endif
maxelts = 8;
if (size == 'w')
@@ -346,7 +455,8 @@ do_examine (fmt, addr)
i--, count--)
{
fputc ('\t', stdout);
- /* Note that this sets next_address for the next object. */
+ /* Note that print_formatted sets next_address for the next
+ object. */
last_examine_address = next_address;
last_examine_value = value_at (val_type, next_address);
print_formatted (last_examine_value, format, size);
@@ -402,7 +512,7 @@ print_command (exp)
val = access_value_history (0);
histindex = record_latest_value (val);
- printf ("$%d = ", histindex);
+ if (histindex >= 0) printf ("$%d = ", histindex);
print_formatted (val, format, fmt.size);
printf ("\n");
@@ -456,15 +566,24 @@ address_info (exp)
{
register struct symbol *sym;
register CORE_ADDR val;
+ int is_a_field_of_this; /* C++: lookup_symbol sets this to nonzero
+ if exp is a field of `this'. */
if (exp == 0)
error ("Argument required.");
- sym = lookup_symbol (exp, get_selected_block (), VAR_NAMESPACE);
+ sym = lookup_symbol (exp, get_selected_block (), VAR_NAMESPACE,
+ &is_a_field_of_this);
if (sym == 0)
{
register int i;
+ if (is_a_field_of_this)
+ {
+ printf("Symbol \"%s\" is a field of the local class variable `this'\n", exp);
+ return;
+ }
+
for (i = 0; i < misc_function_count; i++)
if (!strcmp (misc_function_vector[i].name, exp))
break;
@@ -502,7 +621,7 @@ address_info (exp)
case LOC_REGPARM:
printf ("an argument in register %s", reg_names[val]);
break;
-
+
case LOC_ARG:
printf ("an argument at offset %d", val);
break;
@@ -555,18 +674,23 @@ x_command (exp, from_tty)
if (from_tty)
*exp = 0;
old_chain = make_cleanup (free_current_contents, &expr);
- next_address = value_as_long (evaluate_expression (expr));
+ next_address = (CORE_ADDR) value_as_long (evaluate_expression (expr));
do_cleanups (old_chain);
}
do_examine (fmt, next_address);
- /* Make last address examined available to the user as $_. */
- set_internalvar (lookup_internalvar ("_"),
- value_from_long (builtin_type_int, last_examine_address));
-
- /* Make contents of last address examined available to the user as $__. */
- set_internalvar (lookup_internalvar ("__"), last_examine_value);
+ /* Set a couple of internal variables if appropriate. */
+ if (last_examine_value)
+ {
+ /* Make last address examined available to the user as $_. */
+ set_internalvar (lookup_internalvar ("_"),
+ value_from_long (builtin_type_int,
+ (LONGEST) last_examine_address));
+
+ /* Make contents of last address examined available to the user as $__.*/
+ set_internalvar (lookup_internalvar ("__"), last_examine_value);
+ }
}
/* Commands for printing types of things. */
@@ -626,7 +750,7 @@ ptype_command (typename)
if (type == 0)
{
register struct symbol *sym
- = lookup_symbol (typename, b, STRUCT_NAMESPACE);
+ = lookup_symbol (typename, b, STRUCT_NAMESPACE, 0);
if (sym == 0)
error ("No type named %s.", typename);
printf ("No type named %s, but there is a ",
@@ -653,6 +777,8 @@ ptype_command (typename)
printf ("\n");
}
+enum display_status {disabled, enabled};
+
struct display
{
/* Chain link to next auto-display item. */
@@ -663,8 +789,10 @@ struct display
int number;
/* Display format specified. */
struct format_data format;
- /* Block in which expression is to be evaluated. */
+ /* Innermost block required by this expression when evaluated */
struct block *block;
+ /* Status of this display (enabled or disabled) */
+ enum display_status status;
};
/* Chain of expressions whose values should be displayed
@@ -685,6 +813,7 @@ display_command (exp, from_tty)
struct format_data fmt;
register struct expression *expr;
register struct display *new;
+ extern struct block *innermost_block;
if (exp == 0)
{
@@ -708,17 +837,20 @@ display_command (exp, from_tty)
fmt.count = 0;
}
+ innermost_block = 0;
expr = parse_c_expression (exp);
new = (struct display *) xmalloc (sizeof (struct display));
new->exp = expr;
+ new->block = innermost_block;
new->next = display_chain;
new->number = ++display_number;
new->format = fmt;
+ new->status = enabled;
display_chain = new;
- if (from_tty)
+ if (from_tty && have_inferior_p ())
do_one_display (new);
dont_repeat ();
@@ -818,12 +950,26 @@ undisplay_command (args)
dont_repeat ();
}
-/* Display a single auto-display. */
+/* Display a single auto-display.
+ Do nothing if the display cannot be printed in the current context,
+ or if the display is disabled. */
static void
do_one_display (d)
struct display *d;
{
+ int within_current_scope;
+
+ if (d->status == disabled)
+ return;
+
+ if (d->block)
+ within_current_scope = contained_in (get_selected_block (), d->block);
+ else
+ within_current_scope = 1;
+ if (!within_current_scope)
+ return;
+
current_display_number = d->number;
printf ("%d: ", d->number);
@@ -842,7 +988,8 @@ do_one_display (d)
else
printf (" ");
do_examine (d->format,
- value_as_long (evaluate_expression (d->exp)));
+ (CORE_ADDR) value_as_long (evaluate_expression (d->exp)));
+
}
else
{
@@ -859,7 +1006,8 @@ do_one_display (d)
current_display_number = -1;
}
-/* Display all of the values on the auto-display chain. */
+/* Display all of the values on the auto-display chain which can be
+ evaluated in the current scope. */
void
do_displays ()
@@ -893,20 +1041,103 @@ display_info ()
if (!display_chain)
printf ("There are no auto-display expressions now.\n");
else
- printf ("Auto-display expressions now in effect:\n");
+ printf ("Auto-display expressions now in effect:\n\
+Num Enb Expression\n");
+
for (d = display_chain; d; d = d->next)
{
- printf ("%d: ", d->number);
+ printf ("%d: %c ", d->number, "ny"[(int)d->status]);
if (d->format.size)
printf ("/%d%c%c ", d->format.count, d->format.size,
d->format.format);
else if (d->format.format)
printf ("/%c ", d->format.format);
print_expression (d->exp, stdout);
+ if (d->block && !contained_in (get_selected_block (), d->block))
+ printf (" (cannot be evaluated in the current context)");
printf ("\n");
fflush (stdout);
}
}
+
+void
+enable_display (args)
+ char *args;
+{
+ register char *p = args;
+ register char *p1;
+ register int num;
+ register struct display *d;
+
+ if (p == 0)
+ {
+ for (d = display_chain; d; d->next)
+ d->status = enabled;
+ }
+ else
+ while (*p)
+ {
+ p1 = p;
+ while (*p1 >= '0' && *p1 <= '9')
+ p1++;
+ if (*p1 && *p1 != ' ' && *p1 != '\t')
+ error ("Arguments must be display numbers.");
+
+ num = atoi (p);
+
+ for (d = display_chain; d; d = d->next)
+ if (d->number == num)
+ {
+ d->status = enabled;
+ goto win;
+ }
+ printf ("No display number %d.\n", num);
+ win:
+ p = p1;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ }
+}
+
+void
+disable_display (args)
+ char *args;
+{
+ register char *p = args;
+ register char *p1;
+ register int num;
+ register struct display *d;
+
+ if (p == 0)
+ {
+ for (d = display_chain; d; d->next)
+ d->status = disabled;
+ }
+ else
+ while (*p)
+ {
+ p1 = p;
+ while (*p1 >= '0' && *p1 <= '9')
+ p1++;
+ if (*p1 && *p1 != ' ' && *p1 != '\t')
+ error ("Arguments must be display numbers.");
+
+ num = atoi (p);
+
+ for (d = display_chain; d; d = d->next)
+ if (d->number == num)
+ {
+ d->status = disabled;
+ goto win;
+ }
+ printf ("No display number %d.\n", num);
+ win:
+ p = p1;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ }
+}
+
/* Print the value in stack frame FRAME of a variable
specified by a struct symbol. */
@@ -922,14 +1153,15 @@ print_variable_value (var, frame, stream)
}
/* Print the arguments of a stack frame, given the function FUNC
- running in that frame (as a symbol), the address of the arglist,
+ running in that frame (as a symbol), the info on the frame,
and the number of args according to the stack frame (or -1 if unknown). */
static void print_frame_nameless_args ();
-print_frame_args (func, addr, num, stream)
+void
+print_frame_args (func, fi, num, stream)
struct symbol *func;
- register CORE_ADDR addr;
+ struct frame_info *fi;
int num;
FILE *stream;
{
@@ -939,8 +1171,9 @@ print_frame_args (func, addr, num, stream)
register int i;
register int last_offset = FRAME_ARGS_SKIP;
register int last_regparm = 0;
- register struct symbol *sym, *nextsym;
+ register struct symbol *lastsym, *sym, *nextsym;
register value val;
+ register CORE_ADDR addr = FRAME_ARGS_ADDRESS (fi);
if (func)
{
@@ -948,6 +1181,7 @@ print_frame_args (func, addr, num, stream)
nsyms = BLOCK_NSYMS (b);
}
+ lastsym = 0;
while (1)
{
/* Find first arg that is not before LAST_OFFSET. */
@@ -965,9 +1199,10 @@ print_frame_args (func, addr, num, stream)
}
else if (SYMBOL_CLASS (sym) == LOC_REGPARM)
{
- if (SYMBOL_VALUE (sym) >= last_regparm
- && (nextsym == 0
- || SYMBOL_VALUE (sym) < SYMBOL_VALUE (nextsym)))
+ /* This shouldn't be sorted by number. Since we can't
+ find nameless args with register parameters, print
+ this out in order by .stabs. */
+ if (sym > lastsym && nextsym == 0)
nextsym = sym;
}
}
@@ -985,29 +1220,9 @@ print_frame_args (func, addr, num, stream)
}
/* Print the next arg. */
if (SYMBOL_CLASS (sym) == LOC_REGPARM)
- {
- unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE];
- unsigned char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
-
- read_relative_register_raw_bytes (SYMBOL_VALUE (sym), raw_buffer);
- if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT)
- val = value_from_double (SYMBOL_TYPE (sym), *(double *)raw_buffer);
- else if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
- || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM)
- val = value_from_long (SYMBOL_TYPE (sym), *(int *)raw_buffer);
- else if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR)
- {
- if (sizeof (char *) == sizeof (int))
- val = value_from_long (builtin_type_int, *(int *)raw_buffer);
- else if (sizeof (char *) == sizeof (long))
- val = value_from_long (builtin_type_long, *(long *)raw_buffer);
- else
- error ("pointer size not sizeof (int) or sizeof (long)");
- VALUE_TYPE (val) = SYMBOL_TYPE (sym);
- }
- else
- error ("can't extract non-scalar from register");
- }
+ val = value_from_register (SYMBOL_TYPE (sym),
+ SYMBOL_VALUE (sym),
+ FRAME_INFO_ID (fi));
else
val = value_at (SYMBOL_TYPE (sym), addr + SYMBOL_VALUE (sym));
@@ -1023,9 +1238,11 @@ print_frame_args (func, addr, num, stream)
last_regparm = SYMBOL_VALUE (sym) + 1;
last_offset += TYPE_LENGTH (SYMBOL_TYPE (sym));
}
+
/* Round up address of next arg to multiple of size of int. */
last_offset
= ((last_offset + sizeof (int) - 1) / sizeof (int)) * sizeof (int);
+ lastsym = sym;
}
if (num >= 0 && num * sizeof (int) + FRAME_ARGS_SKIP > last_offset)
print_frame_nameless_args (addr, last_offset,
@@ -1132,7 +1349,8 @@ printf_command (arg)
while (*s == ' ' || *s == '\t') s++;
/* Now scan the string for %-specs and see what kinds of args they want.
- argclass[I] is set to 1 if the Ith arg should be a string. */
+ argclass[I] is set to 1 if the Ith arg should be a string.
+ It's set to 2 if the Ith arg should be floating point. */
argclass = (char *) alloca (strlen (s));
nargs_wanted = 0;
@@ -1143,6 +1361,8 @@ printf_command (arg)
while (index ("0123456789.hlL-+ #", *f)) f++;
if (*f == 's')
argclass[nargs_wanted++] = 1;
+ else if (*f == 'e' || *f == 'f' || *f == 'g')
+ argclass[nargs_wanted++] = 2;
else if (*f != '%')
argclass[nargs_wanted++] = 0;
f++;
@@ -1159,7 +1379,20 @@ printf_command (arg)
(allocated_args *= 2)
* sizeof (value));
s1 = s;
- val_args[nargs++] = parse_to_comma_and_eval (&s1);
+ val_args[nargs] = parse_to_comma_and_eval (&s1);
+
+ /* If format string wants a float, unchecked-convert the value to
+ floating point of the same size */
+
+ if (argclass[nargs] == 2)
+ {
+ argclass[nargs] = 0;
+ if (TYPE_LENGTH (VALUE_TYPE (val_args[nargs])) == sizeof (float))
+ VALUE_TYPE (val_args[nargs]) = builtin_type_float;
+ if (TYPE_LENGTH (VALUE_TYPE (val_args[nargs])) == sizeof (double))
+ VALUE_TYPE (val_args[nargs]) = builtin_type_double;
+ }
+ nargs++;
s = s1;
if (*s == ',')
s++;
@@ -1206,6 +1439,14 @@ printf_command (arg)
argindex += sizeof (double);
}
else
+#ifdef LONG_LONG
+ if (TYPE_LENGTH (VALUE_TYPE (val_args[i])) == sizeof (long long))
+ {
+ *(long long *) &arg_bytes[argindex] = value_as_long (val_args[i]);
+ argindex += sizeof (long long);
+ }
+ else
+#endif
{
*((int *) &arg_bytes[argindex]) = value_as_long (val_args[i]);
argindex += sizeof (int);
@@ -1215,8 +1456,11 @@ printf_command (arg)
vprintf (string, arg_bytes);
}
-static
-initialize ()
+extern struct cmd_list_element *enablelist, *disablelist, *deletelist;
+extern struct cmd_list_element *cmdlist, *setlist;
+
+void
+_initialize_printcmd ()
{
current_display_number = -1;
@@ -1248,11 +1492,15 @@ The selected stack frame's lexical context is used to look up the name.");
add_info ("display", display_info,
"Expressions to display when program stops, with code numbers.");
- add_com ("undisplay", class_vars, undisplay_command,
- "Cancel some expressions to be displayed whenever program stops.\n\
+
+ add_abbrev_cmd ("undisplay", class_vars, undisplay_command,
+ "Cancel some expressions to be displayed when program stops.\n\
Arguments are the code numbers of the expressions to stop displaying.\n\
No argument means cancel all automatic-display expressions.\n\
-Do \"info display\" to see current list of code numbers.");
+\"delete display\" has the same effect as this command.\n\
+Do \"info display\" to see current list of code numbers.",
+ &cmdlist);
+
add_com ("display", class_vars, display_command,
"Print value of expression EXP each time the program stops.\n\
/FMT may be used before EXP as in the \"print\" command.\n\
@@ -1262,6 +1510,24 @@ and examining is done as in the \"x\" command.\n\n\
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,
+ "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\
+Do \"info display\" to see current list of code numbers.", &enablelist);
+
+ add_cmd ("display", class_vars, disable_display,
+ "Disable some expressions to be displayed when program stops.\n\
+Arguments are the code numbers of the expressions to stop displaying.\n\
+No argument means disable all automatic-display expressions.\n\
+Do \"info display\" to see current list of code numbers.", &disablelist);
+
+ add_cmd ("display", class_vars, undisplay_command,
+ "Cancel some expressions to be displayed when program stops.\n\
+Arguments are the code numbers of the expressions to stop displaying.\n\
+No argument means cancel all automatic-display expressions.\n\
+Do \"info display\" to see current list of code numbers.", &deletelist);
+
add_com ("printf", class_vars, printf_command,
"printf \"printf format string\", arg1, arg2, arg3, ..., argn\n\
This is useful for formatted output in user-defined commands.");
@@ -1269,11 +1535,22 @@ This is useful for formatted output in user-defined commands.");
"Like \"print\" but don't put in value history and don't print newline.\n\
This is useful in user-defined commands.");
- add_com ("set", class_vars, set_command,
- "Perform an assignment VAR = EXP. You must type the \"=\".\n\
-VAR may be a debugger \"convenience\" variables (names starting with $),\n\
-a register (a few standard names starting with $), or an actual variable\n\
-in the program being debugger. EXP is any expression.");
+ add_prefix_cmd ("set", class_vars, set_command,
+"Perform an assignment VAR = EXP.\n\
+You must type the \"=\". VAR may be a debugger \"convenience\" variable\n\
+(names starting with $), a register (a few standard names starting with $),\n\
+or an actual variable in the program being debugged. EXP is any expression.\n\
+Use \"set variable\" for variables with names identical to set subcommands.\n\
+\nWith a subcommand, this command modifies parts of the gdb environment",
+ &setlist, "set ", 1, &cmdlist);
+
+ add_cmd ("variable", class_vars, set_command,
+ "Perform an assignment VAR = EXP.\n\
+You must type the \"=\". VAR may be a debugger \"convenience\" variable\n\
+(names starting with $), a register (a few standard names starting with $),\n\
+or an actual variable in the program being debugged. EXP is any expression.\n\
+This may usually be abbreviated to simply \"set\".",
+ &setlist);
add_com ("print", class_vars, print_command,
concat ("Print value of expression EXP.\n\
@@ -1300,4 +1577,3 @@ but no count or size letter (see \"x\" command)."));
add_com_alias ("p", "print", class_vars, 1);
}
-END_FILE