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; }
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(); }
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; } } }
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; }
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; } } }