bfd:
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 294e09f58aba4dafa8ca2e7caa1c58bf15a5fe66..99c376f47b9807127492ce199a29c5c5beaae3c6 100644 (file)
@@ -1,14 +1,14 @@
 /* Print values for GDB, the GNU debugger.
 
-   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
-   Inc.
+   Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    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 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +17,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdb_string.h"
 #include "valprint.h"
 #include "floatformat.h"
 #include "doublest.h"
+#include "exceptions.h"
+#include "dfp.h"
 
 #include <errno.h>
 
 /* Prototypes for local functions */
 
-static int partial_memory_read (CORE_ADDR memaddr, char *myaddr,
+static int partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
                                int len, int *errnoptr);
 
 static void show_print (char *, int);
@@ -67,44 +67,123 @@ void _initialize_valprint (void);
 
 unsigned int print_max;
 #define PRINT_MAX_DEFAULT 200  /* Start print_max off at this value. */
+static void
+show_print_max (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Limit on string chars or array elements to print is %s.\n"),
+                   value);
+}
+
 
 /* Default input and output radixes, and output format letter.  */
 
 unsigned input_radix = 10;
+static void
+show_input_radix (struct ui_file *file, int from_tty,
+                 struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Default input radix for entering numbers is %s.\n"),
+                   value);
+}
+
 unsigned output_radix = 10;
+static void
+show_output_radix (struct ui_file *file, int from_tty,
+                  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Default output radix for printing of values is %s.\n"),
+                   value);
+}
 int output_format = 0;
 
+/* By default we print arrays without printing the index of each element in
+   the array.  This behavior can be changed by setting PRINT_ARRAY_INDEXES.  */
+
+static int print_array_indexes = 0;
+static void
+show_print_array_indexes (struct ui_file *file, int from_tty,
+                         struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Printing of array indexes is %s.\n"), value);
+}
+
 /* Print repeat counts if there are more than this many repetitions of an
    element in an array.  Referenced by the low level language dependent
    print routines. */
 
 unsigned int repeat_count_threshold = 10;
+static void
+show_repeat_count_threshold (struct ui_file *file, int from_tty,
+                            struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Threshold for repeated print elements is %s.\n"),
+                   value);
+}
 
 /* If nonzero, stops printing of char arrays at first null. */
 
 int stop_print_at_null;
+static void
+show_stop_print_at_null (struct ui_file *file, int from_tty,
+                        struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Printing of char arrays to stop at first null char is %s.\n"),
+                   value);
+}
 
 /* Controls pretty printing of structures. */
 
 int prettyprint_structs;
+static void
+show_prettyprint_structs (struct ui_file *file, int from_tty,
+                         struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Prettyprinting of structures is %s.\n"), value);
+}
 
 /* Controls pretty printing of arrays.  */
 
 int prettyprint_arrays;
+static void
+show_prettyprint_arrays (struct ui_file *file, int from_tty,
+                        struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Prettyprinting of arrays is %s.\n"), value);
+}
 
 /* If nonzero, causes unions inside structures or other unions to be
    printed. */
 
 int unionprint;                        /* Controls printing of nested unions.  */
+static void
+show_unionprint (struct ui_file *file, int from_tty,
+                struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("\
+Printing of unions interior to structures is %s.\n"),
+                   value);
+}
 
 /* If nonzero, causes machine addresses to be printed in certain contexts. */
 
 int addressprint;              /* Controls printing of machine addresses */
+static void
+show_addressprint (struct ui_file *file, int from_tty,
+                  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Printing of addresses is %s.\n"), value);
+}
 \f
 
-/* Print data of type TYPE located at VALADDR (within GDB), which came from
-   the inferior at address ADDRESS, onto stdio stream STREAM according to
-   FORMAT (a letter, or 0 for natural format using TYPE).
+/* Print using the given LANGUAGE the data of type TYPE located at VALADDR
+   (within GDB), which came from the inferior at address ADDRESS, onto
+   stdio stream STREAM according to FORMAT (a letter, or 0 for natural
+   format using TYPE).
 
    If DEREF_REF is nonzero, then dereference references, otherwise just print
    them like pointers.
@@ -123,15 +202,18 @@ int addressprint;         /* Controls printing of machine addresses */
 
 
 int
-val_print (struct type *type, char *valaddr, int embedded_offset,
-          CORE_ADDR address, struct ui_file *stream, int format, int deref_ref,
-          int recurse, enum val_prettyprint pretty)
+val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+          CORE_ADDR address, struct ui_file *stream, int format,
+          int deref_ref, int recurse, enum val_prettyprint pretty,
+          const struct language_defn *language)
 {
+  volatile struct gdb_exception except;
+  volatile enum val_prettyprint real_pretty = pretty;
+  int ret = 0;
+
   struct type *real_type = check_typedef (type);
   if (pretty == Val_pretty_default)
-    {
-      pretty = prettyprint_structs ? Val_prettyprint : Val_no_prettyprint;
-    }
+    real_pretty = prettyprint_structs ? Val_prettyprint : Val_no_prettyprint;
 
   QUIT;
 
@@ -146,29 +228,80 @@ val_print (struct type *type, char *valaddr, int embedded_offset,
       return (0);
     }
 
-  return (LA_VAL_PRINT (type, valaddr, embedded_offset, address,
-                       stream, format, deref_ref, recurse, pretty));
+  TRY_CATCH (except, RETURN_MASK_ERROR)
+    {
+      ret = language->la_val_print (type, valaddr, embedded_offset, address,
+                                   stream, format, deref_ref, recurse,
+                                   real_pretty);
+    }
+  if (except.reason < 0)
+    fprintf_filtered (stream, _("<error reading variable>"));
+
+  return ret;
 }
 
