예제 #1
0
파일: dglmake.c 프로젝트: svkaiser/TurokEX
void GetGLArg(glinfo_t* info)
{
    char temp[30];
    char *temp2;
    int len;

    SC_Find(false);

    strcpy(temp, sc_parser.token);
    len = strlen(sc_parser.token);

    if(temp[len-1] == ')' || temp[len-1] == ',')
        temp[len-1] = 0;
    else if(strstr(temp, ");"))
    {
        temp[len-1] = 0;
        temp[len-2] = 0;
    }

    if(temp[0] == '*')
    {
        temp2 = (temp + 1);
        info->pointer = true;
    }
    else if(temp[0] == '(')
        temp2 = (temp + 1);
    else
        temp2 = temp;

    strcpy(info->name, temp2);
}
예제 #2
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;
}
예제 #3
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();
}
예제 #4
0
파일: dglmake.c 프로젝트: svkaiser/TurokEX
int GetGLType(glinfo_t* info)
{
    char *temp;

    SC_Find(false);

    if(!strcmp(sc_parser.token, "(void);"))
        return 0;

    if(strchr(sc_parser.token, '('))
        temp = (sc_parser.token + 1);
    else
        temp = sc_parser.token;

    if(!strcmp(temp, "const"))
    {
        info->isconst = true;
        return GetGLType(info);
    }

    if(!strcmp(temp, "void"))
        info->type = 0;

    else if(!strcmp(temp, "GLenum"))
        info->type = 1;

    else if(!strcmp(temp, "GLboolean"))
        info->type = 2;

    else if(!strcmp(temp, "GLbitfield"))
        info->type = 3;

    else if(!strcmp(temp, "GLbyte"))
        info->type = 4;

    else if(!strcmp(temp, "GLshort"))
        info->type = 5;

    else if(!strcmp(temp, "GLint"))
        info->type = 6;

    else if(!strcmp(temp, "GLsizei"))
        info->type = 7;

    else if(!strcmp(temp, "GLubyte"))
        info->type = 8;

    else if(!strcmp(temp, "GLushort"))
        info->type = 9;

    else if(!strcmp(temp, "GLuint"))
        info->type = 10;

    else if(!strcmp(temp, "GLfloat"))
        info->type = 11;

    else if(!strcmp(temp, "GLclampf"))
        info->type = 12;

    else if(!strcmp(temp, "GLdouble"))
        info->type = 13;

    else if(!strcmp(temp, "GLclampd"))
        info->type = 14;

    else if(!strcmp(temp, "GLvoid"))
        info->type = 15;

    else if(!strcmp(temp, "GLintptrARB"))
        info->type = 16;

    else if(!strcmp(temp, "GLsizeiptrARB"))
        info->type = 17;

    else if(!strcmp(temp, "GLintptr"))
        info->type = 18;

    else if(!strcmp(temp, "GLsizeiptr"))
        info->type = 19;

    else if(!strcmp(temp, "GLhandleARB"))
        info->type = 20;

    else if(!strcmp(temp, "GLcharARB"))
        info->type = 21;

    return 1;
}
예제 #5
0
void PS_ParseIdentifier(void)
{
    identifer_stack_t *stack;

    for(current_identifier = identifier_cap.next;
        current_identifier != &identifier_cap;
        current_identifier = current_identifier->next)
    {
        if(!strcmp(current_identifier->name, sc_parser->token))
        {
            SC_Find();

            if(current_identifier->has_args)
            {
                int i;

                SC_MustMatchToken(TK_LPAREN);
                stack = &id_stack[id_stack_count];

                for(i = 0; i < current_identifier->numargs; i++)
                {
                    SC_Find();
                    SC_PushIdStack(current_identifier->argnames[i]);

                    SC_Find();
                    if(sc_parser->tokentype == TK_RPAREN)
                    {
                        SC_Find();
                        break;
                    }
                    else
                    {
                        SC_MustMatchToken(TK_COMMA);
                    }
                }
            }
            else
            {
                stack = NULL;
            }

            SC_PushParser();

            sc_parser->buffsize         = current_identifier->bufsize;
            sc_parser->buffer           = current_identifier->buffer;
            sc_parser->pointer_start    = sc_parser->buffer;
            sc_parser->pointer_end      = sc_parser->buffer + sc_parser->buffsize;
            sc_parser->linepos          = 1;
            sc_parser->rowpos           = 1;
            sc_parser->buffpos          = 0;
            sc_parser->identifier       = current_identifier;
            sc_parser->stack            = stack;
            sc_parser->tokentype        = TK_NONE;
            sc_parser->isamacro         = true;
            sc_parser->name             = "identifier";

            return;
        }
        else if(sc_parser->stack != NULL || sc_parser->identifier != NULL)
        {
            int i;

            for(i = 0; i < current_identifier->numargs; i++)
            {
                if(!strcmp(sc_parser->token, sc_parser->stack[i].value))
                {
                    return;
                }
            }
        }
    }

    SC_Error("Unknown identifier: '%s'", sc_parser->token);
}
예제 #6
0
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;
        }
    }
}
예제 #7
0
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;
        }
    }
}