* cris-dis.c (format_hex): Remove ineffective warning fix.
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 2f07114ff962697f2ad4d37fe887c56d0b5a08b9..00604b948c2de2d1268d1b64f9dd921e74dcb72c 100644 (file)
@@ -1,6 +1,8 @@
 /* Print values for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1998
-   Free Software Foundation, Inc.
+
+   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2005 Free Software
+   Foundation, Inc.
 
    This file is part of GDB.
 
 #include "gdbcore.h"
 #include "gdbcmd.h"
 #include "target.h"
-#include "obstack.h"
 #include "language.h"
-#include "demangle.h"
 #include "annotate.h"
 #include "valprint.h"
+#include "floatformat.h"
+#include "doublest.h"
 
 #include <errno.h>
 
 /* Prototypes for local functions */
 
-static void print_hex_chars PARAMS ((GDB_FILE *, unsigned char *,
-                                    unsigned int));
+static int partial_memory_read (CORE_ADDR memaddr, char *myaddr,
+                               int len, int *errnoptr);
 
-static void show_print PARAMS ((char *, int));
+static void show_print (char *, int);
 
-static void set_print PARAMS ((char *, int));
+static void set_print (char *, int);
 
-static void set_radix PARAMS ((char *, int));
+static void set_radix (char *, int);
 
-static void show_radix PARAMS ((char *, int));
+static void show_radix (char *, int);
 
-static void set_input_radix PARAMS ((char *, int, struct cmd_list_element *));
+static void set_input_radix (char *, int, struct cmd_list_element *);
 
-static void set_input_radix_1 PARAMS ((int, unsigned));
+static void set_input_radix_1 (int, unsigned);
 
-static void set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
+static void set_output_radix (char *, int, struct cmd_list_element *);
 
-static void set_output_radix_1 PARAMS ((int, unsigned));
+static void set_output_radix_1 (int, unsigned);
 
-void _initialize_valprint PARAMS ((void));
+void _initialize_valprint (void);
 
 /* Maximum number of chars to print for a string pointer value or vector
    contents, or UINT_MAX for no limit.  Note that "set print elements 0"
@@ -121,17 +123,9 @@ int addressprint;          /* Controls printing of machine addresses */
 
 
 int