-/* Print the value VAL in C-ish syntax on stream STREAM.
-   FORMAT is a format-letter, or 0 for print in natural format of data type.
-   If the object printed is a string pointer, returns
-   the number of string bytes printed.  */
+/* Check whether the value VAL is printable.  Return 1 if it is;
+   return 0 and print an appropriate error message to STREAM if it
+   is not.  */
 
-int
-value_print (struct value *val, struct ui_file *stream, int format,
-            enum val_prettyprint pretty)
+static int
+value_check_printable (struct value *val, struct ui_file *stream)
 {
   if (val == 0)
     {
-      printf_filtered ("<address of value unknown>");
+      fprintf_filtered (stream, _("<address of value unknown>"));
       return 0;
     }
-  if (VALUE_OPTIMIZED_OUT (val))
+
+  if (value_optimized_out (val))
     {
-      printf_filtered ("<value optimized out>");
+      fprintf_filtered (stream, _("<value optimized out>"));
       return 0;
     }
+
+  return 1;
+}
+
+/* Print using the given LANGUAGE the value VAL onto stream STREAM according
+   to FORMAT (a letter, or 0 for natural format using TYPE).
+
+   If DEREF_REF is nonzero, then dereference references, otherwise just print
+   them like pointers.
+
+   The PRETTY parameter controls prettyprinting.
+
+   If the data are a string pointer, returns the number of string characters
+   printed.
+
+   This is a preferable interface to val_print, above, because it uses
+   GDB's value mechanism.  */
+
+int
+common_val_print (struct value *val, struct ui_file *stream, int format,
+                 int deref_ref, int recurse, enum val_prettyprint pretty,
+                 const struct language_defn *language)
+{
+  if (!value_check_printable (val, stream))
+    return 0;
+
+  return val_print (value_type (val), value_contents_all (val),
+                   value_embedded_offset (val), VALUE_ADDRESS (val),
+                   stream, format, deref_ref, recurse, pretty,
+                   language);
+}
+
+/* Print the value VAL in C-ish syntax on stream STREAM.
+   FORMAT is a format-letter, or 0 for print in natural format of data type.
+   If the object printed is a string pointer, returns
+   the number of string bytes printed.  */
+
+int
+value_print (struct value *val, struct ui_file *stream, int format,
+            enum val_prettyprint pretty)
+{
+  if (!value_check_printable (val, stream))
+    return 0;
+
   return LA_VALUE_PRINT (val, stream, format, pretty);
 }
 
@@ -177,9 +310,11 @@ value_print (struct value *val, struct ui_file *stream, int format,
    value.  STREAM is where to print the value.  */
 
 void
-val_print_type_code_int (struct type *type, char *valaddr,
+val_print_type_code_int (struct type *type, const gdb_byte *valaddr,
                         struct ui_file *stream)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (current_gdbarch);
+
   if (TYPE_LENGTH (type) > sizeof (LONGEST))
     {
       LONGEST val;
@@ -197,7 +332,7 @@ val_print_type_code_int (struct type *type, char *valaddr,
             complement (a reasonable assumption, I think) and do
             better than this.  */
          print_hex_chars (stream, (unsigned char *) valaddr,
-                          TYPE_LENGTH (type));
+                          TYPE_LENGTH (type), byte_order);
        }
     }
   else
@@ -207,204 +342,76 @@ val_print_type_code_int (struct type *type, char *valaddr,
     }
 }
 
-/* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g.
-   The raison d'etre of this function is to consolidate printing of 
-   LONG_LONG's into this one function.  Some platforms have long longs but
-   don't have a printf() that supports "ll" in the format string.  We handle
-   these by seeing if the number is representable as either a signed or
-   unsigned long, depending upon what format is desired, and if not we just
-   bail out and print the number in hex.
-
-   The format chars b,h,w,g are from print_scalar_formatted().  If USE_LOCAL,
-   format it according to the current language (this should be used for most
-   integers which GDB prints, the exception is things like protocols where
-   the format of the integer is a protocol thing, not a user-visible thing).
- */
-
-#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
-static void print_decimal (struct ui_file * stream, char *sign,
-                          int use_local, ULONGEST val_ulong);
-static void
-print_decimal (struct ui_file *stream, char *sign, int use_local,
-              ULONGEST val_ulong)
+void
+val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
+                          struct ui_file *stream)
 {
-  unsigned long temp[3];
-  int i = 0;
-  do
-    {
-      temp[i] = val_ulong % (1000 * 1000 * 1000);
-      val_ulong /= (1000 * 1000 * 1000);
-      i++;
-    }
-  while (val_ulong != 0 && i < (sizeof (temp) / sizeof (temp[0])));
-  switch (i)
+  ULONGEST val = unpack_long (type, valaddr);
+  int bitpos, nfields = TYPE_NFIELDS (type);
+
+  fputs_filtered ("[ ", stream);
+  for (bitpos = 0; bitpos < nfields; bitpos++)
     {
-    case 1:
-      fprintf_filtered (stream, "%s%lu",
-                       sign, temp[0]);
-      break;
-    case 2:
-      fprintf_filtered (stream, "%s%lu%09lu",
-                       sign, temp[1], temp[0]);
-      break;
-    case 3:
-      fprintf_filtered (stream, "%s%lu%09lu%09lu",
-                       sign, temp[2], temp[1], temp[0]);
-      break;
-    default:
-      internal_error (__FILE__, __LINE__, "failed internal consistency check");
+      if (TYPE_FIELD_BITPOS (type, bitpos) != -1
+         && (val & ((ULONGEST)1 << bitpos)))
+       {
+         if (TYPE_FIELD_NAME (type, bitpos))
+           fprintf_filtered (stream, "%s ", TYPE_FIELD_NAME (type, bitpos));
+         else
+           fprintf_filtered (stream, "#%d ", bitpos);
+       }
     }
-  return;
+  fputs_filtered ("]", stream);
 }
