aboutsummaryrefslogtreecommitdiff
path: root/src/libmach/mangle.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-11-28 00:40:04 +0000
committerrsc <devnull@localhost>2005-11-28 00:40:04 +0000
commit7d6f5677c1ce9bdce141dea16364478216d0f4cc (patch)
tree03daffa36e5693eed2573b05816a0b1bf6a3db82 /src/libmach/mangle.c
parent689be541258e9e701a600d6bd2fc3e5241726867 (diff)
downloadplan9port-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.c73
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