-val_print (type, valaddr, embedded_offset, address,
-          stream, format, deref_ref, recurse, pretty)
-     struct type *type;
-     char *valaddr;
-     int embedded_offset;
-     CORE_ADDR address;
-     GDB_FILE *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
+val_print (struct type *type, const bfd_byte *valaddr, int embedded_offset,
+          CORE_ADDR address, struct ui_file *stream, int format,
+          int deref_ref, int recurse, enum val_prettyprint pretty)
 {
   struct type *real_type = check_typedef (type);
   if (pretty == Val_pretty_default)
@@ -145,7 +139,7 @@ val_print (type, valaddr, embedded_offset, address,
      only a stub and we can't find and substitute its complete type, then
      print appropriate string and return.  */
 
-  if (TYPE_FLAGS (real_type) & TYPE_FLAG_STUB)
+  if (TYPE_STUB (real_type))
     {
       fprintf_filtered (stream, "<incomplete type>");
       gdb_flush (stream);
@@ -162,20 +156,17 @@ val_print (type, valaddr, embedded_offset, address,
    the number of string bytes printed.  */
 
 int
-value_print (val, stream, format, pretty)
-     value_ptr val;
-     GDB_FILE *stream;
-     int format;
-     enum val_prettyprint pretty;
+value_print (struct value *val, struct ui_file *stream, int format,
+            enum val_prettyprint pretty)
 {
   if (val == 0)
     {
-      printf_filtered ("<address of value unknown>");
+      printf_filtered (_("<address of value unknown>"));
       return 0;
     }
-  if (VALUE_OPTIMIZED_OUT (val))
+  if (value_optimized_out (val))
     {
-      printf_filtered ("<value optimized out>");
+      printf_filtered (_("<value optimized out>"));
       return 0;
     }
   return LA_VALUE_PRINT (val, stream, format, pretty);
@@ -186,10 +177,8 @@ value_print (val, stream, format, pretty)
    value.  STREAM is where to print the value.  */
 
 void
-val_print_type_code_int (type, valaddr, stream)
-     struct type *type;
-     char *valaddr;
-     GDB_FILE *stream;
+val_print_type_code_int (struct type *type, const bfd_byte *valaddr,
+                        struct ui_file *stream)
 {
   if (TYPE_LENGTH (type) > sizeof (LONGEST))
     {
@@ -213,325 +202,60 @@ val_print_type_code_int (type, valaddr, stream)
     }
   else
     {
-#ifdef PRINT_TYPELESS_INTEGER
-      PRINT_TYPELESS_INTEGER (stream, type, unpack_long (type, valaddr));
-#else
       print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0,
                     unpack_long (type, valaddr));
-#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.  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 PARAMS ((GDB_FILE * stream, char *sign, int use_local, ULONGEST val_ulong));
-static void
-print_decimal (stream, sign, use_local, val_ulong)
-     GDB_FILE *stream;
-     char *sign;
-     int use_local;
-     ULONGEST val_ulong;
-{
-  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)
-    {
-    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:
-      abort ();
-    }
-  return;
-}
-#endif
+   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 (stream, format, use_local, val_long)
-     GDB_FILE *stream;
-     int format;
-     int use_local;
-     LONGEST val_long;
+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",
-                       val_long);
-      break;
-    case 'u':
-      fprintf_filtered (stream, "%llu", val_long);
-      break;
-    case 'x':
-      fprintf_filtered (stream,
-                       use_local ? local_hex_format_custom ("ll")
-                       : "%llx",
-                       val_long);
-      break;
-    case 'o':
-      fprintf_filtered (stream,
-                       use_local ? local_octal_format_custom ("ll")
-                       : "%llo",
-                       val_long);
-      break;
-    case 'b':
-      fprintf_filtered (stream, local_hex_format_custom ("02ll"), val_long);
-      break;
-    case 'h':
-      fprintf_filtered (stream, local_hex_format_custom ("04ll"), val_long);
-      break;
-    case 'w':
-      fprintf_filtered (stream, local_hex_format_custom ("08ll"), val_long);
-      break;
-    case 'g':
-      fprintf_filtered (stream, local_hex_format_custom ("016ll"), val_long);
-      break;
-    default:
-      abort ();
-    }
-#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);
-      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;
-    default:
-      abort ();
-    }
-#endif /* CC_HAS_LONG_LONG || PRINTF_HAS_LONG_LONG */
-}
-
-#if 0
-void
-strcat_longest (format, use_local, val_long, buf, buflen)
-     int format;
-     int use_local;
-     LONGEST val_long;
-     char *buf;
-     int buflen;               /* ignored, for now */
-{
-#if defined (CC_HAS_LONG_LONG) && !defined (PRINTF_HAS_LONG_LONG)
-  long vtop, vbot;
-
-  vtop = val_long >> (sizeof (long) * HOST_CHAR_BIT);
-  vbot = (long) val_long;
-
-  if ((format == 'd' && (val_long < INT_MIN || val_long > INT_MAX))
-      || ((format == 'u' || format == 'x') && (unsigned long long) val_long > UINT_MAX))
-    {
-      sprintf (buf, "0x%lx%08lx", vtop, vbot);
-      return;
-    }
-#endif
-
-#ifdef PRINTF_HAS_LONG_LONG
-  switch (format)
-    {
-    case 'd':
-      sprintf (buf,
-              (use_local ? local_decimal_format_custom ("ll") : "%lld"),
-              val_long);
-      break;
+      val = int_string (val_long, 10, 1, 0, 1); break;
     case 'u':
-      sprintf (buf, "%llu", val_long);
-      break;
+      val = int_string (val_long, 10, 0, 0, 1); break;
     case 'x':
-      sprintf (buf,
-              (use_local ? local_hex_format_custom ("ll") : "%llx"),
-
-              val_long);
-      break;
-    case 'o':
-      sprintf (buf,
-              (use_local ? local_octal_format_custom ("ll") : "%llo"),
-              val_long);
-      break;
+      val = int_string (val_long, 16, 0, 0, use_c_format); break;
     case 'b':
-      sprintf (buf, local_hex_format_custom ("02ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 2, 1); break;
     case 'h':
-      sprintf (buf, local_hex_format_custom ("04ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 4, 1); break;
     case 'w':
-      sprintf (buf, local_hex_format_custom ("08ll"), val_long);
-      break;
+      val = int_string (val_long, 16, 0, 8, 1); break;
     case 'g':
-      sprintf (buf, local_hex_format_custom ("016ll"), val_long);
-      break;
-    default:
-      abort ();
-    }
-#else /* !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':
-      sprintf (buf, (use_local ? local_decimal_format_custom ("l") : "%ld"),
-              ((long) val_long));
-      break;
-    case 'u':
-      sprintf (buf, "%lu", ((unsigned long) val_long));
-      break;
-    case 'x':
-      sprintf (buf, (use_local ? local_hex_format_custom ("l") : "%lx"),
-              ((long) val_long));
+      val = int_string (val_long, 16, 0, 16, 1); break;
       break;
     case 'o':
-      sprintf (buf, (use_local ? local_octal_format_custom ("l") : "%lo"),
-              ((long) val_long));
-      break;
-    case 'b':
-      sprintf (buf, local_hex_format_custom ("02l"),
-              ((long) val_long));
-      break;
-    case 'h':
-      sprintf (buf, local_hex_format_custom ("04l"),
-              ((long) val_long));
-      break;
-    case 'w':
-      sprintf (buf, local_hex_format_custom ("08l"),
-              ((long) val_long));
-      break;
-    case 'g':
-      sprintf (buf, local_hex_format_custom ("016l"),
-              ((long) val_long));
-      break;
+      val = int_string (val_long, 8, 0, 0, use_c_format); break;
     default:
-      abort ();
-    }
-
-#endif /* !PRINTF_HAS_LONG_LONG */
+      internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
+    } 
+  fputs_filtered (val, stream);
 }
-#endif
 
 /* This used to be a macro, but I don't think it is called often enough
    to merit such treatment.  */
@@ -540,8 +264,7 @@ strcat_longest (format, use_local, val_long, buf, buflen)
    where the value must not be larger than can fit in an int.  */
 
 int
-longest_to_int (arg)
-     LONGEST arg;
+longest_to_int (LONGEST arg)
 {
   /* Let the compiler do the work */
   int rtnval = (int) arg;
@@ -551,98 +274,46 @@ longest_to_int (arg)
     {
       if (rtnval != arg)
        {
-         error ("Value out of range.");
+         error (_("Value out of range."));
        }
     }
   return (rtnval);
 }
 
-/* Print a floating point value of type TYPE, pointed to in GDB by VALADDR,
-   on STREAM.  */
+/* Print a floating point value of type TYPE (not always a
+   TYPE_CODE_FLT), pointed to in GDB by VALADDR, on STREAM.  */
 
 void
-print_floating (valaddr, type, stream)
-     char *valaddr;
-     struct type *type;
-     GDB_FILE *stream;
+print_floating (const bfd_byte *valaddr, struct type *type,
+               struct ui_file *stream)
 {
   DOUBLEST doub;
   int inv;
+  const struct floatformat *fmt = NULL;
   unsigned len = TYPE_LENGTH (type);
 
-#if defined (IEEE_FLOAT)
-
-  /* Check for NaN's.  Note that this code does not depend on us being
-     on an IEEE conforming system.  It only depends on the target
-     machine using IEEE representation.  This means (a)
-     cross-debugging works right, and (2) IEEE_FLOAT can (and should)
-     be defined for systems like the 68881, which uses IEEE
-     representation, but is not IEEE conforming.  */
-
-  {
-    unsigned long low, high;
-    /* Is the sign bit 0?  */
-    int nonnegative;
-    /* Is it is a NaN (i.e. the exponent is all ones and
-       the fraction is nonzero)?  */
-    int is_nan;
-
-    /* For lint, initialize these two variables to suppress warning: */
-    low = high = nonnegative = 0;
-    if (len == 4)
-      {
-       /* It's single precision.  */
-       /* Assume that floating point byte order is the same as
-          integer byte order.  */
-       low = extract_unsigned_integer (valaddr, 4);
-       nonnegative = ((low & 0x80000000) == 0);
-       is_nan = ((((low >> 23) & 0xFF) == 0xFF)
-                 && 0 != (low & 0x7FFFFF));
-       low &= 0x7fffff;
-       high = 0;
-      }
-    else if (len == 8)
-      {
-       /* It's double precision.  Get the high and low words.  */
-
-       /* Assume that floating point byte order is the same as
-          integer byte order.  */
-       if (TARGET_BYTE_ORDER == BIG_ENDIAN)
-         {
-           low = extract_unsigned_integer (valaddr + 4, 4);
-           high = extract_unsigned_integer (valaddr, 4);
-         }
-       else
-         {
-           low = extract_unsigned_integer (valaddr, 4);
-           high = extract_unsigned_integer (valaddr + 4, 4);
-         }
-       nonnegative = ((high & 0x80000000) == 0);
-       is_nan = (((high >> 20) & 0x7ff) == 0x7ff
-                 && !((((high & 0xfffff) == 0)) && (low == 0)));
-       high &= 0xfffff;
-      }
-    else
-      /* Extended.  We can't detect NaNs for extendeds yet.  Also note
-         that currently extendeds get nuked to double in
-         REGISTER_CONVERTIBLE.  */
-      is_nan = 0;
-
-    if (is_nan)
-      {
-       /* The meaning of the sign and fraction is not defined by IEEE.
-          But the user might know what they mean.  For example, they
-          (in an implementation-defined manner) distinguish between
-          signaling and quiet NaN's.  */
-       if (high)
-         fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + nonnegative,
-                           high, low);
-       else
-         fprintf_filtered (stream, "-NaN(0x%lx)" + nonnegative, low);
-       return;
-      }
-  }
-#endif /* IEEE_FLOAT.  */
+  /* 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 (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;
+    }
+
+  /* NOTE: cagney/2002-01-15: The TYPE passed into print_floating()
+     isn't necessarily a TYPE_CODE_FLT.  Consequently, unpack_double
+     needs to be used as that takes care of any necessary type
+     conversions.  Such conversions are of course direct to DOUBLEST
+     and disregard any possible target floating point limitations.
+     For instance, a u64 would be converted and displayed exactly on a
+     host with 80 bit DOUBLEST but with loss of information on a host
+     with 64 bit DOUBLEST.  */
 
   doub = unpack_double (type, valaddr, &inv);
   if (inv)
@@ -651,6 +322,14 @@ print_floating (valaddr, type, stream)
       return;
     }
 
+  /* FIXME: kettenis/2001-01-20: The following code makes too much
+     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
+     instead uses the type's length to determine the precision of the
+     floating-point value being printed.  */
+
   if (len < sizeof (double))
       fprintf_filtered (stream, "%.9g", (double) doub);
   else if (len == sizeof (double))
@@ -659,22 +338,21 @@ print_floating (valaddr, type, stream)
 #ifdef PRINTF_HAS_LONG_DOUBLE
     fprintf_filtered (stream, "%.35Lg", doub);
 #else
-    /* This at least wins with values that are representable as doubles */
+    /* This at least wins with values that are representable as
+       doubles.  */
     fprintf_filtered (stream, "%.17g", (double) doub);
 #endif
 }
 
 void
-print_binary_chars (stream, valaddr, len)
-     GDB_FILE *stream;
-     unsigned char *valaddr;
-     unsigned len;
+print_binary_chars (struct ui_file *stream, const bfd_byte *valaddr,
+                   unsigned len)
 {
 
 #define BITS_IN_BYTES 8
 
-  unsigned char *p;
-  int i;
+  const bfd_byte *p;
+  unsigned int i;
   int b;
 
   /* Declared "int" so it will be signed.
@@ -684,8 +362,7 @@ print_binary_chars (stream, valaddr, len)
 
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
-  fprintf_filtered (stream, local_binary_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -722,19 +399,16 @@ print_binary_chars (stream, valaddr, len)
            }
        }
     }
-  fprintf_filtered (stream, local_binary_format_suffix ());
 }
 
 /* VALADDR points to an integer of LEN bytes.
  * Print it in octal on stream or format it in buf.
  */
 void
-print_octal_chars (stream, valaddr, len)
-     GDB_FILE *stream;
-     unsigned char *valaddr;
-     unsigned len;
+print_octal_chars (struct ui_file *stream, const bfd_byte *valaddr,
+                  unsigned len)
 {
-  unsigned char *p;
+  const bfd_byte *p;
   unsigned char octa1, octa2, octa3, carry;
   int cycle;
 
@@ -774,8 +448,8 @@ print_octal_chars (stream, valaddr, len)
   cycle = (len * BITS_IN_BYTES) % BITS_IN_OCTAL;
   carry = 0;
 
-  fprintf_filtered (stream, local_octal_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  fputs_filtered ("0", stream);
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -818,7 +492,7 @@ print_octal_chars (stream, valaddr, len)
              break;
 
            default:
-             error ("Internal error in octal conversion;");
+             error (_("Internal error in octal conversion;"));
            }
 
          cycle++;
@@ -865,7 +539,7 @@ print_octal_chars (stream, valaddr, len)
              break;
 
            default:
-             error ("Internal error in octal conversion;");
+             error (_("Internal error in octal conversion;"));
            }
 
          cycle++;
@@ -873,17 +547,14 @@ print_octal_chars (stream, valaddr, len)
        }
     }
 
