X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=scripts%2Fextgen.py;h=6c0ef8f1799538b8d675c31640628a134c17675b;hb=0a98aafdf8cd59cd6eb5a926d3a31a01d27ffba8;hp=4333cf37345f176d06fdf52abe2e6f30d8cc1f0c;hpb=9705e1a5f1b6065c2cfa0cc987d65b332fdde5ce;p=libs%2Fgl.git diff --git a/scripts/extgen.py b/scripts/extgen.py index 4333cf37..6c0ef8f1 100755 --- a/scripts/extgen.py +++ b/scripts/extgen.py @@ -69,6 +69,8 @@ class Thing: class Function(Thing): def __init__(self, name): Thing.__init__(self, name, Thing.FUNCTION) + self.return_type = "void" + self.params = [] self.typedef = None self.vectorequiv = None @@ -103,7 +105,8 @@ def parse_file(fn): root = doc.documentElement commands = get_nested_elements(root, "commands/command") for cmd in commands: - name = get_text_contents(get_nested_elements(cmd, "proto/name")[0]) + proto = cmd.getElementsByTagName("proto")[0] + name = get_text_contents(proto.getElementsByTagName("name")[0]) func = things.get(name) if not func: func = Function(name) @@ -117,6 +120,19 @@ def parse_file(fn): if vec: func.vectorequiv = vec[0].getAttribute("name") + ptype = proto.getElementsByTagName("ptype") + if ptype: + func.return_type = get_text_contents(ptype[0]) + else: + for c in proto.childNodes: + if c.nodeType==xml.dom.Node.TEXT_NODE and c.data.strip(): + func.return_type = c.data.strip() + break + + params = cmd.getElementsByTagName("param") + for p in params: + func.params.append(get_text_contents(p)) + enums = get_nested_elements(root, "enums/enum") for en in enums: name = en.getAttribute("name") @@ -241,14 +257,19 @@ namespace GL { if funcs or enums: out.write("\n#ifndef GL_%s\n"%ext) for f in funcs: - out.write("typedef int (*%s)(...);\n"%f.typedef) + out.write("typedef %s (*%s)(%s);\n"%(f.return_type, f.typedef, ", ".join(f.params))) if funcs and enums: out.write("\n") for e in enums: out.write("#define %s 0x%04X\n"%(e.name, e.value)) out.write("#endif\n\n") + + # Apple's OpenGL implementation doesn't have a GetProcAddress function; link + # directly to the OpenGL library + out.write("\n#if !defined(__APPLE__) || !defined(GL_%s)\n"%ext) for f in funcs: out.write("extern %s %s;\n"%(f.typedef, f.name)) + out.write("#endif\n") out.write("\nextern Extension %s;\n"%ext) @@ -268,9 +289,10 @@ namespace GL { """) if funcs: - out.write("\n") -for f in funcs: - out.write("%s %s = 0;\n"%(f.typedef, f.name)) + out.write("\n#if !defined(__APPLE__) || !defined(GL_%s)\n"%ext) + for f in funcs: + out.write("%s %s = 0;\n"%(f.typedef, f.name)) + out.write("\n#endif\n") out.write("\nExtension::SupportLevel init_%s()\n{\n"%ext.lower()) out.write("#ifdef GL_%s\n"%ext) @@ -279,17 +301,23 @@ if ver: if backport_ext: out.write(" || is_supported(\"GL_%s\")"%backport_ext) out.write(")\n\t{\n") - for f in funcs: - out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, f.name)) + if funcs: + out.write("#ifndef __APPLE__\n") + for f in funcs: + out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, f.name)) + out.write("#endif\n") out.write("\t\treturn Extension::CORE;\n") out.write("\t}\n") if ext!=backport_ext: out.write("\tif(is_supported(\"GL_%s\"))\n\t{\n"%(ext)) - for f in funcs: - n = f.name - if f.source: - n = f.source.name - out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, n)) + if funcs: + out.write("#ifndef __APPLE__\n") + for f in funcs: + n = f.name + if f.source: + n = f.source.name + out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, n)) + out.write("#endif\n") out.write("\t\treturn Extension::EXTENSION;\n") out.write("\t}\n") out.write("#endif\n")