#include <u.h> | |
#include <libc.h> | |
#include <bio.h> | |
#include <mach.h> | |
static char *(*demanglers[])(char*, char*) = | |
{ | |
demanglegcc2, | |
demanglegcc3, | |
}; | |
char* | |
demangle(char *s, char *buf, int strip) | |
{ | |
char *t; | |
char *r, *w; | |
int i, nangle, nparen; | |
t = nil; | |
for(i=0; i<nelem(demanglers); i++){ | |
t = demanglers[i](s, buf); | |
if(t != s) | |
break; | |
} | |
if(t == s || !strip) | |
return t; | |
/* copy name without <> and () - not right, but convenient */ | |
/* convert :: to $ - not right, but convenient (should fix acid) */ | |
nangle = 0; | |
nparen = 0; | |
for(r=w=buf; *r; r++){ | |
switch(*r){ | |
case '<': | |
nangle++; | |
break; | |
case '>': | |
nangle--; | |
break; | |
case '(': | |
nparen++; | |
break; | |
case ')': | |
nparen--; | |
break; | |
default: | |
if(nparen == 0 && nangle == 0) | |
*w++ = *r; | |
break; | |
} | |
} | |
*w = 0; | |
return buf; | |
} | |
#ifdef TEST | |
void | |
main(int argc, char **argv) | |
{ | |
int i; | |
for(i=1; i<argc; i++){ | |
print("%s\n", demangle(argv[i], 0)); | |
print("\t%s\n", demangle(argv[i], 1)); | |
} | |
exits(nil); | |
} | |
#endif |