-  fprintf_filtered (stream, local_octal_format_suffix ());
 }
 
 /* VALADDR points to an integer of LEN bytes.
  * Print it in decimal on stream or format it in buf.
  */
 void
-print_decimal_chars (stream, valaddr, len)
-     GDB_FILE *stream;
-     unsigned char *valaddr;
-     unsigned len;
+print_decimal_chars (struct ui_file *stream, const bfd_byte *valaddr,
+                    unsigned len)
 {
 #define TEN             10
 #define TWO_TO_FOURTH   16
@@ -891,15 +562,15 @@ print_decimal_chars (stream, valaddr, len)
 #define CARRY_LEFT( x ) ((x) % TEN)
 #define SHIFT( x )      ((x) << 4)
 #define START_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? valaddr : valaddr + len - 1)
+        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? valaddr : valaddr + len - 1)
 #define NOT_END_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? (p < valaddr + len) : (p >= valaddr))
+        ((TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) ? (p < valaddr + len) : (p >= valaddr))
 #define NEXT_P \
-        ((TARGET_BYTE_ORDER == BIG_ENDIAN) ? p++ : 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 bfd_byte *p;
   unsigned char *digits;
   int carry;
   int decimal_len;
@@ -911,17 +582,13 @@ print_decimal_chars (stream, valaddr, len)
    * as the base 16 number, which is 2 digits per byte.
    */
   decimal_len = len * 2 * 2;
-  digits = (unsigned char *) malloc (decimal_len);
-  if (digits == NULL)
-    error ("Can't allocate memory for conversion to decimal.");
+  digits = xmalloc (decimal_len);
 
   for (i = 0; i < decimal_len; i++)
     {
       digits[i] = 0;
     }
 
-  fprintf_filtered (stream, local_decimal_format_prefix ());
-
   /* Ok, we have an unknown number of bytes of data to be printed in
    * decimal.
    *
@@ -1015,25 +682,21 @@ print_decimal_chars (stream, valaddr, len)
     {
       fprintf_filtered (stream, "%1d", digits[i]);
     }
-  free (digits);
-
-  fprintf_filtered (stream, local_decimal_format_suffix ());
+  xfree (digits);
 }
 
 /* VALADDR points to an integer of LEN bytes.  Print it in hex on stream.  */
 
-static void
-print_hex_chars (stream, valaddr, len)
-     GDB_FILE *stream;
-     unsigned char *valaddr;
-     unsigned len;
+void
+print_hex_chars (struct ui_file *stream, const bfd_byte *valaddr,
+                unsigned len)
 {
-  unsigned char *p;
+  const bfd_byte *p;
 
   /* FIXME: We should be not printing leading zeroes in most cases.  */
 
-  fprintf_filtered (stream, local_hex_format_prefix ());
-  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+  fputs_filtered ("0x", stream);
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
     {
       for (p = valaddr;
           p < valaddr + len;
@@ -1051,7 +714,41 @@ print_hex_chars (stream, valaddr, len)
          fprintf_filtered (stream, "%02x", *p);
        }
     }
-  fprintf_filtered (stream, local_hex_format_suffix ());
+}
+
+/* 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, const bfd_byte *valaddr,
+                 unsigned len)
+{
+  const bfd_byte *p;
+
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+    {
+      p = valaddr;
+      while (p < valaddr + len - 1 && *p == 0)
+       ++p;
+
+      while (p < valaddr + len)
+       {
+         LA_EMIT_CHAR (*p, stream, '\'');
+         ++p;
+       }
+    }
+  else
+    {
+      p = valaddr + len - 1;
+      while (p > valaddr && *p == 0)
+       --p;
+
+      while (p >= valaddr)
+       {
+         LA_EMIT_CHAR (*p, stream, '\'');
+         --p;
+       }
+    }
 }
 
 /*  Called by various <lang>_val_print routines to print elements of an
@@ -1064,17 +761,11 @@ print_hex_chars (stream, valaddr, len)
  */
 
 void
-val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
-                         recurse, pretty, i)
-     struct type *type;
-     char *valaddr;
-     CORE_ADDR address;
-     GDB_FILE *stream;
-     int format;
-     int deref_ref;
-     int recurse;
-     enum val_prettyprint pretty;
-     unsigned int i;
+val_print_array_elements (struct type *type, const bfd_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;
@@ -1143,6 +834,47 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
     }
 }
 
