68 lines · 1010 B · C
RawDownload
#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;		t = nil;	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)				*w++ = *r;			break;		}	}	*w = 0;	return buf;} #ifdef TESTvoidmain(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