name mangling, process control
This commit is contained in:
parent
689be54125
commit
7d6f5677c1
6 changed files with 780 additions and 10 deletions
73
src/libmach/mangle.c
Normal file
73
src/libmach/mangle.c
Normal file
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue