* i386b-nat.c: Comment changes.
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index dc9803ea0822317a9ed8048a23fa97413b74715b..0434df4a8b49490237d3cb346b1b4c314817af20 100644 (file)
@@ -1,29 +1,38 @@
 /* Print values for GNU debugger GDB.
-   Copyright (C) 1986, 1987, 1988, 1989 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
-#include <stdio.h>
 #include "defs.h"
-#include "param.h"
+#include <string.h>
 #include "frame.h"
 #include "symtab.h"
+#include "gdbtypes.h"
 #include "value.h"
+#include "language.h"
 #include "expression.h"
+#include "gdbcore.h"
+#include "gdbcmd.h"
+#include "target.h"
+#include "breakpoint.h"
+#include "demangle.h"
+
+extern int asm_demangle;       /* Whether to demangle syms in asm printouts */
+extern int addressprint;       /* Whether to print hex addresses in HLL " */
 
 struct format_data
 {
@@ -59,11 +68,121 @@ static value last_examine_value;
 
 int current_display_number;
 
-static void do_one_display ();
+/* Flag to low-level print routines that this value is being printed
+   in an epoch window.  We'd like to pass this as a parameter, but
+   every routine would need to take it.  Perhaps we can encapsulate
+   this in the I/O stream once we have GNU stdio. */
+
+int inspect_it = 0;
+
+struct display
+{
+  /* Chain link to next auto-display item.  */
+  struct display *next;
+  /* Expression to be evaluated and displayed.  */
+  struct expression *exp;
+  /* Item number of this auto-display item.  */
+  int number;
+  /* Display format specified.  */
+  struct format_data format;
+  /* Innermost block required by this expression when evaluated */
+  struct block *block;
+  /* Status of this display (enabled or disabled) */
+  enum enable status;
+};
+
+/* Chain of expressions whose values should be displayed
+   automatically each time the program stops.  */
+
+static struct display *display_chain;
+
+static int display_number;
+
+/* Prototypes for local functions */
+
+static void
+delete_display PARAMS ((int));
+
+static void
+enable_display PARAMS ((char *, int));
+
+static void
+disable_display_command PARAMS ((char *, int));
+
+static void
+disassemble_command PARAMS ((char *, int));
+
+static int
+containing_function_bounds PARAMS ((CORE_ADDR, CORE_ADDR *, CORE_ADDR *));
+
+static void
+printf_command PARAMS ((char *, int));
+
+static void
+print_frame_nameless_args PARAMS ((CORE_ADDR, long, int, int, FILE *));
+
+static void
+display_info PARAMS ((char *, int));
+
+static void
+do_one_display PARAMS ((struct display *));
+
+static void
+undisplay_command PARAMS ((char *, int));
 
-void do_displays ();
-void print_address ();
-void print_scalar_formatted ();
+static void
+free_display PARAMS ((struct display *));
+
+static void
+display_command PARAMS ((char *, int));
+
+static void
+ptype_command PARAMS ((char *, int));
+
+static struct type *
+ptype_eval PARAMS ((struct expression *));
+
+static void
+whatis_command PARAMS ((char *, int));
+
+static void
+whatis_exp PARAMS ((char *, int));
+
+static void
+x_command PARAMS ((char *, int));
+
+static void
+address_info PARAMS ((char *, int));
+
+static void
+set_command PARAMS ((char *, int));
+
+static void
+output_command PARAMS ((char *, int));
+
+static void
+call_command PARAMS ((char *, int));
+
+static void
+inspect_command PARAMS ((char *, int));
+
+static void
+print_command PARAMS ((char *, int));
+
+static void
+print_command_1 PARAMS ((char *, int, int));
+
+static void
+validate_format PARAMS ((struct format_data, char *));
+
+static void
+do_examine PARAMS ((struct format_data, CORE_ADDR));
+
+static void
+print_formatted PARAMS ((value, int, int));
+
+static struct format_data
+decode_format PARAMS ((char **, int, int));
 
 \f
 /* Decode a format specification.  *STRING_PTR should point to it.
@@ -76,11 +195,11 @@ void print_scalar_formatted ();
    found in the specification.  In addition, *STRING_PTR is advanced
    past the specification and past all whitespace following it.  */
 
-struct format_data
+static struct format_data
 decode_format (string_ptr, oformat, osize)
      char **string_ptr;
-     char oformat;
-     char osize;
+     int oformat;
+     int osize;
 {
   struct format_data val;
   register char *p = *string_ptr;
@@ -174,8 +293,8 @@ decode_format (string_ptr, oformat, osize)
 static void
 print_formatted (val, format, size)
      register value val;
-     register char format;
-     char size;
+     register int format;
+     int size;
 {
   int len = TYPE_LENGTH (VALUE_TYPE (val));
 
@@ -186,10 +305,11 @@ print_formatted (val, format, size)
     {
     case 's':
       next_address = VALUE_ADDRESS (val)
-       + value_print (value_addr (val), stdout, 0, Val_pretty_default);
+       + value_print (value_addr (val), stdout, format, Val_pretty_default);
       break;
 
     case 'i':
+      wrap_here ("");  /* Force output out, print_insn not using _filtered */
       next_address = VALUE_ADDRESS (val)
        + print_insn (VALUE_ADDRESS (val), stdout);
       break;
@@ -218,7 +338,7 @@ void
 print_scalar_formatted (valaddr, type, format, size, stream)
      char *valaddr;
      struct type *type;
-     char format;
+     int format;
      int size;
      FILE *stream;
 {
@@ -229,24 +349,27 @@ print_scalar_formatted (valaddr, type, format, size, stream)
       && format == 'x')
     {
       /* ok, we're going to have to get fancy here.  Assumption: a
-         long is four bytes.  */
-      unsigned long v1, v2, tmp;
+         long is four bytes.  FIXME.  */
+      unsigned long v1, v2;
 
       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;
+#if TARGET_BYTE_ORDER == LITTLE_ENDIAN
+      /* Swap the two for printing */
+      {
+        unsigned long tmp;
+
+        tmp = v1;
+        v1 = v2;
+        v2 = tmp;
+      }
 #endif
   
       switch (format)
        {
        case 'x':
-         fprintf_filtered (stream, "0x%08x%08x", v1, v2);
+         fprintf_filtered (stream, local_hex_format_custom("08x%08"), v1, v2);
          break;
        default:
          error ("Output size \"g\" unimplemented for format \"%c\".",
@@ -271,42 +394,48 @@ print_scalar_formatted (valaddr, type, format, size, stream)
   switch (format)
     {
     case 'x':
-#ifdef LONG_LONG
       if (!size)
-       size = (len < sizeof (long long) ? 'w' : 'g');
+       {
+         /* no size specified, like in print.  Print varying # of digits. */
+#if defined (LONG_LONG)
+         fprintf_filtered (stream, local_hex_format_custom("ll"), val_long);
+#else /* not LONG_LONG.  */
+         fprintf_filtered (stream, local_hex_format_custom("l"), val_long);
+#endif /* not LONG_LONG.  */
+       }
+      else
+#if defined (LONG_LONG)
       switch (size)
        {
        case 'b':
-         fprintf_filtered (stream, "0x%02llx", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("02ll"), val_long);
          break;
        case 'h':
-         fprintf_filtered (stream, "0x%04llx", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("04ll"), val_long);
          break;
-       case 0:         /* no size specified, like in print */
        case 'w':
-         fprintf_filtered (stream, "0x%08llx", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("08ll"), val_long);
          break;
        case 'g':
-         fprintf_filtered (stream, "0x%016llx", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("016ll"), val_long);
          break;
        default:
          error ("Undefined output size \"%c\".", size);
        }
-#else 
+#else /* not LONG_LONG.  */
       switch (size)
        {
        case 'b':
-         fprintf_filtered (stream, "0x%02x", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("02"), val_long);
          break;
        case 'h':
-         fprintf_filtered (stream, "0x%04x", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("04"), val_long);
          break;
-       case 0:         /* no size specified, like in print */
        case 'w':
-         fprintf_filtered (stream, "0x%08x", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("08"), val_long);
          break;
        case 'g':
-         fprintf_filtered (stream, "0x%o16x", val_long);
+         fprintf_filtered (stream, local_hex_format_custom("016"), val_long);
          break;
        default:
          error ("Undefined output size \"%c\".", size);
@@ -333,20 +462,20 @@ print_scalar_formatted (valaddr, type, format, size, stream)
     case 'o':
       if (val_long)
 #ifdef LONG_LONG
-       fprintf_filtered (stream, "0%llo", val_long);
+       fprintf_filtered (stream, local_octal_format_custom("ll"), val_long);
 #else
-       fprintf_filtered (stream, "0%o", val_long);
+       fprintf_filtered (stream, local_octal_format(), val_long);
 #endif
       else
        fprintf_filtered (stream, "0");
       break;
 
     case 'a':
-      print_address ((CORE_ADDR) val_long, stream);
+      print_address (unpack_pointer (type, valaddr), stream);
       break;
 
     case 'c':
-      value_print (value_from_long (builtin_type_char, val_long), stream, 0,
+      value_print (value_from_longest (builtin_type_char, val_long), stream, 0,
                   Val_pretty_default);
       break;
 
@@ -355,28 +484,57 @@ print_scalar_formatted (valaddr, type, format, size, stream)
        type = builtin_type_float;
       else if (len == sizeof (double))
        type = builtin_type_double;
-#ifdef IEEE_FLOAT
-      if (is_nan (type, valaddr))
-       {
-         fprintf_filtered (stream, "Nan");
-         break;
-       }
-#endif
-      {
-       double doub;
-       int inv;
-       
-       doub = unpack_double (type, valaddr, &inv);
-       if (inv)
-         fprintf_filtered (stream, "Invalid float value");
-       else
-         fprintf_filtered (stream, len > 4 ? "%.16g" : "%.6g", doub);
-      }
+      print_floating (valaddr, type, stream);
       break;
 
     case 0:
       abort ();
 
+    case 't':
+      /* Binary; 't' stands for "two".  */
+      {
+        char bits[8*(sizeof val_long) + 1];
+       char *cp = bits;
+       int width;
+
+        if (!size)
+         width = 8*(sizeof val_long);
+        else
+          switch (size)
+           {
+           case 'b':
+             width = 8;
+             break;
+           case 'h':
+             width = 16;
+             break;
+           case 'w':
+             width = 32;
+             break;
+           case 'g':
+             width = 64;
+             break;
+           default:
+             error ("Undefined output size \"%c\".", size);
+           }
+
+        bits[width] = '\0';
+        while (width-- > 0)
+          {
+            bits[width] = (val_long & 1) ? '1' : '0';
+            val_long >>= 1;
+          }
+       if (!size)
+         {
+           while (*cp && *cp == '0')
+             cp++;
+           if (*cp == '\0')
+             cp--;
+         }
+        fprintf_filtered (stream, cp);
+      }
+      break;
+
     default:
       error ("Undefined output format \"%c\".", format);
     }
@@ -393,38 +551,83 @@ set_next_address (addr)
 
   /* Make address available to the user as $_.  */
   set_internalvar (lookup_internalvar ("_"),
-                  value_from_long (builtin_type_int, (LONGEST) addr));
+                  value_from_longest (lookup_pointer_type (builtin_type_void),
+                                   (LONGEST) addr));
 }
 
-/* Print address ADDR symbolically on STREAM.
-   First print it as a number.  Then perhaps print
-   <SYMBOL + OFFSET> after the number.  */
+/* Optionally print address ADDR symbolically as <SYMBOL+OFFSET> on STREAM,
+   after LEADIN.  Print nothing if no symbolic name is found nearby.
+   DO_DEMANGLE controls whether to print a symbol in its native "raw" form,
+   or to interpret it as a possible C++ name and convert it back to source
+   form. */
 
 void
-print_address (addr, stream)
+print_address_symbolic (addr, stream, do_demangle, leadin)
      CORE_ADDR addr;
      FILE *stream;
+     int do_demangle;
+     char *leadin;
 {
-  register int i = 0;
-  register char *format;
-  register struct symbol *fs;
-  char *name;
   int name_location;
-
-  i = find_pc_partial_function (addr, &name, &name_location);
+  register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (addr);
 
   /* If nothing comes out, don't print anything symbolic.  */
   
-  if (i == 0)
-    format = "0x%x";
-  else if (addr - name_location)
-    format = "0x%x <%s+%d>";
+  if (msymbol == NULL)
+    return;
+
+  fputs_filtered (leadin, stream);
+  fputs_filtered ("<", stream);
+  if (do_demangle)
+    fputs_demangled (msymbol -> name, stream, DMGL_ANSI | DMGL_PARAMS);
+  else
+    fputs_filtered (msymbol -> name, stream);
+  name_location = msymbol -> address;
+  if (addr - name_location)
+    fprintf_filtered (stream, "+%d>", addr - name_location);
   else
-    format = "0x%x <%s>";
+    fputs_filtered (">", stream);
+}
+
+/* Print address ADDR symbolically on STREAM.
+   First print it as a number.  Then perhaps print
+   <SYMBOL + OFFSET> after the number.  */
 
-  fprintf_filtered (stream, format, addr, name, addr - name_location);
+void
+print_address (addr, stream)
+     CORE_ADDR addr;
+     FILE *stream;
+{
+#ifdef ADDR_BITS_REMOVE
+  fprintf_filtered (stream, local_hex_format(), ADDR_BITS_REMOVE(addr));
+#else
+  fprintf_filtered (stream, local_hex_format(), addr);
+#endif
+  print_address_symbolic (addr, stream, asm_demangle, " ");
+}
+
+/* Print address ADDR symbolically on STREAM.  Parameter DEMANGLE
+   controls whether to print the symbolic name "raw" or demangled.
+   Global setting "addressprint" controls whether to print hex address
+   or not.  */
+
+void
+print_address_demangle (addr, stream, do_demangle)
+     CORE_ADDR addr;
+     FILE *stream;
+     int do_demangle;
+{
+  if (addr == 0) {
+    fprintf_filtered (stream, "0");
+  } else if (addressprint) {
+    fprintf_filtered (stream, local_hex_format(), addr);
+    print_address_symbolic (addr, stream, do_demangle, " ");
+  } else {
+    print_address_symbolic (addr, stream, do_demangle, "");
+  }
 }
 \f
+
 /* Examine data at address ADDR in format FMT.
    Fetch it from memory and print on stdout.  */
 
@@ -510,17 +713,21 @@ validate_format (fmt, cmdname)
 }
 
 static void
-print_command (exp)
+print_command_1 (exp, inspect, voidprint)
      char *exp;
+     int inspect;
+     int voidprint;
 {
   struct expression *expr;
   register struct cleanup *old_chain = 0;
   register char format = 0;
   register value val;
   struct format_data fmt;
-  int histindex;
   int cleanup = 0;
 
+  /* Pass inspect flag to the rest of the print routines in a global (sigh). */
+  inspect_it = inspect;
+
   if (exp && *exp == '/')
     {
       exp++;
@@ -528,30 +735,101 @@ print_command (exp)
       validate_format (fmt, "print");
       last_format = format = fmt.format;
     }
+  else
+    {
+      fmt.count = 1;
+      fmt.format = 0;
+      fmt.size = 0;
+    }
 
   if (exp && *exp)
     {
-      expr = parse_c_expression (exp);
+      extern int objectprint;
+      struct type *type;
+      expr = parse_expression (exp);
       old_chain = make_cleanup (free_current_contents, &expr);
       cleanup = 1;
       val = evaluate_expression (expr);
+
+      /* C++: figure out what type we actually want to print it as.  */
+      type = VALUE_TYPE (val);
+
+      if (objectprint
+         && (   TYPE_CODE (type) == TYPE_CODE_PTR
+             || TYPE_CODE (type) == TYPE_CODE_REF)
+         && (   TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT
+             || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_UNION))
+       {
+         value v;
+
+         v = value_from_vtable_info (val, TYPE_TARGET_TYPE (type));
+         if (v != 0)
+           {
+             val = v;
+             type = VALUE_TYPE (val);
+           }
+       }
     }
   else
     val = access_value_history (0);
 
-  histindex = record_latest_value (val);
-  if (histindex >= 0) printf_filtered ("$%d = ", histindex);
+  if (voidprint || (val && VALUE_TYPE (val) &&
+                    TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_VOID))
+    {
+      int histindex = record_latest_value (val);
+
+      if (inspect)
+       printf ("\031(gdb-makebuffer \"%s\"  %d '(\"", exp, histindex);
+      else
+       if (histindex >= 0) printf_filtered ("$%d = ", histindex);
 
-  print_formatted (val, format, fmt.size);
-  printf_filtered ("\n");
+      print_formatted (val, format, fmt.size);
+      printf_filtered ("\n");
+      if (inspect)
+       printf("\") )\030");
+    }
 
   if (cleanup)
     do_cleanups (old_chain);
+  inspect_it = 0;      /* Reset print routines to normal */
 }
 
+/* ARGSUSED */
 static void
-output_command (exp)
+print_command (exp, from_tty)
      char *exp;
+     int from_tty;
+{
+  print_command_1 (exp, 0, 1);
+}
+
+/* Same as print, except in epoch, it gets its own window */
+/* ARGSUSED */
+static void
+inspect_command (exp, from_tty)
+     char *exp;
+     int from_tty;
+{
+  extern int epoch_interface;
+
+  print_command_1 (exp, epoch_interface, 1);
+}
+
+/* Same as print, except it doesn't print void results. */
+/* ARGSUSED */
+static void
+call_command (exp, from_tty)
+     char *exp;
+     int from_tty;
+{
+  print_command_1 (exp, 0, 0);
+}
+
+/* ARGSUSED */
+static void
+output_command (exp, from_tty)
+     char *exp;
+     int from_tty;
 {
   struct expression *expr;
   register struct cleanup *old_chain;
@@ -563,11 +841,11 @@ output_command (exp)
     {
       exp++;
       fmt = decode_format (&exp, 0, 0);
-      validate_format (fmt, "print");
+      validate_format (fmt, "output");
       format = fmt.format;
     }
 
-  expr = parse_c_expression (exp);
+  expr = parse_expression (exp);
   old_chain = make_cleanup (free_current_contents, &expr);
 
   val = evaluate_expression (expr);
@@ -577,23 +855,29 @@ output_command (exp)
   do_cleanups (old_chain);
 }
 
+/* ARGSUSED */
 static void
-set_command (exp)
+set_command (exp, from_tty)
      char *exp;
+     int from_tty;
 {
-  struct expression *expr = parse_c_expression (exp);
+  struct expression *expr = parse_expression (exp);
   register struct cleanup *old_chain
     = make_cleanup (free_current_contents, &expr);
   evaluate_expression (expr);
   do_cleanups (old_chain);
 }
 
+/* ARGSUSED */
 static void
-address_info (exp)
+address_info (exp, from_tty)
      char *exp;
+     int from_tty;
 {
   register struct symbol *sym;
-  register CORE_ADDR val;
+  register struct minimal_symbol *msymbol;
+  register long val;
+  register long basereg;
   int is_a_field_of_this;      /* C++: lookup_symbol sets this to nonzero
                                   if exp is a field of `this'. */
 
@@ -601,24 +885,20 @@ address_info (exp)
     error ("Argument required.");
 
   sym = lookup_symbol (exp, get_selected_block (), VAR_NAMESPACE, 
-                      &is_a_field_of_this);
+                      &is_a_field_of_this, (struct symtab **)NULL);
   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;
+      msymbol = lookup_minimal_symbol (exp, (struct objfile *) NULL);
 
-      if (i < misc_function_count)
-       printf ("Symbol \"%s\" is at 0x%x in a file compiled without -g.\n",
-               exp, misc_function_vector[i].address);
+      if (msymbol != NULL)
+       printf ("Symbol \"%s\" is at %s in a file compiled without debugging.\n",
+               exp, local_hex_string(msymbol -> address));
       else
        error ("No symbol \"%s\" in current context.", exp);
       return;
@@ -626,6 +906,7 @@ address_info (exp)
 
   printf ("Symbol \"%s\" is ", SYMBOL_NAME (sym));
   val = SYMBOL_VALUE (sym);
+  basereg = SYMBOL_BASEREG (sym);
 
   switch (SYMBOL_CLASS (sym))
     {
@@ -635,7 +916,7 @@ address_info (exp)
       break;
 
     case LOC_LABEL:
-      printf ("a label at address 0x%x", val);
+      printf ("a label at address %s", local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
       break;
 
     case LOC_REGISTER:
@@ -643,7 +924,7 @@ address_info (exp)
       break;
 
     case LOC_STATIC:
-      printf ("static at address 0x%x", val);
+      printf ("static storage at address %s", local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
       break;
 
     case LOC_REGPARM:
@@ -651,15 +932,43 @@ address_info (exp)
       break;
       
     case LOC_ARG:
-      printf ("an argument at offset %d", val);
+      if (SYMBOL_BASEREG_VALID (sym))
+       {
+         printf ("an argument at offset %ld from register %s",
+                 val, reg_names[basereg]);
+       }
+      else
+       {
+         printf ("an argument at offset %ld", val);
+       }
+      break;
+
+    case LOC_LOCAL_ARG:
+      if (SYMBOL_BASEREG_VALID (sym))
+       {
+         printf ("an argument at offset %ld from register %s",
+                 val, reg_names[basereg]);
+       }
+      else
+       {
+         printf ("an argument at frame offset %ld", val);
+       }
       break;
 
     case LOC_LOCAL:
-      printf ("a local variable at frame offset %d", val);
+      if (SYMBOL_BASEREG_VALID (sym))
+       {
+         printf ("a local variable at offset %ld from register %s",
+                 val, reg_names[basereg]);
+       }
+      else
+       {
+         printf ("a local variable at frame offset %ld", val);
+       }
       break;
 
     case LOC_REF_ARG:
-      printf ("a reference argument at offset %d", val);
+      printf ("a reference argument at offset %ld", val);
       break;
 
     case LOC_TYPEDEF:
@@ -667,8 +976,12 @@ address_info (exp)
       break;
 
     case LOC_BLOCK:
-      printf ("a function at address 0x%x",
-             BLOCK_START (SYMBOL_BLOCK_VALUE (sym)));
+      printf ("a function at address %s",
+             local_hex_string(BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
+      break;
+
+    default:
+      printf ("of unknown (botched) type");
       break;
     }
   printf (".\n");
@@ -692,15 +1005,13 @@ x_command (exp, from_tty)
     {
       exp++;
       fmt = decode_format (&exp, last_format, last_size);
-      last_size = fmt.size;
-      last_format = fmt.format;
     }
 
   /* If we have an expression, evaluate it and use it as the address.  */
 
   if (exp != 0 && *exp != 0)
     {
-      expr = parse_c_expression (exp);
+      expr = parse_expression (exp);
       /* Cause expression not to be there any more
         if this command is repeated with Newline.
         But don't clobber a user-defined command's definition.  */
@@ -708,6 +1019,8 @@ x_command (exp, from_tty)
        *exp = 0;
       old_chain = make_cleanup (free_current_contents, &expr);
       val = evaluate_expression (expr);
+      if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_REF)
+       val = value_ind (val);
       /* In rvalue contexts, such as this, functions are coerced into
         pointers to functions.  This makes "x/i main" work.  */
       if (/* last_format == 'i'
@@ -715,19 +1028,25 @@ x_command (exp, from_tty)
          && VALUE_LVAL (val) == lval_memory)
        next_address = VALUE_ADDRESS (val);
       else
-       next_address = (CORE_ADDR) value_as_long (val);
+       next_address = value_as_pointer (val);
       do_cleanups (old_chain);
     }
 
   do_examine (fmt, next_address);
 
+  /* If the examine succeeds, we remember its size and format for next time.  */
+  last_size = fmt.size;
+  last_format = fmt.format;
+
   /* Set a couple of internal variables if appropriate. */
   if (last_examine_value)
     {
-      /* Make last address examined available to the user as $_.  */
+      /* Make last address examined available to the user as $_.  Use
+        the correct pointer type.  */
       set_internalvar (lookup_internalvar ("_"),
-                      value_from_long (builtin_type_int, 
-                                       (LONGEST) last_examine_address));
+              value_from_longest (
+                lookup_pointer_type (VALUE_TYPE (last_examine_value)),
+                                  (LONGEST) last_examine_address));
       
       /* Make contents of last address examined available to the user as $__.*/
       set_internalvar (lookup_internalvar ("__"), last_examine_value);
@@ -736,9 +1055,12 @@ x_command (exp, from_tty)
 \f
 /* Commands for printing types of things.  */
 
+/* Print type of EXP, or last thing in value history if EXP == NULL.
+   show is passed to type_print.  */
 static void
-whatis_command (exp)
+whatis_exp (exp, show)
      char *exp;
+     int show;
 {
   struct expression *expr;
   register value val;
@@ -746,7 +1068,7 @@ whatis_command (exp)
 
   if (exp)
     {
-      expr = parse_c_expression (exp);
+      expr = parse_expression (exp);
       old_chain = make_cleanup (free_current_contents, &expr);
       val = evaluate_type (expr);
     }
@@ -754,98 +1076,71 @@ whatis_command (exp)
     val = access_value_history (0);
 
   printf_filtered ("type = ");
-  /* Most of the time users do not want to see all the fields
-     in a structure.  If they do they can use the "ptype" command.
-     Hence the "-1" below.  */
-  type_print (VALUE_TYPE (val), "", stdout, -1);
+  type_print (VALUE_TYPE (val), "", stdout, show);
   printf_filtered ("\n");
 
   if (exp)
     do_cleanups (old_chain);
 }
 
+/* ARGSUSED */
 static void
-ptype_command (typename)
-     char *typename;
+whatis_command (exp, from_tty)
+     char *exp;
+     int from_tty;
 {
-  register char *p = typename;
-  register int len;
-  extern struct block *get_current_block ();
-  register struct block *b
-    = (have_inferior_p () || have_core_file_p ()) ? get_current_block () : 0;
-  register struct type *type;
+  /* Most of the time users do not want to see all the fields
+     in a structure.  If they do they can use the "ptype" command.
+     Hence the "-1" below.  */
+  whatis_exp (exp, -1);
+}
 
-  if (typename == 0)
-    error_no_arg ("type name");
+/* Simple subroutine for ptype_command.  */
+static
+struct type *
+ptype_eval(exp)
+   struct expression *exp;
+{
+   if(exp->elts[0].opcode==OP_TYPE)
+      return exp->elts[1].type;
+   else
+      return 0;
+}
 
-  while (*p && *p != ' ' && *p != '\t') p++;
-  len = p - typename;
-  while (*p == ' ' || *p == '\t') p++;
+/* TYPENAME is either the name of a type, or an expression.  */
+/* ARGSUSED */
+static void
+ptype_command (typename, from_tty)
+     char *typename;
+     int from_tty;
+{
+  register struct type *type;
+  struct expression *expr;
+  register struct cleanup *old_chain;
 
-  if (len == 6 && !strncmp (typename, "struct", 6))
-    type = lookup_struct (p, b);
-  else if (len == 5 && !strncmp (typename, "union", 5))
-    type = lookup_union (p, b);
-  else if (len == 4 && !strncmp (typename, "enum", 4))
-    type = lookup_enum (p, b);
+  if (typename)
+  {
+     expr = parse_expression (typename);
+     old_chain = make_cleanup (free_current_contents, &expr);
+     type = ptype_eval (expr);
+
+     if(type)
+     {
+       printf_filtered ("type = ");
+       type_print (type, "", stdout, 1);
+       printf_filtered ("\n");
+       do_cleanups (old_chain);
+     }
+     else
+     {
+       do_cleanups (old_chain);
+       whatis_exp (typename, 1);
+     }
+  }
   else
-    {
-      type = lookup_typename (typename, b, 1);
-      if (type == 0)
-       {
-         register struct symbol *sym
-           = lookup_symbol (typename, b, STRUCT_NAMESPACE, 0);
-         if (sym == 0)
-           error ("No type named %s.", typename);
-         printf_filtered ("No type named %s, but there is a ",
-                 typename);
-         switch (TYPE_CODE (SYMBOL_TYPE (sym)))
-           {
-           case TYPE_CODE_STRUCT:
-             printf_filtered ("struct");
-             break;
-
-           case TYPE_CODE_UNION:
-             printf_filtered ("union");
-             break;
-
-           case TYPE_CODE_ENUM:
-             printf_filtered ("enum");
-           }
-         printf_filtered (" %s.  Type \"help ptype\".\n", typename);
-         type = SYMBOL_TYPE (sym);
-       }
-    }
-
-  type_print (type, "", stdout, 1);
-  printf_filtered ("\n");
+     whatis_exp (typename, 1);
 }
 \f
-enum display_status {disabled, enabled};
-
-struct display
-{
-  /* Chain link to next auto-display item.  */
-  struct display *next;
-  /* Expression to be evaluated and displayed.  */
-  struct expression *exp;
-  /* Item number of this auto-display item.  */
-  int number;
-  /* Display format specified.  */
-  struct format_data format;
-  /* 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
-   automatically each time the program stops.  */
-
-static struct display *display_chain;
-
-static int display_number;
-
 /* Add an expression to the auto-display chain.
    Specify the expression.  */
 
@@ -857,7 +1152,6 @@ 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)
     {
@@ -882,7 +1176,7 @@ display_command (exp, from_tty)
     }
 
   innermost_block = 0;
-  expr = parse_c_expression (exp);
+  expr = parse_expression (exp);
 
   new = (struct display *) xmalloc (sizeof (struct display));
 
@@ -894,7 +1188,7 @@ display_command (exp, from_tty)
   new->status = enabled;
   display_chain = new;
 
-  if (from_tty && have_inferior_p ())
+  if (from_tty && target_has_execution)
     do_one_display (new);
 
   dont_repeat ();
@@ -904,8 +1198,8 @@ static void
 free_display (d)
      struct display *d;
 {
-  free (d->exp);
-  free (d);
+  free ((PTR)d->exp);
+  free ((PTR)d);
 }
 
 /* Clear out the display_chain.
@@ -919,15 +1213,15 @@ clear_displays ()
 
   while (d = display_chain)
     {
-      free (d->exp);
+      free ((PTR)d->exp);
       display_chain = d->next;
-      free (d);
+      free ((PTR)d);
     }
 }
 
 /* Delete the auto-display number NUM.  */
 
-void
+static void
 delete_display (num)
      int num;
 {
@@ -961,13 +1255,13 @@ delete_display (num)
    Specify the element numbers.  */
 
 static void
-undisplay_command (args)
+undisplay_command (args, from_tty)
      char *args;
+     int from_tty;
 {
   register char *p = args;
   register char *p1;
   register int num;
-  register struct display *d, *d1;
 
   if (args == 0)
     {
@@ -1019,6 +1313,8 @@ do_one_display (d)
   printf_filtered ("%d: ", d->number);
   if (d->format.size)
     {
+      CORE_ADDR addr;
+      
       printf_filtered ("x/");
       if (d->format.count != 1)
        printf_filtered ("%d", d->format.count);
@@ -1031,9 +1327,12 @@ do_one_display (d)
        printf_filtered ("\n");
       else
        printf_filtered ("  ");
-      do_examine (d->format,
-                 (CORE_ADDR) value_as_long (evaluate_expression (d->exp)));
-
+      
+      addr = value_as_pointer (evaluate_expression (d->exp));
+      if (d->format.format == 'i')
+       addr = ADDR_BITS_REMOVE (addr);
+      
+      do_examine (d->format, addr);
     }
   else
     {
@@ -1093,7 +1392,9 @@ disable_current_display ()
 }
 
 static void
-display_info ()
+display_info (ignore, from_tty)
+     char *ignore;
+     int from_tty;
 {
   register struct display *d;
 
@@ -1119,9 +1420,10 @@ Num Enb Expression\n");
     }
 }
 
-void
-enable_display (args)
+static void
+enable_display (args, from_tty)
      char *args;
+     int from_tty;
 {
   register char *p = args;
   register char *p1;
@@ -1158,14 +1460,14 @@ enable_display (args)
       }
 }
 
-void
+/* ARGSUSED */
+static void
 disable_display_command (args, from_tty)
      char *args;
      int from_tty;
 {
   register char *p = args;
   register char *p1;
-  register int num;
   register struct display *d;
 
   if (p == 0)
@@ -1182,8 +1484,6 @@ disable_display_command (args, from_tty)
        if (*p1 && *p1 != ' ' && *p1 != '\t')
          error ("Arguments must be display numbers.");
        
-       num = atoi (p);
-       
        disable_display (atoi (p));
 
        p = p1;
@@ -1199,25 +1499,20 @@ disable_display_command (args, from_tty)
 void
 print_variable_value (var, frame, stream)
      struct symbol *var;
-     CORE_ADDR frame;
+     FRAME frame;
      FILE *stream;
 {
   value val = read_var_value (var, frame);
   value_print (val, stream, 0, Val_pretty_default);
 }
 
-static int
-compare_ints (i, j)
-     int *i, *j;
-{
-  return *i - *j;
-}
-
 /* Print the arguments of a stack frame, given the function FUNC
    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 ();
+/* References here and elsewhere to "number of args according to the
+   stack frame" appear in all cases to refer to "number of ints of args
+   according to the stack frame".  At least for VAX, i386, isi.  */
 
 void
 print_frame_args (func, fi, num, stream)
@@ -1230,13 +1525,15 @@ print_frame_args (func, fi, num, stream)
   int nsyms = 0;
   int first = 1;
   register int i;
-  register int last_regparm = 0;
-  register struct symbol *lastsym, *sym, *nextsym;
+  register struct symbol *sym;
   register value val;
-  /* Offset of stack argument that is at the highest offset.
+  /* Offset of next stack argument beyond the one we have seen that is
+     at the highest offset.
      -1 if we haven't come to a stack argument yet.  */
-  CORE_ADDR highest_offset = (CORE_ADDR) -1;
-  register CORE_ADDR addr = FRAME_ARGS_ADDRESS (fi);
+  long highest_offset = -1;
+  int arg_size;
+  /* Number of ints of arguments that we have printed so far.  */
+  int args_printed = 0;
 
   if (func)
     {
@@ -1249,72 +1546,75 @@ print_frame_args (func, fi, num, stream)
       QUIT;
       sym = BLOCK_SYM (b, i);
 
-      if (SYMBOL_CLASS (sym) != LOC_REGPARM
-         && SYMBOL_CLASS (sym) != LOC_ARG
-         && SYMBOL_CLASS (sym) != LOC_REF_ARG)
-       continue;
+      /* Keep track of the highest stack argument offset seen, and
+        skip over any kinds of symbols we don't care about.  */
 
-      /* Print the next arg.  */
-      if (SYMBOL_CLASS (sym) == LOC_REGPARM)
-       val = value_from_register (SYMBOL_TYPE (sym),
-                                  SYMBOL_VALUE (sym),
-                                  FRAME_INFO_ID (fi));
-      else
+      switch (SYMBOL_CLASS (sym)) {
+      case LOC_ARG:
+      case LOC_REF_ARG:
        {
-         int current_offset = SYMBOL_VALUE (sym);
-         int arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
-         
-         if (SYMBOL_CLASS (sym) == LOC_REF_ARG)
-           val = value_at (SYMBOL_TYPE (sym),
-                           read_memory_integer (addr + current_offset,
-                                                sizeof (CORE_ADDR)));
-         else
-           val = value_at (SYMBOL_TYPE (sym), addr + current_offset);
+         long current_offset = SYMBOL_VALUE (sym);
 
-         /* Round up address of next arg to multiple of size of int.  */
+         arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
+         
+         /* Compute address of next argument by adding the size of
+            this argument and rounding to an int boundary.  */
          current_offset
-           = (((current_offset + sizeof (int) - 1) / sizeof (int))
-              * sizeof (int));
+           = ((current_offset + arg_size + sizeof (int) - 1)
+              & ~(sizeof (int) - 1));
 
          /* If this is the highest offset seen yet, set highest_offset.  */
-         if (highest_offset == (CORE_ADDR)-1
-             || ((current_offset
-                  + (arg_size - sizeof (int) + 3) / (sizeof (int)))
-                 > highest_offset))
+         if (highest_offset == -1
+             || (current_offset > highest_offset))
            highest_offset = current_offset;
+
+         /* Add the number of ints we're about to print to args_printed.  */
+         args_printed += (arg_size + sizeof (int) - 1) / sizeof (int);
        }
 
-      if (! first)
-       fprintf_filtered (stream, ", ");
-      fputs_filtered (SYMBOL_NAME (sym), stream);
-      fputs_filtered ("=", stream);
+      /* We care about types of symbols, but don't need to keep track of
+        stack offsets in them.  */
+      case LOC_REGPARM:
+      case LOC_LOCAL_ARG:
+       break;
+
+      /* Other types of symbols we just skip over.  */
+      default:
+       continue;
+      }
 
-/* Nonzero if a LOC_ARG which is a struct is useless.  */
-#if !defined (STRUCT_ARG_SYM_GARBAGE)
-#define STRUCT_ARG_SYM_GARBAGE(gcc_p) 0
+      /* We have to re-look-up the symbol because arguments often have
+        two entries (one a parameter, one a register or local), and the one
+        we want is the non-parm, which lookup_symbol will find for
+        us.  After this, sym could be any SYMBOL_CLASS...  */
+#ifdef IBM6000_TARGET
+      /* AIX/RS6000 implements a concept of traceback tables, in which case
+         it creates nameless parameters. Looking for those parameter symbols
+        will result in an error. */
+
+      if ( *SYMBOL_NAME (sym))
 #endif
+      sym = lookup_symbol (SYMBOL_NAME (sym),
+                   b, VAR_NAMESPACE, (int *)NULL, (struct symtab **)NULL);
 
-      if (STRUCT_ARG_SYM_GARBAGE (b->gcc_compile_flag)
-         && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
-         && SYMBOL_CLASS (sym) == LOC_ARG)
-       {
-         /* Try looking up that name.  SunOS4 puts out a usable
-            symbol as a local variable (in addition to the one
-            for the arg).  */
-         struct symbol *sym2 =
-           lookup_symbol (SYMBOL_NAME (sym), b, VAR_NAMESPACE, 0);
-
-         if (sym2 != NULL)
-           val = value_of_variable (sym2);
-         else
-           {
-             fputs_filtered ("?", stream);
-             first = 0;
-             continue;
-           }
-       }
+      /* Print the current arg.  */
+      if (! first)
+       fprintf_filtered (stream, ", ");
+      wrap_here ("    ");
+      fprint_symbol (stream, SYMBOL_NAME (sym));
+      fputs_filtered ("=", stream);
 
-      value_print (val, stream, 0, Val_no_prettyprint);
+      /* Avoid value_print because it will deref ref parameters.  We just
+        want to print their addresses.  Print ??? for args whose address
+        we do not know.  We pass 2 as "recurse" to val_print because our
+        standard indentation here is 4 spaces, and val_print indents
+        2 for each recurse.  */
+      val = read_var_value (sym, FRAME_INFO_ID (fi));
+      if (val)
+        val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), VALUE_ADDRESS (val),
+                  stream, 0, 0, 2, Val_no_prettyprint);
+      else
+       fputs_filtered ("???", stream);
       first = 0;
     }
 
@@ -1322,30 +1622,39 @@ print_frame_args (func, fi, num, stream)
      enough about the stack to find them.  */
   if (num != -1)
     {
-      if (highest_offset != (CORE_ADDR) -1
-         && num * sizeof (int) + FRAME_ARGS_SKIP > highest_offset)
-       print_frame_nameless_args (addr,
-                                  highest_offset + sizeof (int),
-                                  num * sizeof (int) + FRAME_ARGS_SKIP,
-                                  stream);
-      else 
-       print_frame_nameless_args (addr, FRAME_ARGS_SKIP,
-                                  num * sizeof (int) + FRAME_ARGS_SKIP,
-                                  stream);
+      long start;
+      CORE_ADDR addr;
+
+      if (highest_offset == -1)
+       start = FRAME_ARGS_SKIP;
+      else
+       start = highest_offset;
+
+      addr = FRAME_ARGS_ADDRESS (fi);
+      if (addr)
+        print_frame_nameless_args (addr, start, num - args_printed,
+                                  first, stream);
     }
 }
 
+/* Print nameless args on STREAM.
+   ARGSADDR is the address of the arglist, START is the offset
+   of the first nameless arg, and NUM is the number of nameless args to
+   print.  FIRST is nonzero if this is the first argument (not just
+   the first nameless arg).  */
 static void
-print_frame_nameless_args (argsaddr, start, end, stream)
+print_frame_nameless_args (argsaddr, start, num, first, stream)
      CORE_ADDR argsaddr;
-     int start;
-     int end;
+     long start;
+     int num;
+     int first;
      FILE *stream;
 {
-  while (start < end)
+  int i;
+  for (i = 0; i < num; i++)
     {
       QUIT;
-      if (start != FRAME_ARGS_SKIP)
+      if (!first)
        fprintf_filtered (stream, ", ");
 #ifndef PRINT_TYPELESS_INTEGER
       fprintf_filtered (stream, "%d",
@@ -1356,13 +1665,16 @@ print_frame_nameless_args (argsaddr, start, end, stream)
                              read_memory_integer (argsaddr + start,
                                                   sizeof (int)));
 #endif
+      first = 0;
       start += sizeof (int);
     }
 }
 \f
+/* ARGSUSED */
 static void
-printf_command (arg)
+printf_command (arg, from_tty)
      char *arg;
+     int from_tty;
 {
   register char *f;
   register char *s = arg;
@@ -1456,7 +1768,7 @@ printf_command (arg)
       if (*f++ == '%')
        {
          lcount = 0;
-         while (index ("0123456789.hlL-+ #", *f)) 
+         while (strchr ("0123456789.hlL-+ #", *f)) 
            {
              if (*f == 'l' || *f == 'L')
                lcount++;
@@ -1480,7 +1792,7 @@ printf_command (arg)
       {
        char *s1;
        if (nargs == allocated_args)
-         val_args = (value *) xrealloc (val_args,
+         val_args = (value *) xrealloc ((char *) val_args,
                                         (allocated_args *= 2)
                                         * sizeof (value));
        s1 = s;
@@ -1515,8 +1827,9 @@ printf_command (arg)
        if (argclass[i] == string_arg)
          {
            char *str;
-           int tem, j;
-           tem = value_as_long (val_args[i]);
+           CORE_ADDR tem;
+           int j;
+           tem = value_as_pointer (val_args[i]);
  
            /* This is a %s argument.  Find the length of the string.  */
            for (j = 0; ; j++)
@@ -1552,12 +1865,26 @@ printf_command (arg)
          else
 #endif
            {
-             *((int *) &arg_bytes[argindex]) = value_as_long (val_args[i]);
-             argindex += sizeof (int);
+             *((long *) &arg_bytes[argindex]) = value_as_long (val_args[i]);
+             argindex += sizeof (long);
            }
       }
   }
+
+  /* There is not a standard way to make a va_list, so we need
+     to do various things for different systems.  */
+#if defined (__INT_VARARGS_H)
+  {
+    va_list list;
+
+    list.__va_arg = 0;
+    list.__va_stk = (int *) arg_bytes;
+    list.__va_reg = (int *) arg_bytes;
+    vprintf (string, list);
+  }
+#else /* No __INT_VARARGS_H.  */
   vprintf (string, arg_bytes);
+#endif /* No __INT_VARARGS_H.  */
 }
 \f
 /* Helper function for asdump_command.  Finds the bounds of a function
@@ -1592,6 +1919,7 @@ containing_function_bounds (pc, low, high)
    Two arguments are interpeted as bounds within which to dump
    assembly.  */
 
+/* ARGSUSED */
 static void
 disassemble_command (arg, from_tty)
      char *arg;
@@ -1610,7 +1938,7 @@ disassemble_command (arg, from_tty)
       if (!containing_function_bounds (pc, &low, &high))
        error ("No function contains pc specified by selected frame.\n");
     }
-  else if (!(space_index = (char *) index (arg, ' ')))
+  else if (!(space_index = (char *) strchr (arg, ' ')))
     {
       /* One argument.  */
       pc = parse_and_eval_address (arg);
@@ -1633,7 +1961,8 @@ disassemble_command (arg, from_tty)
       printf_filtered ("for function %s:\n", name);
     }
   else
-    printf_filtered ("from 0x%x to 0x%x:\n", low, high);
+    printf_filtered ("from %s ", local_hex_string(low));
+    printf_filtered ("to %s:\n", local_hex_string(high));
 
   /* Dump the specified range.  */
   for (pc = low; pc < high; )
@@ -1649,9 +1978,6 @@ disassemble_command (arg, from_tty)
 }
 
 \f
-extern struct cmd_list_element *enablelist, *disablelist, *deletelist;
-extern struct cmd_list_element *cmdlist, *setlist;
-
 void
 _initialize_printcmd ()
 {
@@ -1689,6 +2015,11 @@ The selected stack frame's lexical context is used to look up the name.");
   add_com ("whatis", class_vars, whatis_command,
           "Print data type of expression EXP.");
 
+#if 0
+  add_com ("whereis", class_vars, whereis_command,
+          "Print line number and file of definition of variable.");
+#endif
+  
   add_info ("display", display_info,
            "Expressions to display when program stops, with code numbers.");
 
@@ -1740,9 +2071,17 @@ 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",
+\nWith a subcommand, this command modifies parts of the gdb environment.\n\
+You can see these environment settings with the \"show\" command.",
                   &setlist, "set ", 1, &cmdlist);
 
+  /* "call" is the same as "set", but handy for dbx users to call fns. */
+  add_com ("call", class_vars, call_command,
+          "Call a function in the inferior process.\n\
+The argument is the function name and arguments, in the notation of the\n\
+current working language.  The result is printed and saved in the value\n\
+history, if it is not void.");
+
   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\
@@ -1764,7 +2103,7 @@ all registers saved by frames farther in) or else to debugger\n\
 \"convenience\" variables (any such name not a known register).\n\
 Use assignment expressions to give values to convenience variables.\n",
                   "\n\
-\{TYPE}ADREXP refers to a datum of data type TYPE, located at address ADREXP.\n\
+{TYPE}ADREXP refers to a datum of data type TYPE, located at address ADREXP.\n\
 @ is a binary operator for treating consecutive data objects\n\
 anywhere in memory as an array.  FOO@NUM gives an array whose first\n\
 element is FOO, whose second element is stored in the space following\n\
@@ -1772,6 +2111,10 @@ where FOO is stored, etc.  FOO must be an expression whose value\n\
 resides in memory.\n",
                   "\n\
 EXP may be preceded with /FMT, where FMT is a format letter\n\
-but no count or size letter (see \"x\" command)."));
+but no count or size letter (see \"x\" command).", NULL));
   add_com_alias ("p", "print", class_vars, 1);
+
+  add_com ("inspect", class_vars, inspect_command,
+"Same as \"print\" command, except that if you are running in the epoch\n\
+environment, the value is printed in its own window.");
 }
This page took 0.044114 seconds and 4 git commands to generate.