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>
6 7d6f5677 2005-11-28 devnull static char *(*demanglers[])(char*, char*) =
8 7d6f5677 2005-11-28 devnull demanglegcc2,
9 7d6f5677 2005-11-28 devnull demanglegcc3,
13 7d6f5677 2005-11-28 devnull demangle(char *s, char *buf, int strip)
16 7d6f5677 2005-11-28 devnull char *r, *w;
17 7d6f5677 2005-11-28 devnull int i, nangle, nparen;
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)
25 7d6f5677 2005-11-28 devnull if(t == s || !strip)
26 7d6f5677 2005-11-28 devnull return t;
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++;
37 7d6f5677 2005-11-28 devnull case '>':
38 7d6f5677 2005-11-28 devnull nangle--;
40 7d6f5677 2005-11-28 devnull case '(':
41 7d6f5677 2005-11-28 devnull nparen++;
43 7d6f5677 2005-11-28 devnull case ')':
44 7d6f5677 2005-11-28 devnull nparen--;
47 7dc9c4c6 2005-11-29 devnull if(nparen == 0 && nangle == 0)
48 7dc9c4c6 2005-11-29 devnull *w++ = *r;
53 7d6f5677 2005-11-28 devnull return buf;
56 7d6f5677 2005-11-28 devnull #ifdef TEST
58 7d6f5677 2005-11-28 devnull main(int argc, char **argv)
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));
66 7d6f5677 2005-11-28 devnull exits(nil);