| #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 |