📄 mangle.c
字号:
manglenamecount = - 1;
return (litlate(buf));
}
static void unmangdollars(char *buf, char **nm)
{
int quote = FALSE;
if (**nm == '$')
{
buf += strlen(buf);
(*nm) += 2;
*buf++ = '(';
if ((*nm)[ - 1] == 's')
{
quote = TRUE;
*buf++ = '"';
}
while (**nm && **nm != '$')
*buf++ = *(*nm)++;
if (quote)
*buf++ = '"';
*buf++ = ')';
*buf = 0;
if (**nm)
(*nm)++;
}
}
/* Argument unmangling for C++ */
char *unmang1(char *buf, char *name, int firsttime)
{
int v;
int cvol = 0, cconst = 0;
char buf1[256], *p, buf2[256];
while (*name == 'x' || *name == 'y')
{
if (*name == 'y')
cvol++;
if (*name == 'x')
cconst++;
name++;
}
start: if (isdigit(*name))
{
v = *name++ - '0';
while (isdigit(*name))
v = v * 10+ *name++ - '0';
if (name[0] == '#')
{
name++;
while (*name && *name != '$' && *name != '#')
*buf++ = *name++;
*buf = 0;
if (*name == '$')
{
name++;
name = unmang1(buf, name, 0);
}
name++;
buf += strlen(buf);
}
else
{
char *s = buf;
while (v--)
if (*name == '@')
{
*buf++ = ':';
*buf++ = ':';
name++;
}
else
*buf++ = *name++;
*buf = 0;
if (manglenamecount < MAX_MANGLE_NAME_COUNT)
strcpy(manglenames[manglenamecount++], s);
}
}
else
switch (*name++)
{
case 'Q':
if (!firsttime)
{
strcpy(buf, " (far *) ");
buf += 5;
}
name = unmangcppfunc(buf, name, FALSE);
break;
case 'q':
{
char *s = buf;
if (!firsttime)
{
strcpy(buf, " (*) ");
buf += 5;
}
if (*name == 'p' && *(name + 1) == 'q')
name++;
name = unmangcppfunc(buf, name, FALSE);
if (*(name - 1) == '$')
{
name = unmang1(buf1, name, FALSE);
strcpy(buf2, s);
sprintf(s, "%s %s", buf1, buf2);
buf = s + strlen(s);
}
}
break;
case 't':
name = unmangcpptype(buf, name, FALSE);
break;
case 'u':
strcpy(buf, "unsigned ");
buf = buf + 9;
switch (*name++)
{
case 'i':
strcpy(buf, tn_int);
unmangdollars(buf, &name);
break;
case 'l':
strcpy(buf, tn_long);
unmangdollars(buf, &name);
break;
case 'L':
strcpy(buf, tn_longlong);
unmangdollars(buf, &name);
break;
case 's':
strcpy(buf, tn_short);
unmangdollars(buf, &name);
break;
case 'c':
strcpy(buf, tn_char);
unmangdollars(buf, &name);
break;
}
break;
case 'M':
if (*name == 'n')
{
name++;
v = *name++ - '0';
if (v > 9)
v -= 7;
strcpy(buf1, manglenames[v]);
p = buf1 + strlen(buf1);
}
else
{
v = *name++ - '0';
while (isdigit(*name))
v = v * 10+ *name++ - '0';
p = buf1;
while (v--)
{
if (*name == '@')
{
name++;
*p++ = ':';
*p++ = ':';
}
else
*p++ = *name++;
*p = 0;
}
if (manglenamecount < MAX_MANGLE_NAME_COUNT)
strcpy(manglenames[manglenamecount++], buf1);
}
strcpy(p, "::*");
if (*name == 'q')
{
p += strlen(p);
*p++ = ')';
*p = 0;
name++;
name = unmangcppfunc(p, name, FALSE);
name = unmang1(buf2, name, FALSE);
sprintf(buf, "%s (%s", buf2, buf1);
}
else
{
name = unmang1(buf2, name, FALSE);
sprintf(buf, "%s %s", buf2, buf1);
}
buf = buf + strlen(buf);
break;
case 'n':
v = *name++ - '0';
if (v > 9)
v -= 7;
strcpy(buf, manglenames[v]);
break;
case 'v':
strcpy(buf, tn_void);
break;
case 'F':
strcpy(buf, tn_fcomplex);
unmangdollars(buf, &name);
break;
case 'D':
strcpy(buf, tn_rcomplex);
unmangdollars(buf, &name);
break;
case 'G':
strcpy(buf, tn_lrcomplex);
unmangdollars(buf, &name);
break;
case 'f':
strcpy(buf, tn_float);
unmangdollars(buf, &name);
break;
case 'd':
strcpy(buf, tn_double);
unmangdollars(buf, &name);
break;
case 'g':
strcpy(buf, tn_longdouble);
unmangdollars(buf, &name);
break;
case 'i':
strcpy(buf, tn_int);
unmangdollars(buf, &name);
break;
case 'l':
strcpy(buf, tn_long);
unmangdollars(buf, &name);
break;
case 'L':
strcpy(buf, tn_longlong);
unmangdollars(buf, &name);
break;
case 's':
strcpy(buf, tn_short);
unmangdollars(buf, &name);
break;
case 'c':
strcpy(buf, tn_char);
unmangdollars(buf, &name);
break;
case 'p':
name = unmang1(buf, name, FALSE);
buf = buf + strlen(buf);
*buf++ = '*';
*buf = 0;
break;
case 'P':
name = unmang1(buf, name, FALSE);
buf = buf + strlen(buf);
strcpy(buf, "far * ");
break;
case 'r':
name = unmang1(buf, name, FALSE);
buf = buf + strlen(buf);
*buf++ = '&';
*buf = 0;
break;
case 'e':
strcpy(buf, tn_ellipse);
break;
case '$':
name--;
return name;
}
if (cconst)
strcat(buf, tn_const);
if (cvol)
strcat(buf, tn_vol);
return name;
}
/* Unmangle an entire C++ function */
static char *unmangcppfunc(char *buf, char *name, int firsttime)
{
int i;
*buf++ = '(';
while (*name && *name != '$')
{
name = unmang1(buf, name, firsttime);
buf = buf + strlen(buf);
if (*name && *name != '$')
{
*buf++ = ',';
}
else
{
*buf++ = ')';
}
}
if (*name && *name == '$')
name++;
*buf = 0;
return name;
}
static char *unmangcpptype(char *buf, char *name, int firsttime)
{
int i;
*buf++ = '<';
while (*name && *name != '$' && *name != '@' && *name != '#')
{
name = unmang1(buf, name, firsttime);
buf = buf + strlen(buf);
if (*name && *name != '$' && *name != '@' && *name != '#')
{
*buf++ = ',';
}
else
{
*buf++ = '>';
*buf++ = ' ';
}
}
if (*name && *name == '$')
name++;
*buf = 0;
return name;
}
static void xlate_cppname(char **buf, char **name, char *lastname)
{
char classname[256], *p = classname;
*p = 0;
if (**name == '@')
(*name)++;
if (**name == '$')
cpp_unmang_intrins(buf, name, lastname);
else
{
while (**name == '@')
(*name)++;
if (**name == '#')
(*name)++;
while (**name != '$' && **name)
{
if (**name == '@')
{
*(*buf)++ = ':';
*(*buf)++ = ':';
*p = 0;
xlate_cppname(buf, name, classname);
}
else if (**name == '#')
(*name)++;
else
*p++ = *(*buf)++ = *(*name)++;
}
}
**buf = 0;
}
/* Name unmangling in general */
void unmangle(char *buf, char *name)
{
char classname[256];
manglenamecount = 0;
classname[0] = 0;
if (name[0] == '_' && prm_cmangle)
{
strcpy(buf, &name[1]);
}
else
if (name[0] != '@' && name[0] != '#')
strcpy(buf, name);
else
{
int done = FALSE;
char *p = buf;
xlate_cppname(&buf, &name, 0);
strcpy(classname, p);
while (!done && *name)
{
if (*name == '$')
{
name++;
done = !(*name == 't');
name = unmang1(buf, name, TRUE);
buf += strlen(buf);
}
else if (*name == '@')
{
name++;
if (*name != '$' || name[1] == 'o' || name[1] == 'b')
{
buf[0] = buf[1] = ':';
buf += 2;
p = buf;
xlate_cppname(&buf, &name, classname);
strcpy(classname, p);
}
}
else if (*name == '#')
name++;
else
{
done = TRUE;
*buf++ = 0;
}
}
}
// else
// strcpy(buf, &name[0]);
manglenamecount = - 1;
}
//-------------------------------------------------------------------------
char *funcwithns(SYM *sp)
{
char buf[512];
buf[0] = 0;
strcpy(manglens(buf, sp->value.classdata.parentns), sp->name);
return litlate(buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -