コード例 #1
0
ファイル: dglmake.c プロジェクト: svkaiser/TurokEX
int main(int argc, char** argv)
{
    FILE *f = fopen("dgl.h", "w");
    int i = 0;

    SC_Open("GL.H");

    while(SC_ReadTokens())
    {
        SC_Find(false);

        if(!stricmp(sc_parser.token, "WINGDIAPI"))
        {
            GetGLType(&gldata[i].header);
            SC_Find(false);

            if(!stricmp(sc_parser.token, "APIENTRY"))
            {
                SC_Find(false);
                if(sc_parser.token[0] == 'g' && sc_parser.token[1] == 'l')
                {
                    int j = 0;

                    strcpy(gldata[i].name, sc_parser.token);

                    while(!strrchr(sc_parser.token, ';'))
                    {
                        if(GetGLType(&gldata[i].args[j]))
                            GetGLArg(&gldata[i].args[j]);
                        j++;
                    }

                    i++;
                }
            }
        }
    }

    fprintf(f, "//\n// Generated by dglmake\n//\n");
    fprintf(f, "#ifndef USE_DEBUG_GLFUNCS\n\n");

    SlapGLStuffToFile(f, i, false);
    fprintf(f, "\n#endif // USE_DEBUG_GLFUNCS\n\n");

    SC_Close();

    SlapGLExtensionsToFile(f, "GL_ARB_multitexture");
    SlapGLExtensionsToFile(f, "GL_EXT_compiled_vertex_array");
    SlapGLExtensionsToFile(f, "GL_EXT_multi_draw_arrays");
    SlapGLExtensionsToFile(f, "GL_EXT_fog_coord");
    SlapGLExtensionsToFile(f, "GL_ARB_vertex_buffer_object");
    SlapGLExtensionsToFile(f, "GL_ARB_texture_non_power_of_two");
    SlapGLExtensionsToFile(f, "GL_ARB_texture_env_combine");
    SlapGLExtensionsToFile(f, "GL_EXT_texture_env_combine");
    SlapGLExtensionsToFile(f, "GL_EXT_texture_filter_anisotropic");
    SlapGLExtensionsToFile(f, "GL_ARB_shader_objects");
    SlapGLExtensionsToFile(f, "GL_ARB_framebuffer_object");
    SlapGLExtensionsToFile(f, "GL_ARB_occlusion_query");
    SlapGLExtensionsToFile(f, "GL_EXT_texture_array");

    fclose(f);

    return 1;
}
コード例 #2
0
ファイル: dglmake.c プロジェクト: svkaiser/TurokEX
void SlapGLExtensionsToFile(FILE* f, char* arbstring)
{
    int i = 0;
    int a = 0;
    int j;

    SC_Open("SDL_opengl.h");

    fprintf(f, "//\n// %s\n//\n", arbstring);

    while(SC_ReadTokens())
    {
        SC_Find(false);

        if(!strcmp(sc_parser.token, arbstring))
        {
            SC_Find(false);

            if(strcmp(sc_parser.token, "1"))
                continue;

            while(SC_ReadTokens())
            {
                SC_Find(false);

                if(!strcmp(sc_parser.token, "#endif"))
                {
                    int count;

                    count = i;
                    i = 0;

                    while(i < count)
                    {
                        SC_Find(false);

                        if(!strcmp(sc_parser.token, "(APIENTRYP"))
                        {
                            int j = 0;
                            int len;

                            SC_Find(false);

                            strcpy(gldata[i].extname, sc_parser.token);

                            len = strlen(gldata[i].extname);
                            gldata[i].extname[len - 1] = 0;

                            while(!strrchr(sc_parser.token, ';'))
                            {
                                if(GetGLType(&gldata[i].args[j]))
                                    GetGLArg(&gldata[i].args[j]);
                                j++;
                            }

                            i++;
                        }
                    }

                    break;
                }
                else
                {
                    if(!strcmp(sc_parser.token, "GLAPI"))
                    {
                        GetGLType(&gldata[i].header);
                        SC_Find(false);
                        SC_Find(false);

                        if(sc_parser.token[0] == 'g' && sc_parser.token[1] == 'l')
                        {
                            strcpy(gldata[i].name, sc_parser.token);
                            i++;
                        }
                    }
                }
            }
        }
    }

    fprintf(f, "extern bool has_%s;\n", arbstring);

    if(i > 0)
        fprintf(f, "\n");

    if(i > 0)
        fprintf(f, "#ifndef __IPHONEOS__\n");
    for(j = 0; j < i; j++)
    {
        fprintf(f, "typedef %s ", ReturnGLType(&gldata[j].header));
        if(gldata[j].header.pointer)
            fprintf(f, "*");

        fprintf(f, "(APIENTRYP %s) (", gldata[j].extname);

        a = 0;

        if(gldata[j].args[a].name[0] == 0)
            fprintf(f, "void");
        else
        {
            while(gldata[j].args[a].name[0] != 0)
            {
                if(a > 0)
                    fprintf(f, ", ");

                if(gldata[j].args[a].isconst)
                    fprintf(f, "const ");

                fprintf(f, "%s", ReturnGLType(&gldata[j].args[a]));
                if(gldata[j].args[a].pointer)
                    fprintf(f, "*");

                fprintf(f, " %s", gldata[j].args[a++].name);
            }
        }

        fprintf(f, ");\n");
    }
    if(i > 0)
        fprintf(f, "#endif // __IPHONEOS__\n");

    if(i > 0)
        fprintf(f, "\n");

    if(i > 0)
        fprintf(f, "#ifndef __IPHONEOS__\n");
    for(j = 0; j < i; j++)
    {
        fprintf(f, "extern %s _%s;\n", gldata[j].extname, gldata[j].name);
    }
    if(i > 0)
        fprintf(f, "#endif // __IPHONEOS__\n");

    fprintf(f, "\n");

    fprintf(f, "#ifndef __IPHONEOS__\n");
    fprintf(f, "#define %s_Define() \\\n", arbstring);
    fprintf(f, "bool has_%s = false;", arbstring);
    if(i > 0)
        fprintf(f, " \\\n");
    else
        fprintf(f, "\n");

    for(j = 0; j < i; j++)
    {
        fprintf(f, "%s _%s = NULL", gldata[j].extname, gldata[j].name);
        if(j < (i - 1))
            fprintf(f, "; \\\n");
        else
            fprintf(f, "\n");
    }
    fprintf(f, "#else\n");
    fprintf(f, "#define %s_Define() bool has_%s = false;\n", arbstring, arbstring);
    fprintf(f, "#endif // __IPHONEOS__\n");

    fprintf(f, "\n");

    fprintf(f, "#ifndef __IPHONEOS__\n");
    fprintf(f, "#define %s_Init() \\\n", arbstring);
    fprintf(f, "has_%s = GL_CheckExtension(\"%s\");", arbstring, arbstring);

    if(i > 0)
        fprintf(f, " \\\n");
    else
        fprintf(f, "\n");

    for(j = 0; j < i; j++)
    {
        fprintf(f, "_%s = (%s)GL_RegisterProc(\"%s\")", gldata[j].name, gldata[j].extname, gldata[j].name);
        if(j < (i - 1))
            fprintf(f, "; \\\n");
        else
            fprintf(f, "\n");
    }
    fprintf(f, "#else\n");
    fprintf(f, "#define %s_Init() has_%s = true;\n", arbstring, arbstring);
    fprintf(f, "#endif // __IPHONEOS__\n");

    fprintf(f, "\n");

    if(i > 0)
    {
        fprintf(f, "#ifndef USE_DEBUG_GLFUNCS\n\n");

        SlapGLStuffToFile(f, i, true);
        fprintf(f, "\n#endif // USE_DEBUG_GLFUNCS\n\n");
    }

    SC_Close();
}
コード例 #3
0
ファイル: parse.c プロジェクト: alexey-lysiuk/doom64ex-osx
static void PS_ParseOuter(void)
{
    while(SC_ReadTokens())
    {
        SC_Find();

        switch(sc_parser->tokentype)
        {
        case TK_NONE:
            break;
        case TK_EOF:
            return;
        case TK_IDENIFIER:
            PS_ParseIdentifier();
            break;
        case TK_POUND:
            {
                SC_Find();
                switch(sc_parser->tokentype)
                {
                case TK_INCLUDE:
                    {
                        static char includepath[256];

                        SC_GetString();
                        SC_PushParser();

                        sprintf(includepath, "%s%s",
                            ps_userdirectory, sc_stringbuffer);

                        SC_Open(includepath);
                        PS_ParseOuter();
                        SC_Close();
                    }
                    break;
                case TK_DEFINE:
                    SC_ExpectNextToken(TK_IDENIFIER);
                    SC_AddIdentifier();
                    break;
                case TK_UNDEF:
                    SC_ExpectNextToken(TK_IDENIFIER);
                    SC_RemoveIdentifier();
                    break;
                case TK_SETDIR:
                    SC_GetString();
                    sprintf(ps_userdirectory, "%s", sc_parser->token);
                    break;
                default:
                    break;
                }
            }
            break;
        case TK_MACRO:
            SC_ExpectNextToken(TK_NUMBER);
            M_NewMacro(SC_GetNumber());
            SC_ExpectNextToken(TK_LBRACK);
            PS_ParseInner();
            M_FinishMacro();
            break;
        default:
            SC_Error("Unknown token in outer block: %s", sc_parser->token);
            break;
        }
    }
}
コード例 #4
0
ファイル: dglmake.c プロジェクト: svkaiser/TurokEX
static int SC_Find(dboolean forceupper)
{
    char c = 0;
    int i = 0;
    dboolean comment = false;
    dboolean havetoken = false;
    dboolean string = false;

    memset(sc_parser.token, 0, 256);

    while(SC_ReadTokens())
    {
        c = SC_GetChar();

        if(c == '/')
            comment = true;

        if(comment == false)
        {
            if(c == '"')
            {
                if(!string)
                {
                    string = true;
                    continue;
                }
                else if(havetoken)
                    return true;
            }

            if(!string)
            {
                if(c > ' ')
                {
                    havetoken = true;
                    sc_parser.token[i++] =
                        forceupper ? toupper(c) : c;
                }
                else if(havetoken)
                    return true;
            }
            else
            {
                if(c >= ' ')
                {
                    havetoken = true;
                    sc_parser.token[i++] =
                        forceupper ? toupper(c) : c;
                }
            }
        }

        if(c == '\n')
        {
            sc_parser.linepos++;
            sc_parser.rowpos = 1;
            comment = false;
            if(string)
                sc_parser.token[i++] = c;
        }
    }

    return false;
}
コード例 #5
0
ファイル: parse.c プロジェクト: alexey-lysiuk/doom64ex-osx
static void PS_ParseInner(void)
{
    while(SC_ReadTokens())
    {
        SC_Find();

        switch(sc_parser->tokentype)
        {
        case TK_NONE:
            break;
        case TK_EOF:
            return;
        case TK_NUMBER:
            {
                int special;
                int tag;

                special = SC_GetNumber();
                SC_ExpectNextToken(TK_COLON);
                SC_ExpectNextToken(TK_NUMBER);
                tag = SC_GetNumber();

                M_AppendAction(special, tag);

                SC_ExpectNextToken(TK_SEMICOLON);
            }
            break;
        case TK_RBRACK:
            if(ps_enterloop)
            {
                ps_enterloop = false;
                M_NewLine();
                M_AppendAction(204, ps_loopline);
                M_AppendAction(246, ps_loopvalue);
                M_NewLine();
            }
            return;
        case TK_IDENIFIER:
            PS_ParseIdentifier();
            break;
        case TK_WAIT:
            M_NewLine();
            SC_ExpectNextToken(TK_SEMICOLON);
            break;
        case TK_LOOP:
            if(ps_enterloop)
            {
                SC_Error("Nested loops is not allowed");
            }

            ps_enterloop = true;
            M_NewLine();
            ps_loopline = M_GetLine();
            SC_ExpectNextToken(TK_LPAREN);
            SC_ExpectNextToken(TK_NUMBER);
            ps_loopvalue = SC_GetNumber();
            SC_ExpectNextToken(TK_RPAREN);
            SC_ExpectNextToken(TK_LBRACK);
            PS_ParseInner();
            break;
        default:
            SC_Error("Unknown token in macro block: %s", sc_parser->token);
            break;
        }
    }
}