Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <mach.h>6 static char *(*demanglers[])(char*, char*) =7 {8 demanglegcc2,9 demanglegcc3,10 };12 char*13 demangle(char *s, char *buf, int strip)14 {15 char *t;16 char *r, *w;17 int i, nangle, nparen;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;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 }56 #ifdef TEST57 void58 main(int argc, char **argv)59 {60 int i;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