[Ada] Fix printing of Wide_Wide_Strings
authorJoel Brobecker <brobecker@gnat.com>
Thu, 13 Jan 2011 23:01:22 +0000 (23:01 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Thu, 13 Jan 2011 23:01:22 +0000 (23:01 +0000)
This fixes the printing of Wide_Wide_String objects.  For instance,
consider:

    My_WWS : Wide_Wide_String := " helo";

Before this patch is applied, GDB prints:

    (gdb) print my_wws
    $1 = " ["00"]h["00"]e"

gdb/ChangeLog:

        * ada-valprint.c (ada_emit_char): Remove strange code.
        Check that c is <= UCHAR_MAX before passing it to isascii.
        (char_at): Do not assume that TYPE_LEN is either 1 or 2.

gdb/ChangeLog
gdb/ada-valprint.c

index e8ba178b788efc5bc3548de657f93f001b94ff68..3490da170adc7bc47b40a25af644df3af35bce43 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-13  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-valprint.c (ada_emit_char): Remove strange code.
+       Check that c is <= UCHAR_MAX before passing it to isascii.
+       (char_at): Do not assume that TYPE_LEN is either 1 or 2.
+
 2011-01-13  Joel Brobecker  <brobecker@adacore.com>
 
        * top.c (input_from_terminal_p): Restrict the use of interactive_mode
index c67266f90231ee89b68c3ac5a923d322c1a9e0e3..630ceb5db13f79f4daaf140e3c1a424fbf288032 100644 (file)
@@ -261,18 +261,19 @@ printable_val_type (struct type *type, const gdb_byte *valaddr)
 
 /* Print the character C on STREAM as part of the contents of a literal
    string whose delimiter is QUOTER.  TYPE_LEN is the length in bytes
-   (1 or 2) of the character.  */
+   of the character.  */
 
 void
 ada_emit_char (int c, struct type *type, struct ui_file *stream,
               int quoter, int type_len)
 {
-  if (type_len != 2)
-    type_len = 1;
-
-  c &= (1 << (type_len * TARGET_CHAR_BIT)) - 1;
-
-  if (isascii (c) && isprint (c))
+  /* If this character fits in the normal ASCII range, and is
+     a printable character, then print the character as if it was
+     an ASCII character, even if this is a wide character.
+     The UCHAR_MAX check is necessary because the isascii function
+     requires that its argument have a value of an unsigned char,
+     or EOF (EOF is obviously not printable).  */
+  if (c <= UCHAR_MAX && isascii (c) && isprint (c))
     {
       if (c == quoter && c == '"')
        fprintf_filtered (stream, "\"\"");
@@ -283,8 +284,8 @@ ada_emit_char (int c, struct type *type, struct ui_file *stream,
     fprintf_filtered (stream, "[\"%0*x\"]", type_len * 2, c);
 }
 
-/* Character #I of STRING, given that TYPE_LEN is the size in bytes (1
-   or 2) of a character.  */
+/* Character #I of STRING, given that TYPE_LEN is the size in bytes
+   of a character.  */
 
 static int
 char_at (const gdb_byte *string, int i, int type_len,
@@ -293,7 +294,8 @@ char_at (const gdb_byte *string, int i, int type_len,
   if (type_len == 1)
     return string[i];
   else
-    return (int) extract_unsigned_integer (string + 2 * i, 2, byte_order);
+    return (int) extract_unsigned_integer (string + type_len * i,
+                                           type_len, byte_order);
 }
 
 /* Wrapper around memcpy to make it legal argument to ui_file_put.  */