diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 861af6e297..47eca16e6e 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2002-07-10 Jason Merrill + + * cp-demangle.c (demangle_identifier): Support extended Unicode + characters. + 2002-07-08 Kaveh R. Ghazi * cp-demangle.c (demangle_v3_with_details): Wrap in diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index e3ef42ce26..eece533e07 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -51,6 +51,8 @@ #include #endif +#include + #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 ."; - 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 81b061d5b2..ecdd732c37 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