-#endif
+
+/* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g.
+   The raison d'etre of this function is to consolidate printing of 
+   LONG_LONG's into this one function. The format chars b,h,w,g are 
+   from print_scalar_formatted().  Numbers are printed using C
+   format. 
+
+   USE_C_FORMAT means to use C format in all cases.  Without it, 
+   'o' and 'x' format do not include the standard C radix prefix
+   (leading 0 or 0x). 
+   
+   Hilfinger/2004-09-09: USE_C_FORMAT was originally called USE_LOCAL
+   and was intended to request formating according to the current
+   language and would be used for most integers that GDB prints.  The
+   exceptional cases were things like protocols where the format of
+   the integer is a protocol thing, not a user-visible thing).  The
+   parameter remains to preserve the information of what things might
+   be printed with language-specific format, should we ever resurrect
+   that capability. */
 
 void
-print_longest (struct ui_file *stream, int format, int use_local,
+print_longest (struct ui_file *stream, int format, int use_c_format,
               LONGEST val_long)
 {
-#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
-  if (sizeof (long) < sizeof (LONGEST))
-    {
-      switch (format)
-       {
-       case 'd':
-         {
-           /* Print a signed value, that doesn't fit in a long */
-           if ((long) val_long != val_long)
-             {
-               if (val_long < 0)
-                 print_decimal (stream, "-", use_local, -val_long);
-               else
-                 print_decimal (stream, "", use_local, val_long);
-               return;
-             }
-           break;
-         }
-       case 'u':
-         {
-           /* Print an unsigned value, that doesn't fit in a long */
-           if ((unsigned long) val_long != (ULONGEST) val_long)
-             {
-               print_decimal (stream, "", use_local, val_long);
-               return;
-             }
-           break;
-         }
-       case 'x':
-       case 'o':
-       case 'b':
-       case 'h':
-       case 'w':
-       case 'g':
-         /* Print as unsigned value, must fit completely in unsigned long */
-         {
-           unsigned long temp = val_long;
-           if (temp != val_long)
-             {
-               /* Urk, can't represent value in long so print in hex.
-                  Do shift in two operations so that if sizeof (long)
-                  == sizeof (LONGEST) we can avoid warnings from
-                  picky compilers about shifts >= the size of the
-                  shiftee in bits */
-               unsigned long vbot = (unsigned long) val_long;
-               LONGEST temp = (val_long >> (sizeof (long) * HOST_CHAR_BIT - 1));
-               unsigned long vtop = temp >> 1;
-               fprintf_filtered (stream, "0x%lx%08lx", vtop, vbot);
-               return;
-             }
-           break;
-         }
-       }
-    }
-#endif
+  const char *val;
 
-#if defined (CC_HAS_LONG_LONG) && defined (PRINTF_HAS_LONG_LONG)
   switch (format)
     {
     case 'd':
-      fprintf_filtered (stream,
-                       use_local ? local_decimal_format_custom ("ll")
-                       : "%lld",
-                       (long long) val_long);
-      break;
+      val = int_string (val_long, 10, 1, 0, 1); break;
     case 'u':
-      fprintf_filtered (stream, "%llu", (long long) val_long);
-      break;
+      val = int_string (val_long, 10, 0, 0, 1); break;
     case 'x':
-      fprintf_filtered (stream,
-                       use_local ? local_hex_format_custom ("ll")
-                       : "%llx",
-                       (unsigned long long) val_long);
-      break;
-    case 'o':
-      fprintf_filtered (stream,
-                       use_local ? local_octal_format_custom ("ll")
-                       : "%llo",
-                       (unsigned long long) val_long);
-      break;
+      val = int_string (val_long, 16, 0, 0, use_c_format); break;
     case 'b':
-      fprintf_filtered (stream, local_hex_format_custom ("02ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 2, 1); break;
     case 'h':
-      fprintf_filtered (stream, local_hex_format_custom ("04ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 4, 1); break;
     case 'w':
-      fprintf_filtered (stream, local_hex_format_custom ("08ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 8, 1); break;
     case 'g':
-      fprintf_filtered (stream, local_hex_format_custom ("016ll"), val_long);
-      break;
-    default:
-      internal_error (__FILE__, __LINE__, "failed internal consistency check");
-    }
-#else /* !CC_HAS_LONG_LONG || !PRINTF_HAS_LONG_LONG */
-  /* In the following it is important to coerce (val_long) to a long. It does
-     nothing if !LONG_LONG, but it will chop off the top half (which we know
-     we can ignore) if the host supports long longs.  */
-
-  switch (format)
-    {
-    case 'd':
-      fprintf_filtered (stream,
-                       use_local ? local_decimal_format_custom ("l")
-                       : "%ld",
-                       (long) val_long);
-      break;
-    case 'u':
-      fprintf_filtered (stream, "%lu", (unsigned long) val_long);
-      break;
-    case 'x':
-      fprintf_filtered (stream,
-                       use_local ? local_hex_format_custom ("l")
-                       : "%lx",
-                       (unsigned long) val_long);
+      val = int_string (val_long, 16, 0, 16, 1); break;
       break;
     case 'o':
-      fprintf_filtered (stream,
-                       use_local ? local_octal_format_custom ("l")
-                       : "%lo",
-                       (unsigned long) val_long);
-      break;
-    case 'b':
-      fprintf_filtered (stream, local_hex_format_custom ("02l"),
-                       (unsigned long) val_long);
-      break;
-    case 'h':
-      fprintf_filtered (stream, local_hex_format_custom ("04l"),
-                       (unsigned long) val_long);
-      break;
-    case 'w':
-      fprintf_filtered (stream, local_hex_format_custom ("08l"),
-                       (unsigned long) val_long);
-      break;
-    case 'g':
-      fprintf_filtered (stream, local_hex_format_custom ("016l"),
-                       (unsigned long) val_long);
-      break;
+      val = int_string (val_long, 8, 0, 0, use_c_format); break;
     default:
-      internal_error (__FILE__, __LINE__, "failed internal consistency check");
-    }
-#endif /* CC_HAS_LONG_LONG || PRINTF_HAS_LONG_LONG */
+      internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+    } 
+  fputs_filtered (val, stream);
 }
 
 /* This used to be a macro, but I don't think it is called often enough
@@ -424,7 +431,7 @@ longest_to_int (LONGEST arg)
     {
       if (rtnval != arg)
        {
-         error ("Value out of range.");
+         error (_("Value out of range."));
        }
     }
   return (rtnval);
@@ -434,26 +441,38 @@ longest_to_int (LONGEST arg)
    TYPE_CODE_FLT), pointed to in GDB by VALADDR, on STREAM.  */
 
 void
-print_floating (char *valaddr, struct type *type, struct ui_file *stream)
+print_floating (const gdb_byte *valaddr, struct type *type,
+               struct ui_file *stream)
 {
   DOUBLEST doub;
   int inv;
   const struct floatformat *fmt = NULL;
   unsigned len = TYPE_LENGTH (type);
+  enum float_kind kind;
 
   /* If it is a floating-point, check for obvious problems.  */
   if (TYPE_CODE (type) == TYPE_CODE_FLT)
     fmt = floatformat_from_type (type);
-  if (fmt != NULL && floatformat_is_nan (fmt, valaddr))
+  if (fmt != NULL)
     {
-      if (floatformat_is_negative (fmt, valaddr))
-       fprintf_filtered (stream, "-");
-      fprintf_filtered (stream, "nan(");
-      fputs_filtered (local_hex_format_prefix (), stream);
-      fputs_filtered (floatformat_mantissa (fmt, valaddr), stream);
-      fputs_filtered (local_hex_format_suffix (), stream);
-      fprintf_filtered (stream, ")");
-      return;
+      kind = floatformat_classify (fmt, valaddr);
+      if (kind == float_nan)
+       {
+         if (floatformat_is_negative (fmt, valaddr))
+           fprintf_filtered (stream, "-");
+         fprintf_filtered (stream, "nan(");
+         fputs_filtered ("0x", stream);
+         fputs_filtered (floatformat_mantissa (fmt, valaddr), stream);
+         fprintf_filtered (stream, ")");
+         return;
+       }
+      else if (kind == float_infinite)
+       {
+         if (floatformat_is_negative (fmt, valaddr))
+           fputs_filtered ("-", stream);
+         fputs_filtered ("inf", stream);
+         return;
+       }
     }
 
   /* NOTE: cagney/2002-01-15: The TYPE passed into print_floating()
@@ -476,7 +495,7 @@ print_floating (char *valaddr, struct type *type, struct ui_file *stream)
      assumptions about the host and target floating point format.  */
 
   /* NOTE: cagney/2002-02-03: Since the TYPE of what was passed in may
-     not necessarially be a TYPE_CODE_FLT, the below ignores that and
+     not necessarily be a TYPE_CODE_FLT, the below ignores that and
      instead uses the type's length to determine the precision of the
      floating-point value being printed.  */
 
@@ -495,13 +514,25 @@ print_floating (char *valaddr, struct type *type, struct ui_file *stream)
 }
 
 void
-print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
-                   unsigned len)
+print_decimal_floating (const gdb_byte *valaddr, struct type *type,
+                       struct ui_file *stream)
+{
+  char decstr[MAX_DECIMAL_STRING];
+  unsigned len = TYPE_LENGTH (type);
+
+  decimal_to_string (valaddr, len, decstr);
+  fputs_filtered (decstr, stream);
+  return;
+}
+
+void
+print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
+                   unsigned len, enum bfd_endian byte_order)
 {
 
 #define BITS_IN_BYTES 8
 
-  unsigned char *p;
+  const gdb_byte *p;
   unsigned int i;
   int b;
 
@@ -512,8 +543,7 @@ print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
 
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
-  fputs_filtered (local_binary_format_prefix (), stream);
-  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+  if (byte_order == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -550,16 +580,16 @@ print_binary_chars (struct ui_file *stream, unsigned char *valaddr,
            }
        }
     }
-  fputs_filtered (local_binary_format_suffix (), stream);
 }
 
 /* VALADDR points to an integer of LEN bytes.
  * Print it in octal on stream or format it in buf.
  */
 void
-print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
+print_octal_chars (struct ui_file *stream, const gdb_byte *valaddr,
+                  unsigned len, enum bfd_endian byte_order)
 {
-  unsigned char *p;
+  const gdb_byte *p;
   unsigned char octa1, octa2, octa3, carry;
   int cycle;
 
@@ -599,8 +629,8 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
   cycle = (len * BITS_IN_BYTES) % BITS_IN_OCTAL;
   carry = 0;
 
-  fputs_filtered (local_octal_format_prefix (), stream);
-  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+  fputs_filtered ("0", stream);
+  if (byte_order == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -643,7 +673,7 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
              break;
 
            default:
-             error ("Internal error in octal conversion;");
+             error (_("Internal error in octal conversion;"));
            }
 
          cycle++;
@@ -690,7 +720,7 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
              break;
 
            default:
-             error ("Internal error in octal conversion;");
+             error (_("Internal error in octal conversion;"));
            }
 
          cycle++;
@@ -698,31 +728,23 @@ print_octal_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
        }
     }
 
-  fputs_filtered (local_octal_format_suffix (), stream);
 }
 
 /* VALADDR points to an integer of LEN bytes.
  * Print it in decimal on stream or format it in buf.
  */
 void