+/* Read LEN bytes of target memory at address MEMADDR, placing the
+   results in GDB's memory at MYADDR.  Returns a count of the bytes
+   actually read, and optionally an errno value in the location
+   pointed to by ERRNOPTR if ERRNOPTR is non-null. */
+
+/* FIXME: cagney/1999-10-14: Only used by val_print_string.  Can this
+   function be eliminated.  */
+
+static int
+partial_memory_read (CORE_ADDR memaddr, char *myaddr, int len, int *errnoptr)
+{
+  int nread;                   /* Number of bytes actually read. */
+  int errcode;                 /* Error from last read. */
+
+  /* First try a complete read. */
+  errcode = target_read_memory (memaddr, myaddr, len);
+  if (errcode == 0)
+    {
+      /* Got it all. */
+      nread = len;
+    }
+  else
+    {
+      /* Loop, reading one byte at a time until we get as much as we can. */
+      for (errcode = 0, nread = 0; len > 0 && errcode == 0; nread++, len--)
+       {
+         errcode = target_read_memory (memaddr++, myaddr++, 1);
+       }
+      /* If an error, the last read was unsuccessful, so adjust count. */
+      if (errcode != 0)
+       {
+         nread--;
+       }
+    }
+  if (errnoptr != NULL)
+    {
+      *errnoptr = errcode;
+    }
+  return (nread);
+}
+
 /*  Print a string from the inferior, starting at ADDR and printing up to LEN
    characters, of WIDTH bytes a piece, to STREAM.  If LEN is -1, printing
    stops at the first null byte, otherwise printing proceeds (including null
@@ -1152,11 +884,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
 /* FIXME: Use target_read_string.  */
 
 int
