URI:
       tmangle.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tmangle.c (1007B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <mach.h>
            5 
            6 static char *(*demanglers[])(char*, char*) =
            7 {
            8         demanglegcc2,
            9         demanglegcc3,
           10 };
           11 
           12 char*
           13 demangle(char *s, char *buf, int strip)
           14 {
           15         char *t;
           16         char *r, *w;
           17         int i, nangle, nparen;
           18 
           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;
           27 
           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 }
           55 
           56 #ifdef TEST
           57 void
           58 main(int argc, char **argv)
           59 {
           60         int i;
           61 
           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