-print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
-                    unsigned len)
+print_decimal_chars (struct ui_file *stream, const gdb_byte *valaddr,
+                    unsigned len, enum bfd_endian byte_order)
 {
 #define TEN             10
-#define TWO_TO_FOURTH   16
 #define CARRY_OUT(  x ) ((x) / TEN)    /* extend char to int */
 #define CARRY_LEFT( x ) ((x) % TEN)
 #define SHIFT( x )      ((x) << 4)
-#define START_P \
-        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? valaddr : valaddr + len - 1)
-#define NOT_END_P \
-        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? (p < valaddr + len) : (p >= valaddr))
-#define NEXT_P \
-        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? p++ : p-- )
 #define LOW_NIBBLE(  x ) ( (x) & 0x00F)
 #define HIGH_NIBBLE( x ) (((x) & 0x0F0) >> 4)
 
-  unsigned char *p;
+  const gdb_byte *p;
   unsigned char *digits;
   int carry;
   int decimal_len;
@@ -741,8 +763,6 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
       digits[i] = 0;
     }
 
-  fputs_filtered (local_decimal_format_prefix (), stream);
-
   /* Ok, we have an unknown number of bytes of data to be printed in
    * decimal.
    *
@@ -757,9 +777,9 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
    * LSD end.
    */
   decimal_digits = 0;          /* Number of decimal digits so far */