-val_print_string (addr, len, width, stream)
-     CORE_ADDR addr;
-     int len;
-     int width;
-     GDB_FILE *stream;
+val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream)
 {
   int force_ellipsis = 0;      /* Force ellipsis to be printed if nonzero. */
   int errcode;                 /* Errno returned from bad reads. */
@@ -1200,9 +928,9 @@ val_print_string (addr, len, width, stream)
     {
       buffer = (char *) xmalloc (len * width);
       bufptr = buffer;
-      old_chain = make_cleanup (free, buffer);
+      old_chain = make_cleanup (xfree, buffer);
 
-      nfetch = target_read_memory_partial (addr, bufptr, len * width, &errcode)
+      nfetch = partial_memory_read (addr, bufptr, len * width, &errcode)
        / width;
       addr += nfetch * width;
       bufptr += nfetch * width;
@@ -1223,12 +951,12 @@ val_print_string (addr, len, width, stream)
              buffer = (char *) xrealloc (buffer, (nfetch + bufsize) * width);
            }
 
-         old_chain = make_cleanup (free, buffer);
+         old_chain = make_cleanup (xfree, buffer);
          bufptr = buffer + bufsize * width;
          bufsize += nfetch;
 
          /* Read as much as we can. */
-         nfetch = target_read_memory_partial (addr, bufptr, nfetch * width, &errcode)
+         nfetch = partial_memory_read (addr, bufptr, nfetch * width, &errcode)
            / width;
 
          /* Scan this chunk for the null byte that terminates the string
@@ -1312,13 +1040,13 @@ val_print_string (addr, len, width, stream)
       if (errcode == EIO)
        {
          fprintf_filtered (stream, " <Address ");
-         print_address_numeric (addr, 1, stream);
+         deprecated_print_address_numeric (addr, 1, stream);
          fprintf_filtered (stream, " out of bounds>");
        }
       else
        {
          fprintf_filtered (stream, " <Error reading address ");
-         print_address_numeric (addr, 1, stream);
+         deprecated_print_address_numeric (addr, 1, stream);
          fprintf_filtered (stream, ": %s>", safe_strerror (errcode));
        }
     }
@@ -1332,21 +1060,14 @@ val_print_string (addr, len, width, stream)
    knows what they really did here.  Radix setting is confusing, e.g.
    setting the input radix to "10" never changes it!  */
 
-/* ARGSUSED */
 static void
-set_input_radix (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_input_radix (char *args, int from_tty, struct cmd_list_element *c)
 {
-  set_input_radix_1 (from_tty, *(unsigned *) c->var);
+  set_input_radix_1 (from_tty, input_radix);
 }
 
-/* ARGSUSED */
 static void
-set_input_radix_1 (from_tty, radix)
-     int from_tty;
-     unsigned radix;
+set_input_radix_1 (int from_tty, unsigned radix)
 {
   /* We don't currently disallow any input radix except 0 or 1, which don't
      make any mathematical sense.  In theory, we can deal with any input
@@ -1357,31 +1078,27 @@ set_input_radix_1 (from_tty, radix)
 
   if (radix < 2)
     {
-      error ("Nonsense input radix ``decimal %u''; input radix unchanged.",
+      /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
+         value.  */
+      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);
     }
 }
 
