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