-  p = START_P;
+  p = (byte_order == BFD_ENDIAN_BIG) ? valaddr : valaddr + len - 1;
   flip = 0;
-  while (NOT_END_P)
+  while ((byte_order == BFD_ENDIAN_BIG) ? (p < valaddr + len) : (p >= valaddr))
     {
       /*
        * Multiply current base-ten number by 16 in place.
@@ -789,7 +809,10 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
          /* Take low nibble and bump our pointer "p".
           */
          digits[0] += LOW_NIBBLE (*p);
-         NEXT_P;
+          if (byte_order == BFD_ENDIAN_BIG)
+           p++;
+         else
+           p--;
          flip = 0;
        }
 
@@ -837,21 +860,20 @@ print_decimal_chars (struct ui_file *stream, unsigned char *valaddr,
       fprintf_filtered (stream, "%1d", digits[i]);
     }
   xfree (digits);
-
-  fputs_filtered (local_decimal_format_suffix (), stream);
 }
 
 /* VALADDR points to an integer of LEN bytes.  Print it in hex on stream.  */
 
 void
-print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
+print_hex_chars (struct ui_file *stream, const gdb_byte *valaddr,
+                unsigned len, enum bfd_endian byte_order)
 {
-  unsigned char *p;
+  const gdb_byte *p;
 
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
-  fputs_filtered (local_hex_format_prefix (), stream);
-  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+  fputs_filtered ("0x", stream);
+  if (byte_order == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -869,18 +891,18 @@ print_hex_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
          fprintf_filtered (stream, "%02x", *p);
        }
     }
-  fputs_filtered (local_hex_format_suffix (), stream);
 }
 
 /* VALADDR points to a char integer of LEN bytes.  Print it out in appropriate language form on stream.  
    Omit any leading zero chars.  */
 
 void
-print_char_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
+print_char_chars (struct ui_file *stream, const gdb_byte *valaddr,
+                 unsigned len, enum bfd_endian byte_order)
 {
-  unsigned char *p;
+  const gdb_byte *p;
 
-  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+  if (byte_order == BFD_ENDIAN_BIG)
     {
       p = valaddr;
       while (p < valaddr + len - 1 && *p == 0)
@@ -906,6 +928,88 @@ print_char_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
     }
 }
 
+/* Return non-zero if the debugger should print the index of each element
+   when printing array values.  */
+
+int
+print_array_indexes_p (void)
+{              
+  return print_array_indexes;
+} 
+
+/* Assuming TYPE is a simple, non-empty array type, compute its upper
+   and lower bound.  Save the low bound into LOW_BOUND if not NULL.
+   Save the high bound into HIGH_BOUND if not NULL.
+
+   Return 1 if the operation was successful. Return zero otherwise,
+   in which case the values of LOW_BOUND and HIGH_BOUNDS are unmodified.
+   
+   Computing the array upper and lower bounds is pretty easy, but this
+   function does some additional verifications before returning them.
+   If something incorrect is detected, it is better to return a status
+   rather than throwing an error, making it easier for the caller to
+   implement an error-recovery plan.  For instance, it may decide to
+   warn the user that the bounds were not found and then use some
+   default values instead.  */
+
+int
+get_array_bounds (struct type *type, long *low_bound, long *high_bound)
+{
+  struct type *index = TYPE_INDEX_TYPE (type);
+  long low = 0;
+  long high = 0;
+                                  
+  if (index == NULL)
+    return 0;
+
+  if (TYPE_CODE (index) == TYPE_CODE_RANGE)
+    {
+      low = TYPE_LOW_BOUND (index);
+      high = TYPE_HIGH_BOUND (index);
+    }
+  else if (TYPE_CODE (index) == TYPE_CODE_ENUM)
+    {
+      const int n_enums = TYPE_NFIELDS (index);
+
+      low = TYPE_FIELD_BITPOS (index, 0);
+      high = TYPE_FIELD_BITPOS (index, n_enums - 1);
+    }
+  else
+    return 0;
+
+  /* Abort if the lower bound is greater than the higher bound, except
+     when low = high + 1.  This is a very common idiom used in Ada when
+     defining empty ranges (for instance "range 1 .. 0").  */
+  if (low > high + 1)
+    return 0;
+
+  if (low_bound)
+    *low_bound = low;
+
+  if (high_bound)
+    *high_bound = high;
+
+  return 1;
+}
+
+/* Print on STREAM using the given FORMAT the index for the element
+   at INDEX of an array whose index type is INDEX_TYPE.  */
+    
+void  
+maybe_print_array_index (struct type *index_type, LONGEST index,
+                         struct ui_file *stream, int format,
+                         enum val_prettyprint pretty)
+{
+  struct value *index_value;
+
+  if (!print_array_indexes)
+    return; 
+    
+  index_value = value_from_longest (index_type, index);
+
+  LA_PRINT_ARRAY_INDEX (index_value, stream, format, pretty);
+}   
+
 /*  Called by various <lang>_val_print routines to print elements of an
    array in the form "<elem1>, <elem2>, <elem3>, ...".
 
@@ -916,24 +1020,53 @@ print_char_chars (struct ui_file *stream, unsigned char *valaddr, unsigned len)
  */
 
 void
