From 4ffa5a33921b942a16f4c2d14177d2e5d9d075d3 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Thu, 13 Jan 2011 23:01:22 +0000 Subject: [PATCH] [Ada] Fix printing of Wide_Wide_Strings 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 | 6 ++++++ gdb/ada-valprint.c | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e8ba178b788..3490da170ad 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2011-01-13 Joel Brobecker + + * 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 * top.c (input_from_terminal_p): Restrict the use of interactive_mode diff --git a/gdb/ada-valprint.c b/gdb/ada-valprint.c index c67266f9023..630ceb5db13 100644 --- a/gdb/ada-valprint.c +++ b/gdb/ada-valprint.c @@ -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. */ -- 2.30.2