-/* ARGSUSED */
 static void
-set_output_radix (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_output_radix (char *args, int from_tty, struct cmd_list_element *c)
 {
-  set_output_radix_1 (from_tty, *(unsigned *) c->var);
+  set_output_radix_1 (from_tty, output_radix);
 }
 
 static void
-set_output_radix_1 (from_tty, radix)
-     int from_tty;
-     unsigned radix;
+set_output_radix_1 (int from_tty, unsigned radix)
 {
   /* Validate the radix and disallow ones that we aren't prepared to
      handle correctly, leaving the radix unchanged. */
@@ -1397,13 +1114,15 @@ set_output_radix_1 (from_tty, radix)
       output_format = 'o';     /* octal */
       break;
     default:
-      error ("Unsupported output radix ``decimal %u''; output radix unchanged.",
+      /* FIXME: cagney/2002-03-17: This needs to revert the bad radix
+         value.  */
+      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);
     }
 }
@@ -1417,161 +1136,156 @@ set_output_radix_1 (from_tty, radix)
    the 'set input-radix' command. */
 
 static void
-set_radix (arg, from_tty)
-     char *arg;
-     int from_tty;
+set_radix (char *arg, int from_tty)
 {
   unsigned radix;
 
-  radix = (arg == NULL) ? 10 : parse_and_eval_address (arg);
+  radix = (arg == NULL) ? 10 : parse_and_eval_long (arg);
   set_output_radix_1 (0, radix);
   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);
     }
 }
 
 /* Show both the input and output radices. */
 