-val_print_array_elements (struct type *type, char *valaddr, CORE_ADDR address,
-                         struct ui_file *stream, int format, int deref_ref,
+val_print_array_elements (struct type *type, const gdb_byte *valaddr,
+                         CORE_ADDR address, struct ui_file *stream,
+                         int format, int deref_ref,
                          int recurse, enum val_prettyprint pretty,
                          unsigned int i)
 {
   unsigned int things_printed = 0;
   unsigned len;
-  struct type *elttype;
+  struct type *elttype, *index_type;
   unsigned eltlen;
   /* Position of the array element we are examining to see
      whether it is repeated.  */
   unsigned int rep1;
   /* Number of repetitions we have detected so far.  */
   unsigned int reps;
+  long low_bound_index = 0;
 
   elttype = TYPE_TARGET_TYPE (type);
   eltlen = TYPE_LENGTH (check_typedef (elttype));
-  len = TYPE_LENGTH (type) / eltlen;
+  index_type = TYPE_INDEX_TYPE (type);
+
+  /* Compute the number of elements in the array.  On most arrays,
+     the size of its elements is not zero, and so the number of elements
+     is simply the size of the array divided by the size of the elements.
+     But for arrays of elements whose size is zero, we need to look at
+     the bounds.  */
+  if (eltlen != 0)
+    len = TYPE_LENGTH (type) / eltlen;
+  else
+    {
+      long low, hi;
+      if (get_array_bounds (type, &low, &hi))
+        len = hi - low + 1;
+      else
+        {
+          warning (_("unable to get bounds of array, assuming null array"));
+          len = 0;
+        }
+    }
+
+  /* Get the array low bound.  This only makes sense if the array
+     has one or more element in it.  */
+  if (len > 0 && !get_array_bounds (type, &low_bound_index, NULL))
+    {
+      warning (_("unable to get low bound of array, using zero as default"));
+      low_bound_index = 0;
+    }
 
   annotate_array_section_begin (i, elttype);
 
@@ -952,6 +1085,8 @@ val_print_array_elements (struct type *type, char *valaddr, CORE_ADDR address,
            }
        }
       wrap_here (n_spaces (2 + 2 * recurse));
+      maybe_print_array_index (index_type, i + low_bound_index,
+                               stream, format, pretty);
 
       rep1 = i + 1;
       reps = 1;
@@ -965,7 +1100,7 @@ val_print_array_elements (struct type *type, char *valaddr, CORE_ADDR address,
       if (reps > repeat_count_threshold)
        {
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
-                    deref_ref, recurse + 1, pretty);
+                    deref_ref, recurse + 1, pretty, current_language);
          annotate_elt_rep (reps);
          fprintf_filtered (stream, " <repeats %u times>", reps);
          annotate_elt_rep_end ();
@@ -976,7 +1111,7 @@ val_print_array_elements (struct type *type, char *valaddr, CORE_ADDR address,
       else
        {
          val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format,
-                    deref_ref, recurse + 1, pretty);
+                    deref_ref, recurse + 1, pretty, current_language);
          annotate_elt ();
          things_printed++;
        }
