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 TEST
57 void
58 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