gdb
[deliverable/binutils-gdb.git] / gdb / c-lang.c
index 63be331529f2028408117996a5ccee9a1608099f..775a6f83e8458e8daeb1ccc3910a9540933814f7 100644 (file)
@@ -35,6 +35,7 @@
 #include "cp-support.h"
 #include "gdb_obstack.h"
 #include <ctype.h>
+#include "exceptions.h"
 
 extern void _initialize_c_language (void);
 
@@ -390,6 +391,19 @@ c_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
   int finished = 0;
   int need_escape = 0;
 
+  if (length == -1)
+    {
+      unsigned long current_char = 1;
+
+      for (i = 0; current_char; ++i)
+       {
+         QUIT;
+         current_char = extract_unsigned_integer (string + i * width,
+                                                  width, byte_order);
+       }
+      length = i;
+    }
+
   /* If the string was not truncated due to `set print elements', and
      the last byte of it is a null, we don't print that, in traditional C
      style.  */
@@ -424,19 +438,6 @@ c_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
       return;
     }
 
-  if (length == -1)
-    {
-      unsigned long current_char = 1;
-
-      for (i = 0; current_char; ++i)
-       {
-         QUIT;
-         current_char = extract_unsigned_integer (string + i * width,
-                                                  width, byte_order);
-       }
-      length = i;
-    }
-
   /* Arrange to iterate over the characters, in wchar_t form.  */
   iter = make_wchar_iterator (string, length * width, encoding, width);
   cleanup = make_cleanup_wchar_iterator (iter);
@@ -698,13 +699,19 @@ c_get_string (struct value *value, gdb_byte **buffer, int *length,
     }
   else
     {
-      err = read_string (value_as_address (value), *length, width, fetchlimit,
-                        byte_order, buffer, length);
+      CORE_ADDR addr = value_as_address (value);
+
+      err = read_string (addr, *length, width, fetchlimit,
+                        byte_order, buffer, length);
       if (err)
        {
          xfree (*buffer);
-         error (_("Error reading string from inferior: %s"),
-                safe_strerror (err));
+         if (err == EIO)
+           throw_error (MEMORY_ERROR, "Address %s out of bounds",
+                        paddress (get_type_arch (type), addr));
+         else
+           error (_("Error reading string from inferior: %s"),
+                  safe_strerror (err));
        }
     }
 
@@ -933,7 +940,7 @@ parse_one_string (struct obstack *output, char *data, int len,
    are delegated to evaluate_subexp_standard; see that function for a
    description of the arguments.  */
 
-static struct value *
+struct value *
 evaluate_subexp_c (struct type *expect_type, struct expression *exp,
                   int *pos, enum noside noside)
 {
This page took 0.023987 seconds and 4 git commands to generate.