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