return a==b
def __getitem__(self, key):
- return self.map[(key[0], "*", "*")]
- for k, v in self.map.iteritems():
- if strip_name(k[0])==strip_name(key[0]) and self.wildcard_match(k[1], key[1]) and self.wildcard_match(k[2], key[2]):
- return v
- raise KeyError, key
+ try:
+ return self.map[(key[0], "*", "*")]
+ except KeyError:
+ for k, v in self.map.iteritems():
+ if strip_name(k[0])==strip_name(key[0]) and self.wildcard_match(k[1], key[1]) and self.wildcard_match(k[2], key[2]):
+ return v
+ raise KeyError, key
def update(self, other):
self.map.update(other.map)
self.size = size
def derive_ctype(self):
- self.ctype = typemap[(self.type, self.direction, self.kind)][0]
+ m = typemap[(self.type, self.direction, self.kind)]
+ self.ctype = m[0]
+ if m[1]!="*":
+ self.direction = m[1]
+ if m[2]!="*":
+ self.kind = m[2]
self.base_ctype = self.ctype
if self.kind=="value":
if self.base_ctype.startswith("const "):
self.base_ctype = self.base_ctype[6:]
- self.io = iomap[self.base_ctype]
else:
if self.direction=="in":
self.ctype = "const "+self.ctype
self.ctype = self.ctype+" *"
+ self.io = iomap[self.base_ctype]
def derive_csize(self):
if self.kind=="array" and self.size is not None:
self.csize = "%d*sizeof(%s)"%(self.size, self.base_ctype)
elif self.size.startswith("COMPSIZE("):
self.csize = self.func.compsize(self.size[9:-1], self.base_ctype)
- elif self.size=="" and (self.type=="charARB" or self.type=="Char"):
- self.csize = "strlen"
+ elif self.size=="pname":
+ self.csize = "paramsize(pname)*sizeof(%s)"%self.base_ctype
else:
s = self.func.get_param(self.size.split('*')[0])
- if (s.type=="SizeI" or s.type.endswith("Int32") or s.type.startswith("BufferSize")) and s.kind=="value":
- self.csize = "%s*sizeof(%s)"%(self.size, self.base_ctype)
- if self.func.name.startswith("Uniform") and self.func.name[7].isdigit():
- self.csize += "*%s"%func.name[7]
+ if (s.type=="SizeI" or s.type.endswith("Int32") or s.type.startswith("BufferSize")):
+ if s.kind=="value":
+ self.csize = "%s"%self.size
+ if self.func.name.startswith("glUniformMatrix") and self.func.name[16]!='x':
+ self.csize += "*%d"%(int(self.func.name[15])**2)
+ elif self.func.name.startswith("glUniform") and self.func.name[9].isdigit():
+ self.csize += "*%s"%self.func.name[9]
+ if strip_name(self.base_ctype)!="void":
+ self.csize += "*sizeof(%s)"%self.base_ctype
+ elif s.kind=="array" and s.size==1:
+ self.csize = "*%s"%s.name
if not self.csize:
sys.stderr.write("Could not determine size for array parameter '%s[%s]' of function '%s'\n"%(self.name, self.size, self.func.name))
elif self.kind=="reference":
have_type = True
elif cn.endswith("Format"):
res += "formatsize(%s)"%param.name
- elif cn.endswith(("Parameter", "ParameterPName", "ParameterName")) or cn=="GetPName":
+ elif param.name=="pname" or cn.endswith("Parameter") or (param.name=="target" and cn=="enum"):
res += "paramsize(%s)"%param.name
- elif cn=="MapTarget":
- res += "mapsize(%s)"%param.name
+ elif param.name=="buffer" and cn=="enum":
+ res += "buffersize(%s)"%param.name
elif (cn=="SizeI" or cn.endswith("Int32")) and not param.size:
res += param.name
else:
sys.stderr.write("Compsize '%s' for function '%s' failed: Parameter '%s' has unknown type '%s'\n"%(size, self.name, param.name, param.type))
return
if not have_type:
- res += "*sizeof(%s)"%param.ctype
+ res += "*sizeof(%s)"%btype
return res
def finalize(self):
class Template:
def __init__(self, fn):
self.sections = []
+ self.handcode = []
literal = True
text = ""
text = ""
text += line[1:]+"\n"
literal = True
+ elif line[0]=='!':
+ parts = line[1:].split()
+ if parts[0]=="handcode":
+ self.handcode.append(parts[1])
else:
if literal and text:
self.add_section(text, literal)
print sect
else:
for func in functions:
+ if func.name in self.handcode:
+ continue
globals = {
"w": self.write,
"wl": self.writeln,
def __init__(self, fn):
self.typemap = None
self.iomap = None
- self.spec = None
+ self.specs = []
self.prefix = None
self.ignore_categs = []
self.ignore_funcs = []
elif parts[0]=="iomap":
self.iomap = parts[1]
elif parts[0]=="spec":
- self.spec = parts[1]
+ self.specs.append(parts[1])
elif parts[0]=="prefix":
self.prefix = parts[1]
elif parts[0]=="ignore":
return funcs
template = Template(sys.argv[1])
+functions = []
for i in sys.argv[2:]:
files = Files(i)
typemap = Typemap(files.typemap)
iomap = IOmap(files.iomap)
- functions = read_spec(files.spec, files.prefix)
- functions = [f for f in functions if f.name not in files.ignore_funcs and f.category not in files.ignore_categs]
- for f in functions:
- f.finalize()
-
- template.process(functions)
+ for s in files.specs:
+ funcs = read_spec(s, files.prefix)
+ funcs = [f for f in funcs if f.name not in files.ignore_funcs and f.category not in files.ignore_categs]
+ for f in funcs:
+ f.finalize()
+ names = [f.name for f in funcs]
+ functions = [f for f in functions if f.name not in names]+funcs
+
+template.process(functions)