49 static void add_string(
char *p,
size_t *curlenp,
const char *to_add)
51 size_t curlen = *curlenp;
52 while (curlen <
MAXLEN && *to_add)
53 p[curlen++] = *to_add++;
64 static char *symbol_demangle_cplusplus_nested(
const char *
name)
67 size_t result_len = 0,
len;
68 int first = 1, type_added = 0, pointercounter, reference;
79 while (isdigit((
int)*
name)) {
88 add_string(result, &result_len,
"::");
92 result[result_len ++] = *
name++;
103 add_string(result, &result_len,
"{");
106 pointercounter = reference = 0;
108 int argument_done = 0;
112 add_string(result, &result_len,
"char");
116 add_string(result, &result_len,
"signed char");
120 add_string(result, &result_len,
"unsigned char");
124 add_string(result, &result_len,
"int");
128 add_string(result, &result_len,
"unsigned int");
132 add_string(result, &result_len,
"wchar_t");
136 add_string(result, &result_len,
"bool");
140 add_string(result, &result_len,
"short");
144 add_string(result, &result_len,
"unsigned short");
148 add_string(result, &result_len,
"long");
152 add_string(result, &result_len,
"unsigned long");
156 add_string(result, &result_len,
"long long");
160 add_string(result, &result_len,
"unsigned long long");
164 add_string(result, &result_len,
"__int128");
168 add_string(result, &result_len,
"unsigned __int128");
172 add_string(result, &result_len,
"float");
176 add_string(result, &result_len,
"double");
180 add_string(result, &result_len,
"__float80");
184 add_string(result, &result_len,
"__float128");
188 add_string(result, &result_len,
"...");
203 while (pointercounter-- > 0)
204 add_string(result, &result_len,
"*");
205 while (reference-- > 0)
206 add_string(result, &result_len,
"&");
208 add_string(result, &result_len,
",");
214 add_string(result, &result_len,
"}");
219 result[result_len] =
'\0';
246 return symbol_demangle_cplusplus_nested(
name + 1);
257 void test(
char *mangled,
char *result)
261 if (result == NULL) {
264 printf(
"FAILURE for %s!\n", mangled);
268 if (strcmp(p, result) == 0)
270 printf(
"FAILURE for %s! (result = %s)\n", mangled, p);
274 int main(
int argc,
char *argv[])
276 test(
"monkey", NULL);
277 test(
"_monkey", NULL);
278 test(
"_zmonkey", NULL);
279 test(
"_Zmonkey", NULL);
280 test(
"_ZQ5abcde", NULL);
281 test(
"_ZN3abc5defghE",
"abc::defgh");
282 test(
"_ZN05defghEv",
"::defgh{}");
283 test(
"_ZN5defghEv",
"defgh{}");
284 test(
"_ZN3abc5defghEv",
"abc::defgh{}");
285 test(
"_ZN3abc5defghEc",
"abc::defgh{char}");
286 test(
"_ZN1a2bcEjij",
"a::bc{unsigned int,int,unsigned int}");