68 lines
1,010 B
C
68 lines
1,010 B
C
#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
|