diff options
author | rsc <devnull@localhost> | 2005-11-28 00:40:04 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-11-28 00:40:04 +0000 |
commit | 7d6f5677c1ce9bdce141dea16364478216d0f4cc (patch) | |
tree | 03daffa36e5693eed2573b05816a0b1bf6a3db82 /src/libmach/mangle.c | |
parent | 689be541258e9e701a600d6bd2fc3e5241726867 (diff) | |
download | plan9port-7d6f5677c1ce9bdce141dea16364478216d0f4cc.tar.gz plan9port-7d6f5677c1ce9bdce141dea16364478216d0f4cc.tar.bz2 plan9port-7d6f5677c1ce9bdce141dea16364478216d0f4cc.zip |
name mangling, process control
Diffstat (limited to 'src/libmach/mangle.c')
-rw-r--r-- | src/libmach/mangle.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/libmach/mangle.c b/src/libmach/mangle.c new file mode 100644 index 00000000..e9030252 --- /dev/null +++ b/src/libmach/mangle.c @@ -0,0 +1,73 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <mach.h> + +static char *(*demanglers[])(char*, char*) = +{ + demanglegcc2, + demanglegcc3, +}; + +char* +demangle(char *s, char *buf, int strip) +{ + char *t; + char *r, *w; + int i, nangle, nparen; + + for(i=0; i<nelem(demanglers); i++){ + t = demanglers[i](s, buf); + if(t != s) + break; + } + if(t == s || !strip) + return t; + + /* copy name without <> and () - not right, but convenient */ + /* convert :: to $ - not right, but convenient (should fix acid) */ + nangle = 0; + nparen = 0; + for(r=w=buf; *r; r++){ + switch(*r){ + case '<': + nangle++; + break; + case '>': + nangle--; + break; + case '(': + nparen++; + break; + case ')': + nparen--; + break; + default: + if(nparen == 0 && nangle == 0){ + if(*r == ':' && *(r+1) == ':'){ + *w++ = '$'; + r++; + } + else + *w++ = *r; + } + break; + } + } + *w = 0; + return buf; +} + +#ifdef TEST +void +main(int argc, char **argv) +{ + int i; + + for(i=1; i<argc; i++){ + print("%s\n", demangle(argv[i], 0)); + print("\t%s\n", demangle(argv[i], 1)); + } + exits(nil); +} +#endif |