]> git.tdb.fi Git - gldbg.git/blobdiff - genwrap.py
Fix GLintptr/GLsizeiptr print formats
[gldbg.git] / genwrap.py
index 35e343952c26f8f7be422e235b66cb1b145e1771..b940036e62b10e999a42346479e902a12b8096d9 100755 (executable)
@@ -39,7 +39,7 @@ for line in open("gl.spec"):
                                s = parts[5][1:-1]
                                if s.isdigit():
                                        p[3] = int(s)
-                               elif s=="":
+                               elif s=="" or (len(parts)>=7 and parts[6]=="retained"):
                                        p[3] = "~"
                                else:
                                        p[3] = s
@@ -72,10 +72,10 @@ fmtmap = {"GLenum":"%#x",
        "GLchar *":"%s",
        "GLcharARB *":"%s",
        "GLvoid*":"%p",
-       "GLsizeiptr":"%p",
-       "GLsizeiptrARB":"%p",
-       "GLintptr":"%p",
-       "GLintptrARB":"%p",
+       "GLsizeiptr":"%d",
+       "GLsizeiptrARB":"%d",
+       "GLintptr":"%d",
+       "GLintptrARB":"%d",
        "GLhandleARB":"%i",
        "GLhalfNV":"%#x",
        "GLuint64EXT":"%lld"}
@@ -161,7 +161,7 @@ def getfmt(param):
        else:
                return (fmtmap[ptype], param[0])
 
-def getwrite(func, param):
+def getrwinfo(func, param):
        ptype = basetype(param[1], param[3]!=0)
        if param[3]:
                if type(param[3])==int:
@@ -170,28 +170,24 @@ def getwrite(func, param):
                        size = compsize(func, param[3][9:-1], ptype)
                        if not size:
                                print "Compsize '%s' for function '%s' failed"%(param[3][9:-1], func[0])
-                               return ("pointer", None)
-               elif param[3]=="~" and (param[2]=="charARB" or param[2]=="Char"):
-                       return ("string", None)
+                               return ("pointer", None, "void **")
+               elif param[3]=="~":
+                       if param[2]=="charARB" or param[2]=="Char":
+                               return ("string", None, "const unsigned char **")
+                       else:
+                               return ("pointer", None, "void **")
                else:
                        s = getparam(func, param[3].split('*')[0])
-                       if s and (s[2]=="SizeI" or s[2].endswith("Int32")) and s[3]==0:
+                       if s and (s[2]=="SizeI" or s[2].endswith("Int32") or s[2].startswith("BufferSize")) and s[3]==0:
                                size = "%s*sizeof(%s)"%(param[3], ptype)
                                if func[0].startswith("Uniform") and func[0][8]!='u' and func[0][7].isdigit():
                                        size += "*%s"%func[0][7]
                        else:
                                print "Could not determine size for array parameter '%s[%s]' of function '%s'"%(param[0], param[3], func[0])
-                               return ("pointer", None)
-               return ("data", size)
+                               return ("pointer", None, "void **")
+               return ("data", size, "const void **")
        else:
-               return (iomap[ptype], None)
-
-def getread(func, param):
-       ptype = basetype(param[1], param[3]!=0)
-       if param[3]:
-               return ("data", "(const void **)")
-       else:
-               return (iomap[ptype], "")
+               return (iomap[ptype], None, None)
 
 # Write out function enums
 
@@ -207,7 +203,7 @@ out.close()
 
 # Write out wrapper functions for transmitting side
 
-out = open(os.path.join(outdir, "glwrap.funcs"), "w");
+out = open(os.path.join(outdir, "glwrap.funcs"), "w")
 for f in funcs:
        out.write("%s GLAPIENTRY gl%s(%s)\n{\n"%(f[1], f[0], ", ".join("%s %s"%(p[1], p[0]) for p in f[2])))
 
@@ -225,7 +221,7 @@ for f in funcs:
        if f[1]!="void":
                out.write("\twrite_%s(ret);\n"%iomap[f[1]])
        for p in f[2]:
-               (t, s) = getwrite(f, p)
+               (t, s, c) = getrwinfo(f, p)
                out.write("\twrite_%s(%s"%(t, p[0]))
                if s:
                        out.write(", %s"%s)
@@ -254,17 +250,21 @@ out.write("} GlDecoder;\n")
 
 out = open(os.path.join(outdir, "gldecoder.funcs"), "w")
 for f in funcs:
-       out.write("static unsigned decode_%s(GlDecoder *dec, const char *data, unsigned len)\n{\n"%(f[0]))
+       out.write("static unsigned decode_%s(GlDecoder *dec, const char *data)\n{\n"%(f[0]))
        out.write("\tunsigned pos = 0;\n")
        if f[1]!="void":
                out.write("\t%s ret;\n"%f[1])
        for p in f[2]:
                out.write("\t%s arg_%s;\n"%(p[1], p[0]))
        if f[1]!="void":
-               out.write("\tpos += read_%s(&ret, data+pos, len);\n"%iomap[f[1]])
+               out.write("\tpos += read_%s(&ret, data+pos);\n"%iomap[f[1]])
        for p in f[2]:
-               (t, c) = getread(f, p)
-               out.write("\tpos += read_%s(%s&arg_%s, data+pos, len-pos);\n"%(t, c, p[0]))
+               (t, s, c) = getrwinfo(f, p)
+               if c:
+                       c="(%s)"%c
+               else:
+                       c=""
+               out.write("\tpos += read_%s(%s&arg_%s, data+pos);\n"%(t, c, p[0]))
        out.write("\tif(dec->%s)\n"%f[0])
        out.write("\t\tdec->%s(dec->user_data"%f[0])
        if f[1]!="void":
@@ -275,20 +275,16 @@ for f in funcs:
        out.write("\treturn pos;\n")
        out.write("}\n\n")
 
-out.write("""unsigned gldecoder_decode(GlDecoder *dec, const char *data, unsigned len)
+out.write("""static int decode_func(GlDecoder *dec, short func, const char *data)
 {
-       unsigned pos = 0;
-       short func;
-
-       pos += read_short(&func, data, len);
        switch(func)
        {
 """)
 for f in funcs:
-       out.write("\t\tcase FUNC_%s: pos += decode_%s(dec, data+pos, len); break;\n"%(f[0].upper(), f[0]))
+       out.write("\t\tcase FUNC_%s: return decode_%s(dec, data);\n"%(f[0].upper(), f[0]))
 out.write("""  }
 
-       return pos;
+       return -1;
 }
 """)
 out.close()