10 for line in open("gl.tm"):
13 parts = [p.strip() for p in line.split(',')]
14 typemap[parts[0]] = parts[3]
15 typemap["void"] = "void"
17 def getparam(func, name):
24 for line in open("gl.spec"):
25 if line[0]=='#' or line.find(':')>=0:
27 elif line[0]=='\t' and cur_func:
29 if parts[0]=="return":
30 cur_func[1] = typemap[parts[1]]
31 elif parts[0]=="param":
32 p = getparam(cur_func, parts[1])
34 p[1] = typemap[parts[2]]
42 elif s=="" or (len(parts)>=7 and parts[6]=="retained"):
47 paren = line.find('(')
49 cparen = line.rfind(')')
51 args = line[paren+1:cparen].split(", ")
54 cur_func = [line[:paren], None, [[a, None, None, 0] for a in args]]
55 funcs.append(cur_func)
57 fmtmap = {"GLenum":"%#x",
71 "const GLubyte *":"%s",
83 iomap = {"GLenum":"int",
97 "const GLubyte *":"string",
99 "GLcharARB *":"string",
102 "GLsizeiptrARB":"int",
107 "GLuint64EXT":"longlong"}
109 def basetype(type, is_array):
110 if type.startswith("const "):
112 if is_array and type.endswith(" *"):
116 def compsize(func, size, ptype):
122 for c in size.split('/'):
123 p = getparam(func, c)
131 if cn.endswith(("EXT", "ARB", "SGI", "IBM", "ATI")):
133 elif cn.endswith("SGIX"):
135 elif cn.endswith(("NV", "HP")):
137 if cn.endswith("Type"):
138 res += "typesize(%s)"%p[0]
140 elif cn.endswith("Format"):
141 res += "formatsize(%s)"%p[0]
142 elif cn.endswith(("Parameter", "ParameterPName", "ParameterName")) or cn=="GetPName":
143 res += "paramsize(%s)"%p[0]
144 elif cn=="MapTarget":
145 res += "mapsize(%s)"%p[0]
146 elif (cn=="SizeI" or cn.endswith("Int32")) and p[3]==0:
151 res += "*sizeof(%s)"%ptype
155 ptype = basetype(param[1], param[3]!=0)
157 if type(param[3])==int:
158 return ("{%s}"%(", ".join([fmtmap[ptype]]*param[3])), ", ".join("%s[%d]"%(param[0], i) for i in range(param[3])))
160 return ("%p", param[0])
162 return (fmtmap[ptype], param[0])
164 def getrwinfo(func, param):
165 ptype = basetype(param[1], param[3]!=0)
167 if type(param[3])==int:
168 size = "%d*sizeof(%s)"%(param[3], ptype)
169 elif param[3].startswith("COMPSIZE("):
170 size = compsize(func, param[3][9:-1], ptype)
172 print "Compsize '%s' for function '%s' failed"%(param[3][9:-1], func[0])
173 return ("pointer", None, "void **")
175 if param[2]=="charARB" or param[2]=="Char":
176 return ("string", None, "const unsigned char **")
178 return ("pointer", None, "void **")
180 s = getparam(func, param[3].split('*')[0])
181 if s and (s[2]=="SizeI" or s[2].endswith("Int32") or s[2].startswith("BufferSize")) and s[3]==0:
182 size = "%s*sizeof(%s)"%(param[3], ptype)
183 if func[0].startswith("Uniform") and func[0][8]!='u' and func[0][7].isdigit():
184 size += "*%s"%func[0][7]
186 print "Could not determine size for array parameter '%s[%s]' of function '%s'"%(param[0], param[3], func[0])
187 return ("pointer", None, "void **")
188 return ("data", size, "const void **")
190 return (iomap[ptype], None, None)
192 # Write out function enums
194 out = open(os.path.join(outdir, "functions.enum"), "w");
195 out.write("""enum Function
200 out.write("\tFUNC_%s,\n"%f[0].upper())
204 # Write out wrapper functions for transmitting side
206 out = open(os.path.join(outdir, "glwrap.funcs"), "w")
208 out.write("%s APIENTRY gl%s(%s)\n{\n"%(f[1], f[0], ", ".join("%s %s"%(p[1], p[0]) for p in f[2])))
210 out.write("\tstatic %s (*orig)(%s) = NULL;\n"%(f[1], ", ".join(p[1] for p in f[2])))
212 out.write("\t%s ret;\n"%f[1])
213 out.write("\tif(!orig)\n\t\torig = glsym(\"gl%s\");\n"%f[0])
218 out.write("orig(%s);\n"%(", ".join(p[0] for p in f[2])))
220 out.write("\tbegin_packet(FUNC_%s);\n"%f[0].upper())
222 out.write("\twrite_%s(ret);\n"%iomap[f[1]])
224 (t, s, c) = getrwinfo(f, p)
225 out.write("\twrite_%s(%s"%(t, p[0]))
229 out.write("\tsend_packet();\n")
232 out.write("\treturn ret;\n")
236 # Write out decoder stuff
238 out = open(os.path.join(outdir, "gldecoder.struct"), "w")
239 out.write("typedef struct sGlDecoder\n{\n")
240 out.write("\tvoid *user_data;\n")
241 out.write("\tvoid (*destroy)(void *);\n")
243 out.write("\tvoid (*%s)(void *"%f[0])
245 out.write(", %s"%f[1])
247 out.write(", %s"%(", ".join(p[1] for p in f[2])))
249 out.write("} GlDecoder;\n")
251 out = open(os.path.join(outdir, "gldecoder.funcs"), "w")
253 out.write("static unsigned decode_%s(GlDecoder *dec, const char *data)\n{\n"%(f[0]))
254 out.write("\tunsigned pos = 0;\n")
256 out.write("\t%s ret;\n"%f[1])
258 out.write("\t%s arg_%s;\n"%(p[1], p[0]))
260 out.write("\tpos += read_%s(&ret, data+pos);\n"%iomap[f[1]])
262 (t, s, c) = getrwinfo(f, p)
267 out.write("\tpos += read_%s(%s&arg_%s, data+pos);\n"%(t, c, p[0]))
268 out.write("\tif(dec->%s)\n"%f[0])
269 out.write("\t\tdec->%s(dec->user_data"%f[0])
273 out.write(", %s"%(", ".join("arg_"+p[0] for p in f[2])))
275 out.write("\treturn pos;\n")
278 out.write("""static int decode_func(GlDecoder *dec, short func, const char *data)
284 out.write("\t\tcase FUNC_%s: return decode_%s(dec, data);\n"%(f[0].upper(), f[0]))
292 # Write out print stuff
294 out = open(os.path.join(outdir, "glprint.funcs"), "w")
296 out.write("static void print_%s(void *user_data"%f[0])
298 out.write(", %s ret"%f[1])
300 out.write(", %s"%(", ".join("%s %s"%(p[1], p[0]) for p in f[2])))
302 out.write("\tGlPrintData *gpd = (GlPrintData *)user_data;\n")
304 m = [getfmt(p) for p in f[2]]
305 out.write("\tsnprintf(gpd->buffer, gpd->bufsize, \"%s(%s)"%(f[0], ", ".join(p[0] for p in m)))
307 out.write(" = %s"%fmtmap[f[1]])
310 out.write(", %s"%(", ".join(p[1] for p in m)))
317 out.write("static void init_print(GlDecoder *dec)\n{\n")
319 out.write("\tdec->%s = print_%s;\n"%(f[0], f[0]))