@@ -997,7 +1132,7 @@ val_print_array_elements (struct type *type, char *valaddr, CORE_ADDR address,
    function be eliminated.  */
 
 static int
-partial_memory_read (CORE_ADDR memaddr, char *myaddr, int len, int *errnoptr)
+partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int *errnoptr)
 {
   int nread;                   /* Number of bytes actually read. */
   int errcode;                 /* Error from last read. */
@@ -1045,9 +1180,9 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
   unsigned int fetchlimit;     /* Maximum number of chars to print. */
   unsigned int nfetch;         /* Chars to fetch / chars fetched. */
   unsigned int chunksize;      /* Size of each fetch, in chars. */
-  char *buffer = NULL;         /* Dynamically growable fetch buffer. */
-  char *bufptr;                        /* Pointer to next available byte in buffer. */
-  char *limit;                 /* First location past end of fetch buffer. */
+  gdb_byte *buffer = NULL;     /* Dynamically growable fetch buffer. */
+  gdb_byte *bufptr;            /* Pointer to next available byte in buffer. */
+  gdb_byte *limit;             /* First location past end of fetch buffer. */
   struct cleanup *old_chain = NULL;    /* Top of the old cleanup chain. */
   int found_nul;               /* Non-zero if we found the nul char */
 
@@ -1080,7 +1215,7 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
 
   if (len > 0)
     {
-      buffer = (char *) xmalloc (len * width);
+      buffer = (gdb_byte *) xmalloc (len * width);
       bufptr = buffer;
       old_chain = make_cleanup (xfree, buffer);
 
@@ -1098,11 +1233,11 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
          nfetch = min (chunksize, fetchlimit - bufsize);
 
          if (buffer == NULL)
-           buffer = (char *) xmalloc (nfetch * width);
+           buffer = (gdb_byte *) xmalloc (nfetch * width);
          else
            {
              discard_cleanups (old_chain);
-             buffer = (char *) xrealloc (buffer, (nfetch + bufsize) * width);
+             buffer = (gdb_byte *) xrealloc (buffer, (nfetch + bufsize) * width);
            }
 
          old_chain = make_cleanup (xfree, buffer);
@@ -1155,13 +1290,13 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
 
   if (len == -1 && !found_nul)
     {
-      char *peekbuf;
+      gdb_byte *peekbuf;
 
       /* We didn't find a null terminator we were looking for.  Attempt
          to peek at the next character.  If not successful, or it is not
          a null byte, then force ellipsis to be printed.  */
 
-      peekbuf = (char *) alloca (width);
+      peekbuf = (gdb_byte *) alloca (width);
 
       if (target_read_memory (addr, peekbuf, width) == 0
          && extract_unsigned_integer (peekbuf, width) != 0)
@@ -1194,13 +1329,13 @@ val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
       if (errcode == EIO)
        {
          fprintf_filtered (stream, " <Address ");
-         print_address_numeric (addr, 1, stream);
+         fputs_filtered (paddress (addr), stream);
          fprintf_filtered (stream, " out of bounds>");
        }
       else
        {
          fprintf_filtered (stream, " <Error reading address ");
-         print_address_numeric (addr, 1, stream);
+         fputs_filtered (paddress (addr), stream);
          fprintf_filtered (stream, ": %s>", safe_strerror (errcode));
        }
     }
@@ -1234,13 +1369,13 @@ set_input_radix_1 (int from_tty, unsigned radix)
     {
       /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
          value.  */
-      error ("Nonsense input radix ``decimal %u''; input radix unchanged.",
+      error (_("Nonsense input radix ``decimal %u''; input radix unchanged."),
             radix);
     }
   input_radix = radix;
   if (from_tty)
     {
-      printf_filtered ("Input radix now set to decimal %u, hex %x, octal %o.\n",
+      printf_filtered (_("Input radix now set to decimal %u, hex %x, octal %o.\n"),
                       radix, radix, radix);
     }
 }
@@ -1270,13 +1405,13 @@ set_output_radix_1 (int from_tty, unsigned radix)
     default:
       /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
          value.  */
-      error ("Unsupported output radix ``decimal %u''; output radix unchanged.",
+      error (_("Unsupported output radix ``decimal %u''; output radix unchanged."),
             radix);
     }
   output_radix = radix;
   if (from_tty)
     {
-      printf_filtered ("Output radix now set to decimal %u, hex %x, octal %o.\n",
+      printf_filtered (_("Output radix now set to decimal %u, hex %x, octal %o.\n"),
                       radix, radix, radix);
     }
 }
@@ -1299,7 +1434,7 @@ set_radix (char *arg, int from_tty)
   set_input_radix_1 (0, radix);
   if (from_tty)
     {
-      printf_filtered ("Input and output radices now set to decimal %u, hex %x, octal %o.\n",
+      printf_filtered (_("Input and output radices now set to decimal %u, hex %x, octal %o.\n"),
                       radix, radix, radix);
     }
 }
@@ -1313,14 +1448,14 @@ show_radix (char *arg, int from_tty)
     {
       if (input_radix == output_radix)
        {
-         printf_filtered ("Input and output radices set to decimal %u, hex %x, octal %o.\n",
+         printf_filtered (_("Input and output radices set to decimal %u, hex %x, octal %o.\n"),
                           input_radix, input_radix, input_radix);
        }
       else
        {
-         printf_filtered ("Input radix set to decimal %u, hex %x, octal %o.\n",
+         printf_filtered (_("Input radix set to decimal %u, hex %x, octal %o.\n"),
                           input_radix, input_radix, input_radix);
-         printf_filtered ("Output radix set to decimal %u, hex %x, octal %o.\n",
+         printf_filtered (_("Output radix set to decimal %u, hex %x, octal %o.\n"),
                           output_radix, output_radix, output_radix);
        }
     }
@@ -1347,95 +1482,107 @@ _initialize_valprint (void)
   struct cmd_list_element *c;
 
   add_prefix_cmd ("print", no_class, set_print,
-                 "Generic command for setting how things print.",
+                 _("Generic command for setting how things print."),
                  &setprintlist, "set print ", 0, &setlist);
   add_alias_cmd ("p", "print", no_class, 1, &setlist);
   /* prefer set print to set prompt */
   add_alias_cmd ("pr", "print", no_class, 1, &setlist);
 
   add_prefix_cmd ("print", no_class, show_print,
-                 "Generic command for showing print settings.",
+                 _("Generic command for showing print settings."),
                  &showprintlist, "show print ", 0, &showlist);
   add_alias_cmd ("p", "print", no_class, 1, &showlist);
   add_alias_cmd ("pr", "print", no_class, 1, &showlist);
 
-  add_show_from_set
-    (add_set_cmd ("elements", no_class, var_uinteger, (char *) &print_max,
-                 "Set limit on string chars or array elements to print.\n\
-\"set print elements 0\" causes there to be no limit.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("null-stop", no_class, var_boolean,
-                 (char *) &stop_print_at_null,
-                 "Set printing of char arrays to stop at first null char.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("repeats", no_class, var_uinteger,
-                 (char *) &repeat_count_threshold,
-                 "Set threshold for repeated print elements.\n\
-\"set print repeats 0\" causes all elements to be individually printed.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("pretty", class_support, var_boolean,
-                 (char *) &prettyprint_structs,
-                 "Set prettyprinting of structures.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("union", class_support, var_boolean, (char *) &unionprint,
-                 "Set printing of unions interior to structures.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("array", class_support, var_boolean,
-                 (char *) &prettyprint_arrays,
-                 "Set prettyprinting of arrays.",
-                 &setprintlist),
-     &showprintlist);
-
-  add_show_from_set
-    (add_set_cmd ("address", class_support, var_boolean, (char *) &addressprint,
-                 "Set printing of addresses.",
-                 &setprintlist),
-     &showprintlist);
-
-  c = add_set_cmd ("input-radix", class_support, var_uinteger,
-                  (char *) &input_radix,
-                  "Set default input radix for entering numbers.",
-                  &setlist);
-  add_show_from_set (c, &showlist);
-  set_cmd_sfunc (c, set_input_radix);
-
-  c = add_set_cmd ("output-radix", class_support, var_uinteger,
-                  (char *) &output_radix,
-                  "Set default output radix for printing of values.",
-                  &setlist);
-  add_show_from_set (c, &showlist);
-  set_cmd_sfunc (c, set_output_radix);
-
-  /* The "set radix" and "show radix" commands are special in that they are
-     like normal set and show commands but allow two normally independent
-     variables to be either set or shown with a single command.  So the
-     usual add_set_cmd() and add_show_from_set() commands aren't really
-     appropriate. */
-  add_cmd ("radix", class_support, set_radix,
-          "Set default input and output number radices.\n\
+  add_setshow_uinteger_cmd ("elements", no_class, &print_max, _("\
+Set limit on string chars or array elements to print."), _("\
+Show limit on string chars or array elements to print."), _("\
+\"set print elements 0\" causes there to be no limit."),
+                           NULL,
+                           show_print_max,
+                           &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("null-stop", no_class, &stop_print_at_null, _("\
+Set printing of char arrays to stop at first null char."), _("\
+Show printing of char arrays to stop at first null char."), NULL,
+                          NULL,
+                          show_stop_print_at_null,
+                          &setprintlist, &showprintlist);
+
+  add_setshow_uinteger_cmd ("repeats", no_class,
+                           &repeat_count_threshold, _("\
+Set threshold for repeated print elements."), _("\
+Show threshold for repeated print elements."), _("\
+\"set print repeats 0\" causes all elements to be individually printed."),
+                           NULL,
+                           show_repeat_count_threshold,
+                           &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("pretty", class_support, &prettyprint_structs, _("\
+Set prettyprinting of structures."), _("\
+Show prettyprinting of structures."), NULL,
+                          NULL,
+                          show_prettyprint_structs,
+                          &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("union", class_support, &unionprint, _("\
+Set printing of unions interior to structures."), _("\
+Show printing of unions interior to structures."), NULL,
+                          NULL,
+                          show_unionprint,
+                          &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("array", class_support, &prettyprint_arrays, _("\
+Set prettyprinting of arrays."), _("\
+Show prettyprinting of arrays."), NULL,
+                          NULL,
+                          show_prettyprint_arrays,
+                          &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("address", class_support, &addressprint, _("\
+Set printing of addresses."), _("\
+Show printing of addresses."), NULL,
+                          NULL,
+                          show_addressprint,
+                          &setprintlist, &showprintlist);
+
+  add_setshow_uinteger_cmd ("input-radix", class_support, &input_radix, _("\
+Set default input radix for entering numbers."), _("\
+Show default input radix for entering numbers."), NULL,
+                           set_input_radix,
+                           show_input_radix,
+                           &setlist, &showlist);
+
+  add_setshow_uinteger_cmd ("output-radix", class_support, &output_radix, _("\
+Set default output radix for printing of values."), _("\
+Show default output radix for printing of values."), NULL,
+                           set_output_radix,
+                           show_output_radix,
+                           &setlist, &showlist);
+
+  /* The "set radix" and "show radix" commands are special in that
+     they are like normal set and show commands but allow two normally
+     independent variables to be either set or shown with a single
+     command.  So the usual deprecated_add_set_cmd() and [deleted]
+     add_show_from_set() commands aren't really appropriate. */
+  /* FIXME: i18n: With the new add_setshow_integer command, that is no
+     longer true - show can display anything.  */
+  add_cmd ("radix", class_support, set_radix, _("\
+Set default input and output number radices.\n\
 Use 'set input-radix' or 'set output-radix' to independently set each.\n\
-Without an argument, sets both radices back to the default value of 10.",
+Without an argument, sets both radices back to the default value of 10."),
           &setlist);
-  add_cmd ("radix", class_support, show_radix,
-          "Show the default input and output number radices.\n\
-Use 'show input-radix' or 'show output-radix' to independently show each.",
+  add_cmd ("radix", class_support, show_radix, _("\
+Show the default input and output number radices.\n\
+Use 'show input-radix' or 'show output-radix' to independently show each."),
           &showlist);
 
+  add_setshow_boolean_cmd ("array-indexes", class_support,
+                           &print_array_indexes, _("\
+Set printing of array indexes."), _("\
+Show printing of array indexes"), NULL, NULL, show_print_array_indexes,
+                           &setprintlist, &showprintlist);
+
   /* Give people the defaults which they are used to.  */
   prettyprint_structs = 0;
   prettyprint_arrays = 0;
This page took 0.05273 seconds and 4 git commands to generate.