New files for IA-64 port.
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 2f07114ff962697f2ad4d37fe887c56d0b5a08b9..e1414792b79e2ce4673e2a1d92ab742fc82c069c 100644 (file)
@@ -1,5 +1,5 @@
 /* Print values for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1998
+   Copyright 1986, 1988, 1989, 1991-1994, 1998, 2000
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 /* 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 print_hex_chars (struct ui_file *, unsigned char *,
+                            unsigned int);
 
 static void show_print PARAMS ((char *, int));
 
@@ -127,7 +130,7 @@ val_print (type, valaddr, embedded_offset, address,
      char *valaddr;
      int embedded_offset;
      CORE_ADDR address;
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      int deref_ref;
      int recurse;
@@ -164,7 +167,7 @@ val_print (type, valaddr, embedded_offset, address,
 int
 value_print (val, stream, format, pretty)
      value_ptr val;
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      enum val_prettyprint pretty;
 {
@@ -189,7 +192,7 @@ void
 val_print_type_code_int (type, valaddr, stream)
      struct type *type;
      char *valaddr;
-     GDB_FILE *stream;
+     struct ui_file *stream;
 {
   if (TYPE_LENGTH (type) > sizeof (LONGEST))
     {
@@ -237,10 +240,11 @@ val_print_type_code_int (type, valaddr, stream)
  */
 
 #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 (struct ui_file * stream, char *sign,
+                          int use_local, ULONGEST val_ulong);
 static void
 print_decimal (stream, sign, use_local, val_ulong)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      char *sign;
      int use_local;
      ULONGEST val_ulong;
@@ -277,7 +281,7 @@ print_decimal (stream, sign, use_local, val_ulong)
 
 void
 print_longest (stream, format, use_local, val_long)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      int use_local;
      LONGEST val_long;
@@ -564,7 +568,7 @@ void
 print_floating (valaddr, type, stream)
      char *valaddr;
      struct type *type;
-     GDB_FILE *stream;
+     struct ui_file *stream;
 {
   DOUBLEST doub;
   int inv;
@@ -623,10 +627,16 @@ print_floating (valaddr, type, stream)
        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;
+      {
+#ifdef TARGET_ANALYZE_FLOATING
+       TARGET_ANALYZE_FLOATING;
+#else
+       /* Extended.  We can't detect extended NaNs for this target.
+          Also note that currently extendeds get nuked to double in
+          REGISTER_CONVERTIBLE.  */
+       is_nan = 0;
+#endif 
+      }
 
     if (is_nan)
       {
@@ -635,7 +645,7 @@ print_floating (valaddr, type, stream)
           (in an implementation-defined manner) distinguish between
           signaling and quiet NaN's.  */
        if (high)
-         fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + nonnegative,
+         fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + !!nonnegative,
                            high, low);
        else
          fprintf_filtered (stream, "-NaN(0x%lx)" + nonnegative, low);
@@ -666,7 +676,7 @@ print_floating (valaddr, type, stream)
 
 void
 print_binary_chars (stream, valaddr, len)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      unsigned char *valaddr;
      unsigned len;
 {
@@ -674,7 +684,7 @@ print_binary_chars (stream, valaddr, len)
 #define BITS_IN_BYTES 8
 
   unsigned char *p;
-  int i;
+  unsigned int i;
   int b;
 
   /* Declared "int" so it will be signed.
@@ -730,7 +740,7 @@ print_binary_chars (stream, valaddr, len)
  */
 void
 print_octal_chars (stream, valaddr, len)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      unsigned char *valaddr;
      unsigned len;
 {
@@ -881,7 +891,7 @@ print_octal_chars (stream, valaddr, len)
  */
 void
 print_decimal_chars (stream, valaddr, len)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      unsigned char *valaddr;
      unsigned len;
 {
@@ -1024,7 +1034,7 @@ print_decimal_chars (stream, valaddr, len)
 
 static void
 print_hex_chars (stream, valaddr, len)
-     GDB_FILE *stream;
+     struct ui_file *stream;
      unsigned char *valaddr;
      unsigned len;
 {
@@ -1069,7 +1079,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
      struct type *type;
      char *valaddr;
      CORE_ADDR address;
-     GDB_FILE *stream;
+     struct ui_file *stream;
      int format;
      int deref_ref;
      int recurse;
@@ -1143,6 +1153,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
@@ -1156,7 +1207,7 @@ val_print_string (addr, len, width, stream)
      CORE_ADDR addr;
      int len;
      int width;
-     GDB_FILE *stream;
+     struct ui_file *stream;
 {
   int force_ellipsis = 0;      /* Force ellipsis to be printed if nonzero. */
   int errcode;                 /* Errno returned from bad reads. */
@@ -1202,7 +1253,7 @@ val_print_string (addr, len, width, stream)
       bufptr = buffer;
       old_chain = make_cleanup (free, 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;
@@ -1228,7 +1279,7 @@ val_print_string (addr, len, width, stream)
          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
This page took 0.027032 seconds and 4 git commands to generate.