Blame


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