* inftarg.c (child_thread_alive): New function to see if a
[deliverable/binutils-gdb.git] / gdb / valprint.c
index 7db3e3da62b23c901b834f31862bf8843fa682a1..d4c86969837cd46d82e92430a37fe79c274705f1 100644 (file)
@@ -28,6 +28,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #include "language.h"
 #include "demangle.h"
+#include "annotate.h"
 
 #include <errno.h>
 
@@ -60,8 +61,8 @@ set_output_radix PARAMS ((char *, int, struct cmd_list_element *));
 static void
 set_output_radix_1 PARAMS ((int, unsigned));
 
-static void
-value_print_array_elements PARAMS ((value, GDB_FILE *, int, enum val_prettyprint));
+static void value_print_array_elements PARAMS ((value_ptr, GDB_FILE *, int,
+                                               enum val_prettyprint));
 
 /* 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"
@@ -136,8 +137,7 @@ val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
 
   /* Ensure that the type is complete and not just a stub.  If the type is
      only a stub and we can't find and substitute its complete type, then
-     print appropriate string and return.  Typical types that my be stubs
-     are structs, unions, and C++ methods. */
+     print appropriate string and return.  */
 
   check_stub_type (type);
   if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
@@ -158,7 +158,7 @@ val_print (type, valaddr, address, stream, format, deref_ref, recurse, pretty)
 
 int
 value_print (val, stream, format, pretty)
-     value val;
+     value_ptr val;
      GDB_FILE *stream;
      int format;
      enum val_prettyprint pretty;
@@ -315,8 +315,10 @@ val_print_type_code_int (type, valaddr, stream)
    printf() that supports "ll" in the format string.  We handle these by seeing
    if the number is actually a long, 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().  USE_LOCAL says whether or not to call the
-   local formatting routine to get the format.  */
+   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).  */
 
 void
 print_longest (stream, format, use_local, val_long)
@@ -601,7 +603,9 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
   elttype = TYPE_TARGET_TYPE (type);
   eltlen = TYPE_LENGTH (elttype);
   len = TYPE_LENGTH (type) / eltlen;
-             
+
+  annotate_array_section_begin (i, elttype);
+
   for (; i < len && things_printed < print_max; i++)
     {
       if (i != 0)
@@ -617,7 +621,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
            }
        }
       wrap_here (n_spaces (2 + 2 * recurse));
-      
+
       rep1 = i + 1;
       reps = 1;
       while ((rep1 < len) && 
@@ -626,12 +630,15 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
          ++reps;
          ++rep1;
        }
-      
+
       if (reps > repeat_count_threshold)
        {
          val_print (elttype, valaddr + i * eltlen, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
+         annotate_elt_rep (reps);
          fprintf_filtered (stream, " <repeats %u times>", reps);
+         annotate_elt_rep_end ();
+
          i = rep1 - 1;
          things_printed += repeat_count_threshold;
        }
@@ -639,9 +646,11 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
        {
          val_print (elttype, valaddr + i * eltlen, 0, stream, format,
                     deref_ref, recurse + 1, pretty);
+         annotate_elt ();
          things_printed++;
        }
     }
+  annotate_array_section_end ();
   if (i < len)
     {
       fprintf_filtered (stream, "...");
@@ -650,7 +659,7 @@ val_print_array_elements (type, valaddr, address, stream, format, deref_ref,
 
 static void
 value_print_array_elements (val, stream, format, pretty)
-     value val;
+     value_ptr val;
      GDB_FILE *stream;
      int format;
      enum val_prettyprint pretty;
@@ -710,6 +719,13 @@ value_print_array_elements (val, stream, format, pretty)
     byte, otherwise printing proceeds (including null bytes) until either
     print_max or LEN characters have been printed, whichever is smaller. */
 
+/* FIXME: All callers supply LEN of zero.  Supplying a non-zero LEN is
+   pointless, this routine just then becomes a convoluted version of
+   target_read_memory_partial.  Removing all the LEN stuff would simplify
+   this routine enormously.
+
+   FIXME: Use target_read_string.  */
+
 int
 val_print_string (addr, len, stream)
     CORE_ADDR addr;
@@ -728,10 +744,6 @@ val_print_string (addr, len, stream)
   struct cleanup *old_chain = NULL; /* Top of the old cleanup chain. */
   char peekchar;               /* Place into which we can read one char. */
 
-  /* If errcode is non-zero, this is the address which failed to read
-     successfully.  */
-  CORE_ADDR err_addr;
-
   /* First we need to figure out the limit on the number of characters we are
      going to attempt to fetch and print.  This is actually pretty simple.  If
      LEN is nonzero, then the limit is the minimum of LEN and print_max.  If
@@ -777,7 +789,6 @@ val_print_string (addr, len, stream)
 
     /* Read as much as we can. */
     nfetch = target_read_memory_partial (addr, bufptr, nfetch, &errcode);
-    err_addr = addr + nfetch;
     if (len != 0)
       {
        addr += nfetch;
@@ -796,7 +807,12 @@ val_print_string (addr, len, stream)
            ++addr;
            ++bufptr;
            if (bufptr[-1] == '\0')
-             break;
+             {
+               /* We don't care about any error which happened after
+                  the NULL terminator.  */
+               errcode = 0;
+               break;
+             }
          }
       }
   } while (errcode == 0                                        /* no error */
@@ -847,13 +863,13 @@ val_print_string (addr, len, stream)
       if (errcode == EIO)
        {
          fprintf_filtered (stream, " <Address ");
-         print_address_numeric (addr, stream);
+         print_address_numeric (addr, 1, stream);
          fprintf_filtered (stream, " out of bounds>");
        }
       else
        {
          fprintf_filtered (stream, " <Error reading address ");
-         print_address_numeric (addr, stream);
+         print_address_numeric (addr, 1, stream);
          fprintf_filtered (stream, ": %s>", safe_strerror (errcode));
        }
     }
This page took 0.02561 seconds and 4 git commands to generate.