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

📄 rc.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
📖 第 1 页 / 共 5 页
字号:

void input_resid(RES_ID *id)
{
    int i;
    switch (lastst)
    {
        case ident:
            id->hasname = 1;
            for (i = 0; i < strlen(lastid); i++)
                lastid[i] = toupper(lastid[i]);
            id->v.n.len = unicode_from_ascii(&id->v.n.name, lastid, strlen
                (lastid));
            getsym();
            break;
        case iconst:
        case lconst:
        case iuconst:
        case luconst:
            id->hasname = 0;
            id->v.id = intexpr();
            break;
        default:
            generror(ERR_RESOURCE_ID_EXPECTED, 0, 0);
            break;

    }
}

//-------------------------------------------------------------------------

void input_quoted_resid(RES_ID *id)
{
    if (is_number())
        input_resid(id);
    else if (lastst == sconst)
    {
        id->hasname = 1;
        id->v.n.len = unicode_from_ascii(&id->v.n.name, laststr, laststrlen);
        getsym();
    }
    else
        generror(ERR_INVALIDCLASS, 0, 0);
}

//-------------------------------------------------------------------------

void input_secondary_characteristics(RES_INFO *info)
{
    int done = FALSE;
    info->language = base_language;
    while (!done)
    {
        while (lastst == eol)
            getsym();
        switch (lastst)
        {
            case kw_language:
                getsym();
                info->language = intexpr();
                skip_comma();
                intexpr();
                break;
            case kw_version:
                getsym();
                info->version = intexpr();
                break;
            case kw_characteristics:
                getsym();
                info->characteristics = intexpr();
                break;
            default:
                done = TRUE;
                break;
        }
        if (!done)
        {
            need_eol();
        }
    }
}

//-------------------------------------------------------------------------

void input_memflags(RES_INFO *info)
{
    int done = FALSE;
    while (!done)
    {
        switch (lastst)
        {
            case kw_discardable:
                info->memflags |= MF_DISCARDABLE;
                break;
            case kw_pure:
                info->memflags |= MF_PURE;
                break;
            case kw_preload:
                info->memflags |= MF_PRELOAD;
                break;
            case kw_moveable:
                info->memflags |= MF_MOVEABLE;
                break;
            case kw_nondiscardable:
                info->memflags &= ~MF_DISCARDABLE;
                break;
            case kw_impure:
                info->memflags &= ~MF_PURE;
                break;
            default:
                done = TRUE;
                break;
        }
        if (!done)
        {
            getsym();
        }
        skip_comma();
    }
}

//-------------------------------------------------------------------------

void getfilename(void)
{
    int done = FALSE;
    if (lastst == sconst)
    {
        getsym();
        return ;
    }
    laststr[0] = 0;
    while (!done)
    {
        switch (lastst)
        {
            case divide:
            case backslash:
                strcat(laststr, "\\");
                break;
            case dot:
                strcat(laststr, ".");
                break;
            case ident:
                strcat(laststr, lastid);
                break;
            default:
                done = TRUE;
                break;
        }
        if (!done)
            getsym();
    }
}

//-------------------------------------------------------------------------

int input_string(CHARACTER **string)
{
    int rv;
    if (lastst == sconst)
    {
        rv = unicode_from_ascii(string, laststr, laststrlen);
        getsym();
    }
    else
        generror(ERR_STRING_EXPECTED, 0, 0);
    return rv;
}

//-------------------------------------------------------------------------