-/*ARGSUSED */
 static void
-show_radix (arg, from_tty)
-     char *arg;
-     int from_tty;
+show_radix (char *arg, int from_tty)
 {
   if (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);
        }
     }
 }
 \f
 
-/*ARGSUSED */
 static void
-set_print (arg, from_tty)
-     char *arg;
-     int from_tty;
+set_print (char *arg, int from_tty)
 {
   printf_unfiltered (
      "\"set print\" must be followed by the name of a print subcommand.\n");
   help_list (setprintlist, "set print ", -1, gdb_stdout);
 }
 
-/*ARGSUSED */
 static void
-show_print (args, from_tty)
-     char *args;
-     int from_tty;
+show_print (char *args, int from_tty)
 {
   cmd_show_list (showprintlist, from_tty, "");
 }
 \f
 void
-_initialize_valprint ()
+_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);
-  c->function.sfunc = 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);
-  c->function.sfunc = 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,
+                           NULL, /* FIXME: i18n: */
+                           &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,
+                          NULL, /* FIXME: i18n: */
+                          &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,
+                           NULL, /* FIXME: i18n: */
+                           &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("pretty", class_support, &prettyprint_structs, _("\
+Set prettyprinting of structures."), _("\
+Show prettyprinting of structures."), NULL,
+                          NULL,
+                          NULL, /* FIXME: i18n: */
+                          &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,
+                          NULL, /* FIXME: i18n: */
+                          &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("array", class_support, &prettyprint_arrays, _("\
+Set prettyprinting of arrays."), _("\
+Show prettyprinting of arrays."), NULL,
+                          NULL,
+                          NULL, /* FIXME: i18n: */
+                          &setprintlist, &showprintlist);
+
+  add_setshow_boolean_cmd ("address", class_support, &addressprint, _("\
+Set printing of addresses."), _("\
+Show printing of addresses."), NULL,
+                          NULL,
+                          NULL, /* FIXME: i18n: */
+                          &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,
+                           NULL, /* FIXME: i18n: */
+                           &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,
+                           NULL, /* FIXME: i18n: */
+                           &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);
 
   /* Give people the defaults which they are used to.  */
This page took 0.052957 seconds and 4 git commands to generate.