#if defined(_WIN32) #pragma warning (disable : 4786) #endif #include #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include #ifdef _WIN32 #include #else #include #include "GL/glxext.h" #endif #define GLH_EXT_SINGLE_FILE #define GLH_NAMESPACE_GL 1 #define GLH_NAMESPACE_WGL 2 #define GLH_NAMESPACE_GLX 3 int GetToken(FILE *fpInput, char* token) { return fscanf(fpInput, "%s", token); } int GetNamespace(const char * token) { if(strstr(token, "wgl")) return GLH_NAMESPACE_WGL; if(strstr(token, "glX")) return GLH_NAMESPACE_GLX; return GLH_NAMESPACE_GL; } FILE* OpenFile(const char* filename, const char* perms) { FILE *fp; fp = fopen(filename, perms); if (NULL == fp) { printf("ERROR: could not open %s\n", filename); exit(-1); } return fp; } int ParseFile(FILE *fpInput, FILE *fpOutput, int header, int footer) { std::string currentExtension; std::vector gl12extensions; std::vector gl13extensions; int i; char token[256]; char uprToken[256]; int tokenNamespace; int opengl_core_names; char *name_macro; if (footer) { fprintf(fpOutput, "#ifndef _WIN32\n"); } if (!header) { fprintf(fpOutput, "#ifdef GLH_EXT_SINGLE_FILE\n"); fprintf(fpOutput, "\n"); fprintf(fpOutput, "int glh_init_extension(const char* extension)\n"); fprintf(fpOutput, "{\n"); fprintf(fpOutput, " if (NULL == extension) {\n"); fprintf(fpOutput, " return GL_FALSE;\n"); fprintf(fpOutput, "#ifndef _WIN32\n"); fprintf(fpOutput, " }else if (0 == strcmp (extension, \"GL_VERSION_1_2\") || 0 == strcmp (extension, \"GL_VERSION_1_3\") || 0 == strcmp (extension, \"GL_VERSION_1_4\")) {\n"); fprintf(fpOutput, " return GL_TRUE;\n"); fprintf(fpOutput, "#endif\n"); } else if (!footer) { fprintf(fpOutput, "/* File generated by extgen.cpp -- do not modify */\n"); fprintf(fpOutput, "#ifndef GLH_GENEXT_H\n"); fprintf(fpOutput, "#define GLH_GENEXT_H\n\n"); fprintf(fpOutput, "#ifdef __cplusplus\n"); fprintf(fpOutput, "extern \"C\" {\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#include \n"); fprintf(fpOutput, "#include \n"); fprintf(fpOutput, "#if defined(WIN32)\n"); fprintf(fpOutput, "# include \n"); fprintf(fpOutput, "# define GLH_EXT_GET_PROC_ADDRESS(p) wglGetProcAddress(p) \n"); fprintf(fpOutput, "#elif defined(UNIX)\n"); fprintf(fpOutput, "# include \n"); fprintf(fpOutput, "# include \n"); fprintf(fpOutput, "# include \n"); fprintf(fpOutput, "# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddressARB( (const GLubyte *) p) \n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#ifdef GLH_EXT_SINGLE_FILE\n"); fprintf(fpOutput, "# define GLH_EXTERN\n"); fprintf(fpOutput, "# define GLH_INITIALIZER = 0\n"); fprintf(fpOutput, "#else\n"); fprintf(fpOutput, "# define GLH_EXTERN extern\n"); fprintf(fpOutput, "# define GLH_INITIALIZER\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#define GLH__PREPROCESSOR_GYMNASTICS2(a,b) a##b\n"); fprintf(fpOutput, "#define GLH__PREPROCESSOR_GYMNASTICS(a,b) GLH__PREPROCESSOR_GYMNASTICS2(a,b)\n\n"); fprintf (fpOutput, "#ifndef _WIN32\n"); fprintf (fpOutput, "#define GLH_EXT_PREFIX _\n"); fprintf (fpOutput, "#endif\n"); fprintf(fpOutput, "#ifndef GLH_EXT_PREFIX\n"); fprintf(fpOutput, "# define GLH_EXT_NAME(a) a\n"); fprintf(fpOutput, "#else\n"); fprintf(fpOutput, "# define GLH_EXT_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_EXT_PREFIX,a)\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#ifndef _WIN32\n"); fprintf(fpOutput, "# ifndef GLH_CORE_PREFIX\n"); fprintf(fpOutput, "# define GLH_CORE_PREFIX _\n"); fprintf(fpOutput, "# endif\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#ifndef GLH_CORE_PREFIX\n"); fprintf(fpOutput, "# define GLH_CORE_NAME(a) a\n"); fprintf(fpOutput, "#else\n"); fprintf(fpOutput, "# define GLH_CORE_NAME(a) GLH__PREPROCESSOR_GYMNASTICS(GLH_CORE_PREFIX,a)\n"); fprintf(fpOutput, "#endif\n\n"); } A: if (GetToken(fpInput, token) == EOF) goto FIN; if (0 == strcmp(token, "GL_VERSION_1_2") || 0 == strcmp(token, "GL_VERSION_1_3") || 0 == strcmp(token, "GL_VERSION_1_4")) { opengl_core_names = 1; name_macro = "GLH_CORE_NAME"; } else { opengl_core_names = 0; name_macro = "GLH_EXT_NAME"; } if (opengl_core_names>0) fprintf (fpOutput, "#ifdef _WIN32\n"); if (0 == strcmp(token, "GL_VERSION_1_2")) fprintf(fpOutput, "#if defined(GL_VERSION_1_2) || defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4)\n"); else if (0 == strcmp(token, "GL_VERSION_1_3")) fprintf(fpOutput, "#if defined(GL_VERSION_1_3) || defined(GL_VERSION_1_4)\n"); else if (0 == strcmp(token, "GL_VERSION_1_4")) fprintf(fpOutput, "#if defined(GL_VERSION_1_4)\n"); else fprintf(fpOutput, "#ifdef %s\n", token); if (!header) { currentExtension = token; fprintf(fpOutput, " } else if (0 == strcmp(extension, \"%s\")) {\n", token); if (currentExtension == "GL_VERSION_1_3" || currentExtension == "GL_VERSION_1_4") { for (unsigned int i = 0; i < gl12extensions.size(); i++) { std::string curFunc = gl12extensions[i]; std::string funcUp = curFunc; for (unsigned int n = 0; n < funcUp.length(); n++) funcUp[n] = toupper(funcUp[n]); fprintf(fpOutput, " %s(%s) = (PFN%sPROC)GLH_EXT_GET_PROC_ADDRESS(\"%s\");\n", name_macro, curFunc.c_str(), funcUp.c_str(), curFunc.c_str()); fprintf(fpOutput, " if (NULL == %s(%s))\n", name_macro, curFunc.c_str()); fprintf(fpOutput, " return GL_FALSE;\n"); } } if (currentExtension == "GL_VERSION_1_4") { for (unsigned int i = 0; i < gl13extensions.size(); i++) { std::string curFunc = gl13extensions[i]; std::string funcUp = curFunc; for (unsigned int n = 0; n < funcUp.length(); n++) funcUp[n] = toupper(funcUp[n]); fprintf(fpOutput, " %s(%s) = (PFN%sPROC)GLH_EXT_GET_PROC_ADDRESS(\"%s\");\n", name_macro, curFunc.c_str(), funcUp.c_str(), curFunc.c_str()); fprintf(fpOutput, " if (NULL == %s(%s))\n", name_macro, curFunc.c_str()); fprintf(fpOutput, " return GL_FALSE;\n"); } } } else { if (opengl_core_names==1) { fprintf(fpOutput, " /* These routines are prefixed by the preprocessor constant\n"); fprintf(fpOutput, " GLH_CORE_PREFIX to avoid colliding with the OpenGL 1.1 namespace. */\n"); } } goto B; B: if (GetToken(fpInput, token) == EOF) goto ERR; if (token[0] == '{') goto C; goto ERR; C: if (GetToken(fpInput, token) == EOF) goto ERR; if (token[0] == '}') { if (opengl_core_names) fprintf (fpOutput, "#endif\n"); fprintf(fpOutput, "#endif\n\n"); goto A; } strcpy(uprToken, token); for (i=0;uprToken[i]!='\0';i++) { uprToken[i] = toupper(uprToken[i]); } tokenNamespace = GetNamespace(token); if (tokenNamespace == GLH_NAMESPACE_WGL) { fprintf(fpOutput, "# ifdef _WIN32\n"); } else if (tokenNamespace == GLH_NAMESPACE_GLX) { fprintf(fpOutput, "# ifdef GLX_VERSION_1_3\n"); } if (header) { if (!footer) { fprintf(fpOutput, " GLH_EXTERN PFN%sPROC %s(%s) GLH_INITIALIZER;\n", uprToken, name_macro, token); }else { fprintf(fpOutput, "#define %s %s(%s)\n", token, name_macro, token); } } else { if (currentExtension == "GL_VERSION_1_2") gl12extensions.push_back(token); if (currentExtension == "GL_VERSION_1_3") gl13extensions.push_back(token); fprintf(fpOutput, " %s(%s) = (PFN%sPROC)GLH_EXT_GET_PROC_ADDRESS(\"%s\");\n", name_macro, token, uprToken, token); fprintf(fpOutput, " if (NULL == %s(%s))\n", name_macro, token); fprintf(fpOutput, " return GL_FALSE;\n"); } if (tokenNamespace != GLH_NAMESPACE_GL) { fprintf(fpOutput, "# endif\n"); } goto C; FIN: if (header) { fprintf(fpOutput, "\n"); if (footer) fprintf(fpOutput, "#endif\n"); } else { fprintf(fpOutput, " } else {\n"); fprintf(fpOutput, " return GL_FALSE;\n"); fprintf(fpOutput, " }\n"); fprintf(fpOutput, " return GL_TRUE;\n"); fprintf(fpOutput, "}\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#undef GLH_EXT_SINGLE_FILE\n\n"); fprintf(fpOutput, "#ifdef __cplusplus\n"); fprintf(fpOutput, "}\n"); fprintf(fpOutput, "#endif\n\n"); fprintf(fpOutput, "#endif /* GLH_GENEXT_H */\n"); } return 0; ERR: printf("Error!\n"); return 1; } int main(int argc, char** argv) { FILE *fpInput, *fpOutput; char tmp1[] = "../glh_genext.h"; char tmp2[] = "extfile.txt"; char* outputFilename = (argc > 1) ? argv[1] : tmp1; char* inputFilename = (argc > 2) ? argv[2] : tmp2; fpOutput = OpenFile(outputFilename, "w"); /* Parse file for header portion */ fpInput = OpenFile(inputFilename, "r"); ParseFile(fpInput, fpOutput, 1,0); fclose(fpInput); /* Parse file again for code portion */ fpInput = OpenFile(inputFilename, "r"); ParseFile(fpInput, fpOutput, 0,0); fclose(fpInput); fpInput = OpenFile(inputFilename, "r"); ParseFile(fpInput, fpOutput, 1,1); fclose(fpInput); fclose(fpOutput); return 0; }