00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "config.h"
00029 #include "system.h"
00030 #include "jcf.h"
00031 #include "tree.h"
00032 #include "java-tree.h"
00033 #include "obstack.h"
00034 #include "toplev.h"
00035 #include "obstack.h"
00036
00037 static void append_unicode_mangled_name PARAMS ((const char *, int));
00038 #ifndef HAVE_AS_UTF8
00039 static int unicode_mangling_length PARAMS ((const char *, int));
00040 #endif
00041
00042 extern struct obstack *mangle_obstack;
00043
00044
00045
00046
00047 #ifndef HAVE_AS_UTF8
00048
00049
00050
00051
00052
00053
00054 void
00055 append_gpp_mangled_name (name, len)
00056 const char *name;
00057 int len;
00058 {
00059 int encoded_len = unicode_mangling_length (name, len);
00060 int needs_escapes = encoded_len > 0;
00061 char buf[6];
00062
00063 sprintf (buf, "%d", (needs_escapes ? encoded_len : len));
00064 obstack_grow (mangle_obstack, buf, strlen (buf));
00065
00066 if (needs_escapes)
00067 append_unicode_mangled_name (name, len);
00068 else
00069 obstack_grow (mangle_obstack, name, len);
00070 }
00071
00072
00073
00074
00075
00076
00077 static void
00078 append_unicode_mangled_name (name, len)
00079 const char *name;
00080 int len;
00081 {
00082 const unsigned char *ptr;
00083 const unsigned char *limit = (const unsigned char *)name + len;
00084 int uuU = 0;
00085 for (ptr = (const unsigned char *) name; ptr < limit; )
00086 {
00087 int ch = UTF8_GET(ptr, limit);
00088
00089 if ((ISALNUM (ch) && ch != 'U') || ch == '$')
00090 obstack_1grow (mangle_obstack, ch);
00091
00092 else
00093 {
00094 char buf [9];
00095 if (ch == '_' || ch == 'U')
00096 {
00097
00098 if (ch == '_' && (uuU < 3))
00099 {
00100 uuU++;
00101 obstack_1grow (mangle_obstack, ch);
00102 }
00103
00104
00105 else if (ch == 'U' && (uuU == 2))
00106 {
00107 uuU = 0;
00108 obstack_grow (mangle_obstack, "U_", 2);
00109 }
00110
00111
00112 else
00113 {
00114 uuU = 0;
00115 obstack_1grow (mangle_obstack, ch);
00116 }
00117 continue;
00118 }
00119 sprintf (buf, "__U%x_", ch);
00120 obstack_grow (mangle_obstack, buf, strlen (buf));
00121 uuU = 0;
00122 }
00123 }
00124 }
00125
00126
00127
00128
00129
00130 static int
00131 unicode_mangling_length (name, len)
00132 const char *name;
00133 int len;
00134 {
00135 const unsigned char *ptr;
00136 const unsigned char *limit = (const unsigned char *)name + len;
00137 int need_escapes = 0;
00138 int num_chars = 0;
00139 int uuU = 0;
00140 for (ptr = (const unsigned char *) name; ptr < limit; )
00141 {
00142 int ch = UTF8_GET(ptr, limit);
00143
00144 if (ch < 0)
00145 error ("internal error - invalid Utf8 name");
00146 if ((ISALNUM (ch) && ch != 'U') || ch == '$')
00147 num_chars++;
00148
00149 else
00150 {
00151 int encoding_length = 2;
00152
00153 if (ch == '_' || ch == 'U')
00154 {
00155
00156 num_chars++;
00157
00158
00159 if (ch == '_' && (uuU < 3))
00160 uuU++;
00161
00162
00163
00164 else if (ch == 'U' && (uuU == 2))
00165 {
00166 num_chars++;
00167 need_escapes = 1;
00168 uuU = 0;
00169 }
00170
00171 else
00172 uuU = 0;
00173
00174 continue;
00175 }
00176
00177 if (ch > 0xff)
00178 encoding_length++;
00179 if (ch > 0xfff)
00180 encoding_length++;
00181
00182 num_chars += (4 + encoding_length);
00183 need_escapes = 1;
00184 uuU = 0;
00185 }
00186 }
00187 if (need_escapes)
00188 return num_chars;
00189 else
00190 return 0;
00191 }
00192
00193 #else
00194
00195
00196
00197
00198
00199
00200 void
00201 append_gpp_mangled_name (name, len)
00202 const char *name;
00203 int len;
00204 {
00205 const unsigned char *ptr;
00206 const unsigned char *limit = (const unsigned char *)name + len;
00207 int encoded_len;
00208 char buf [6];
00209
00210
00211 for (encoded_len = 0, ptr = (const unsigned char *) name;
00212 ptr < limit; encoded_len++)
00213 {
00214 int ch = UTF8_GET(ptr, limit);
00215
00216 if (ch < 0)
00217 error ("internal error - invalid Utf8 name");
00218 }
00219
00220 sprintf (buf, "%d", encoded_len);
00221 obstack_grow (mangle_obstack, buf, strlen (buf));
00222 obstack_grow (mangle_obstack, name, len);
00223 }
00224
00225 #endif