merge from gcc
authorDJ Delorie <dj@redhat.com>
Wed, 10 Jul 2002 00:01:58 +0000 (00:01 +0000)
committerDJ Delorie <dj@redhat.com>
Wed, 10 Jul 2002 00:01:58 +0000 (00:01 +0000)
libiberty/ChangeLog
libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 861af6e297b124fdcf3f3b0aea38c0de898ce8f0..47eca16e6e1dc660ed26afddd23ed472703274ca 100644 (file)
@@ -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
index e3ef42ce261d904efff4165091921331ddeb8268..eece533e0704ff3f8c6dae8eba32fb64a9770c26 100644 (file)
@@ -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;
     }
 
index 81b061d5b28d7f10848c97f8856c6331162a62f4..ecdd732c37053e75e6afaf11a758ee2b8f09b590 100644 (file)
@@ -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