summaryrefslogtreecommitdiff
path: root/tools/glwrapper/makewrapper.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/glwrapper/makewrapper.py')
-rw-r--r--tools/glwrapper/makewrapper.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/tools/glwrapper/makewrapper.py b/tools/glwrapper/makewrapper.py
new file mode 100644
index 0000000000..cde976d5f9
--- /dev/null
+++ b/tools/glwrapper/makewrapper.py
@@ -0,0 +1,184 @@
+#! /usr/bin/python
+import sys
+
+if (len(sys.argv)<2):
+ print("usage: makewrapper.py <headers>")
+ sys.exit(255)
+
+
+functions=[]
+types=[]
+constants=[]
+
+READ_FUNCTIONS=0
+READ_TYPES=1
+READ_CONSTANTS=2
+
+read_what=READ_TYPES
+
+for x in (range(len(sys.argv)-1)):
+ f=open(sys.argv[x+1],"r")
+
+ while(True):
+
+ line=f.readline()
+ if (line==""):
+ break
+
+ line=line.replace("\n","").strip()
+ """
+ if (line.find("[types]")!=-1):
+ read_what=READ_TYPES
+ continue
+ elif (line.find("[constants]")!=-1):
+ read=READ_TYPES
+ continue
+ elif (line.find("[functions]")!=-1):
+ read_what=READ_FUNCTIONS
+ continue
+ """
+
+ if (line.find("#define")!=-1):
+ if (line.find("0x")==-1 and line.find("GL_VERSION")==-1):
+ continue
+ constants.append(line)
+ elif (line.find("typedef")!=-1):
+ if (line.find("(")!=-1 or line.find(")")!=-1 or line.find("ARB")!=-1 or line.find("EXT")!=-1 or line.find("GL")==-1):
+ continue
+ types.append(line)
+ elif (line.find("APIENTRY")!=-1 and line.find("GLAPI")!=-1):
+
+ if (line.find("ARB")!=-1 or line.find("EXT")!=-1 or line.find("NV")!=-1):
+ continue
+
+ line=line.replace("APIENTRY","")
+ line=line.replace("GLAPI","")
+
+ glpos=line.find(" gl")
+ if (glpos==-1):
+
+ glpos=line.find("\tgl")
+ if (glpos==-1):
+ continue
+
+ ret=line[:glpos].strip();
+
+ line=line[glpos:].strip()
+ namepos=line.find("(")
+
+ if (namepos==-1):
+ continue
+
+ name=line[:namepos].strip()
+ line=line[namepos:]
+
+ argpos=line.rfind(")")
+ if (argpos==-1):
+ continue
+
+ args=line[1:argpos]
+
+ funcdata={}
+ funcdata["ret"]=ret
+ funcdata["name"]=name
+ funcdata["args"]=args
+
+ functions.append(funcdata)
+ print(funcdata)
+
+
+
+#print(types)
+#print(constants)
+#print(functions)
+
+
+f=open("glwrapper.h","w")
+
+f.write("#ifndef GL_WRAPPER\n")
+f.write("#define GL_WRAPPER\n\n\n")
+
+header_code="""\
+#if defined(__gl_h_) || defined(__GL_H__)
+#error gl.h included before glwrapper.h
+#endif
+#if defined(__glext_h_) || defined(__GLEXT_H_)
+#error glext.h included before glwrapper.h
+#endif
+#if defined(__gl_ATI_h_)
+#error glATI.h included before glwrapper.h
+#endif
+
+#define __gl_h_
+#define __GL_H__
+#define __glext_h_
+#define __GLEXT_H_
+#define __gl_ATI_h_
+
+#define GL_TRUE 1
+#define GL_FALSE 0
+
+#define GL_ZERO 0
+#define GL_ONE 1
+#define GL_NONE 0
+#define GL_NO_ERROR 0
+
+\n\n
+"""
+
+f.write("#include <stddef.h>\n\n\n")
+
+f.write(header_code);
+
+f.write("#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n")
+f.write("#if defined(_WIN32) && !defined(__CYGWIN__)\n")
+f.write("#define GLWRP_APIENTRY __stdcall\n")
+f.write("#else\n");
+f.write("#define GLWRP_APIENTRY \n")
+f.write("#endif\n\n");
+for x in types:
+ f.write(x+"\n")
+
+f.write("\n\n")
+
+for x in constants:
+ f.write(x+"\n")
+
+f.write("\n\n")
+
+for x in functions:
+ f.write("extern "+x["ret"]+" GLWRP_APIENTRY (*__wrapper_"+x["name"]+")("+x["args"]+");\n")
+ f.write("#define "+x["name"]+" __wrapper_"+x["name"]+"\n")
+
+f.write("\n\n")
+f.write("typedef void (*GLWrapperFuncPtr)(void);\n\n");
+f.write("void glWrapperInit( GLWrapperFuncPtr (*wrapperFunc)(const char*) );\n")
+
+f.write("#ifdef __cplusplus\n}\n#endif\n")
+
+f.write("#endif\n\n")
+
+f=open("glwrapper.c","w")
+
+f.write("\n\n")
+f.write("#include \"glwrapper.h\"\n")
+f.write("\n\n")
+
+for x in functions:
+ f.write(x["ret"]+" GLWRP_APIENTRY (*__wrapper_"+x["name"]+")("+x["args"]+")=NULL;\n")
+
+f.write("\n\n")
+f.write("void glWrapperInit( GLWrapperFuncPtr (*wrapperFunc)(const char*) ) {\n")
+f.write("\n")
+
+for x in functions:
+ f.write("\t__wrapper_"+x["name"]+"=("+x["ret"]+" GLWRP_APIENTRY (*)("+x["args"]+"))wrapperFunc(\""+x["name"]+"\");\n")
+
+f.write("\n\n")
+f.write("}\n")
+f.write("\n\n")
+
+
+
+
+ \ No newline at end of file