mangle.c (1007B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <mach.h> 5 6 static char *(*demanglers[])(char*, char*) = 7 { 8 demanglegcc2, 9 demanglegcc3, 10 }; 11 12 char* 13 demangle(char *s, char *buf, int strip) 14 { 15 char *t; 16 char *r, *w; 17 int i, nangle, nparen; 18 19 t = nil; 20 for(i=0; i<nelem(demanglers); i++){ 21 t = demanglers[i](s, buf); 22 if(t != s) 23 break; 24 } 25 if(t == s || !strip) 26 return t; 27 28 /* copy name without <> and () - not right, but convenient */ 29 /* convert :: to $ - not right, but convenient (should fix acid) */ 30 nangle = 0; 31 nparen = 0; 32 for(r=w=buf; *r; r++){ 33 switch(*r){ 34 case '<': 35 nangle++; 36 break; 37 case '>': 38 nangle--; 39 break; 40 case '(': 41 nparen++; 42 break; 43 case ')': 44 nparen--; 45 break; 46 default: 47 if(nparen == 0 && nangle == 0) 48 *w++ = *r; 49 break; 50 } 51 } 52 *w = 0; 53 return buf; 54 } 55 56 #ifdef TEST 57 void 58 main(int argc, char **argv) 59 { 60 int i; 61 62 for(i=1; i<argc; i++){ 63 print("%s\n", demangle(argv[i], 0)); 64 print("\t%s\n", demangle(argv[i], 1)); 65 } 66 exits(nil); 67 } 68 #endif