void parse_accelerator(RES_ID *id, RES_INFO *info)
{
    int mode;
    struct accelerator *data,  **p = &data,  *x;
    getsym();
    input_memflags(info);
    need_eol();
    info->memflags |= MF_PURE;
    info->memflags &= ~MF_DISCARDABLE;
    input_secondary_characteristics(info);
    need_begin();
    //  info->memflags = MF_PURE | MF_MOVEABLE ;

    while (TRUE)
    {
        int done;
        x =  *p = AllocateMemory(sizeof(*data));
        x->link = NULL;
        x->flags = 0;
        if (lastst == sconst)
        {
            if (laststr[0] == '^')
                x->key = laststr[1] &0x1f;
            else
                x->key = laststr[0];
            mode = 1;
            getsym();
        } 
        else if (is_number())
        {
            x->key = intexpr();
            mode = 0;
        }
        else
            break;
        skip_comma();
        x->id = intexpr();
        skip_comma();
        done = FALSE;
        while (!done)
        {
            switch (lastst)
            {
                case kw_ascii:
                    x->flags &= ~ACC_VIRTKEY;
                    break;
                case kw_virtkey:
                    x->flags |= ACC_VIRTKEY;
                    break;
                case kw_noinvert:
                    x->flags |= ACC_NOINVERT;
                    break;
                case kw_shift:
                    x->flags |= ACC_SHIFT;
                    break;
                case kw_control:
                    x->flags |= ACC_CONTROL;
                    break;
                case kw_alt:
                    x->flags |= ACC_ALT;
                    break;
                default:
                    done = TRUE;
                    break;
            }
            if (!done)
            {
                getsym();
                skip_comma();
            }
        }
        need_eol();
        p = &(*p)->link;

    }
    *p = 0;
    need_end();
    define_accelerator(id, info, data);
}

//-------------------------------------------------------------------------

void parse_bitmap(RES_ID *id, RES_INFO *info)
{
    incconst = TRUE;
    info->memflags |= MF_PURE;
    info->memflags &= ~MF_DISCARDABLE;
    getsym();
    input_memflags(info);
    getfilename();
    need_eol();
    define_bitmap(id, info, laststr);
    incconst = FALSE;
}

//-------------------------------------------------------------------------

void parse_cursor(RES_ID *id, RES_INFO *info)
{
    incconst = TRUE;
    getsym();

    input_memflags(info);
    getfilename();
    need_eol();
    define_cursor(id, info, laststr);
    incconst = FALSE;
}

//-------------------------------------------------------------------------

void dlg_error(extended)
{
    if (!extended)
        generror(ERR_NOT_DIALOGEX, 0, 0);
}

//-------------------------------------------------------------------------

void input_dialog_settings(struct dialog *dlg, RES_INFO *info, int extended)
{
    int done = FALSE;
    info->language = base_language;
    while (!done)
    {
        while (lastst == eol)
            getsym();
        switch (lastst)
        {
            case kw_language:
                getsym();
                info->language = intexpr();
                skip_comma();
                intexpr();
                break;
            case kw_version:
                getsym();
                info->version = intexpr();
                break;
            case kw_characteristics:
                getsym();
                info->characteristics = intexpr();
                break;
            case kw_style:
                getsym();
                dlg->style |= intexpr();
                break;
            case kw_exstyle:
                getsym();
                dlg->exstyle |= intexpr();

                break;
            case kw_menu:
                getsym();
                input_resid(&dlg->menu);
                break;
            case kw_font:
                dlg->style |= DS_SETFONT;
                getsym();
                dlg->pointsize = intexpr();
                skip_comma();
                input_string(&dlg->font);
                break;
            case kw_caption:
                //                dlg->style |= WS_DLGFRAME ;
                getsym();
                input_string(&dlg->caption);
                break;
            case kw_class:
                getsym();
                input_quoted_resid(&dlg->class );
                break;
            case kw_help:
                getsym();
                dlg_error(extended);
                dlg->ex->help = intexpr();
                break;
            case kw_weight:
                getsym();
                dlg_error(extended);
                dlg->ex->weight = intexpr();
                break;
            case kw_italic:
                getsym();
                dlg_error(extended);
                dlg->ex->italic = intexpr();
                break;
            default:
                done = TRUE;
                break;
    }
    if (!done)
    {
            need_eol();
    }
}

//-------------------------------------------------------------------------

}

//-------------------------------------------------------------------------

void parse_control_extended(struct dialog_control *c, int extended)
{
        //	if (extended) {
        if (lastst != eol)
        {
                c->exstyle = intexpr();
                skip_comma();
        } if (lastst != eol)
        {
                c->help = intexpr();
                skip_comma();
        }
        //	}
}

//-------------------------------------------------------------------------

void set_class(struct dialog_control *c, int st)
{
        int v = 0;
        int found = TRUE;
        switch (st)
        {
                case kw_auto3state:
                case kw_autocheckbox:
                case kw_autoradiobutton:
                case kw_checkbox:
                case kw_pushbutton:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -