diff options
author | Jason Merrill <jason@redhat.com> | 2002-07-09 19:57:09 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2002-07-09 19:57:09 -0400 |
commit | 28a34ec177e7e31eea2d7eb2ce7c2a6bc1ffe06a (patch) | |
tree | b6cd8185156bcc824acef756ee39110f60e25747 /libiberty | |
parent | abf92e26999957d1b373ec56fd0bc8dc3dc5e272 (diff) | |
download | gcc-28a34ec177e7e31eea2d7eb2ce7c2a6bc1ffe06a.zip gcc-28a34ec177e7e31eea2d7eb2ce7c2a6bc1ffe06a.tar.gz gcc-28a34ec177e7e31eea2d7eb2ce7c2a6bc1ffe06a.tar.bz2 |
cp-demangle.c (demangle_identifier): Support extended Unicode characters.
* cp-demangle.c (demangle_identifier): Support extended Unicode
characters.
From-SVN: r55354
Diffstat (limited to 'libiberty')
-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 4a3ee88..5d9552f 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 e3ef42c..eece533 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 81b061d..ecdd732 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 |