⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mangle.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 3 页
字号:
            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 + -