diff options
-rw-r--r-- | libiberty/ChangeLog | 5 | ||||
-rw-r--r-- | libiberty/cp-demangle.c | 40 | ||||
-rw-r--r-- | libiberty/testsuite/demangle-expected | 4 |
3 files changed, 48 insertions, 1 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 4a3ee88768d..5d9552fb3e7 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2002-07-10 Jason Merrill <jason@redhat.com> + + * cp-demangle.c (demangle_identifier): Support extended Unicode + characters. + 2002-07-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * cp-demangle.c (demangle_v3_with_details): Wrap in diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index e3ef42ce261..eece533e070 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -51,6 +51,8 @@ #include <string.h> #endif +#include <ctype.h> + #include "ansidecl.h" #include "libiberty.h" #include "dyn-string.h" @@ -1466,9 +1468,45 @@ demangle_identifier (dm, length, identifier) while (length-- > 0) { + int ch; if (end_of_name_p (dm)) return "Unexpected end of name in <identifier>."; - if (!dyn_string_append_char (identifier, next_char (dm))) + ch = next_char (dm); + + /* Handle extended Unicode characters. We encode them as __U{hex}_, + where {hex} omits leading 0's. For instance, '$' is encoded as + "__U24_". */ + if (ch == '_' + && peek_char (dm) == '_' + && peek_char_next (dm) == 'U') + { + char buf[10]; + int pos = 0; + advance_char (dm); advance_char (dm); length -= 2; + while (length-- > 0) + { + ch = next_char (dm); + if (!isxdigit (ch)) + break; + buf[pos++] = ch; + } + if (ch != '_' || length < 0) + return STATUS_ERROR; + if (pos == 0) + { + /* __U_ just means __U. */ + if (!dyn_string_append_cstr (identifier, "__U")) + return STATUS_ALLOCATION_FAILED; + continue; + } + else + { + buf[pos] = '\0'; + ch = strtol (buf, 0, 16); + } + } + + if (!dyn_string_append_char (identifier, ch)) return STATUS_ALLOCATION_FAILED; } diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 81b061d5b28..ecdd732c370 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -2587,6 +2587,10 @@ JArray.t(JArray[]) _ZN4Prim1iEibcdfwPN4java4lang6StringEsx Prim.i(int, boolean, byte, double, float, char, java.lang.String, short, long) # +--format=java +_ZN4java4util14Map__U24_Entry11class__U24_E +java.util.Map$Entry.class$ +# --format=hp _Utf58_0_1__1_2147483647__2147483648 _Utf58_0_1__1_2147483647__2147483648 |