8 """Strips any vendor suffix and GL prefix from a name (but not GLX prefix)"""
11 if name.endswith(" *"):
14 elif name.endswith("Pointer"):
19 if name.startswith("const "):
23 if name.startswith("GL") and not name.startswith("GLX"):
25 if name.endswith(("EXT", "ARB", "SGI", "IBM", "ATI")):
26 return prefix+name[:-3]+suffix
27 elif name.endswith("SGIX"):
28 return prefix+name[:-4]+suffix
29 elif name.endswith(("NV", "HP")):
30 return prefix+name[:-2]+suffix
32 return prefix+name+suffix
36 def __init__(self, fn):
41 parts = [p.strip() for p in line.split(',')]
44 elif parts[3][-1]=='*' and parts[3][-2]!=' ':
45 parts[3] = parts[3][:-1]+" *"
46 self.map[tuple(parts[0:3])] = tuple(parts[3:6])
48 def wildcard_match(self, a, b):
53 def __getitem__(self, key):
54 return self.map[(key[0], "*", "*")]
55 for k, v in self.map.iteritems():
56 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]):
60 def update(self, other):
61 self.map.update(other.map)
65 def __init__(self, fn):
67 self.map["void"] = None
71 parts = [p.strip() for p in line.split(',')]
72 self.map[parts[0]] = tuple(parts[1:])
74 def __getitem__(self, key):
75 return self.map[strip_name(key)]
80 def __init__(self, func, name):
91 def set_type(self, type, dir, kind):
95 self.ctype = typemap[(type, dir, kind)][0]
96 self.base_ctype = self.ctype
97 if self.kind=="value":
98 if self.base_ctype.startswith("const "):
99 self.base_ctype = self.base_ctype[6:]
100 self.io = iomap[self.base_ctype]
102 if self.direction=="in":
103 self.ctype = "const "+self.ctype
104 self.ctype = self.ctype+" *"
105 #print "%s | %s | %s | %s | %s"%(self.func.name, self.name, self.type, self.ctype, self.base_ctype)
107 def set_size(self, size):
108 if type(size)==str and size.isdigit():
109 self.size = int(size)
114 if self.kind=="array":
116 if type(self.size)==int:
117 self.csize = "%d*sizeof(%s)"%(self.size, self.base_ctype)
118 elif self.size.startswith("COMPSIZE("):
119 self.csize = compsize(self.func, self.size[9:-1], self.base_ctype)
120 elif self.size=="" and (self.type=="charARB" or self.type=="Char"):
121 self.csize = "strlen"
123 s = self.func.get_param(self.size.split('*')[0])
124 if (s.type=="SizeI" or s.type.endswith("Int32") or s.type.startswith("BufferSize")) and s.kind=="value":
125 self.csize = "%s*sizeof(%s)"%(self.size, self.base_ctype)
126 if self.func.name.startswith("Uniform") and self.func.name[7].isdigit():
127 self.csize += "*%s"%func.name[7]
129 sys.stderr.write("Could not determine size for array parameter '%s[%s]' of function '%s'\n"%(self.name, self.size, self.func.name))
130 elif self.kind=="reference":
131 self.csize = "sizeof(%s)"%self.base_ctype
133 def __init__(self, name, pnames):
135 self.ret = Function.Parameter(self, "ret")
136 self.params = [Function.Parameter(self, n) for n in pnames]
139 def get_param(self, pname):
140 for p in self.params:
143 raise KeyError, pname
145 def set_category(self, cat):
149 for p in self.params:
153 def read_spec(fn, prefix):
156 for line in open(fn):
157 if line[0]=='#' or line.find(':')>=0:
159 elif line[0]=='\t' and cur_func:
161 if parts[0]=="return":
162 cur_func.ret.set_type(parts[1], "out", "value")
163 elif parts[0]=="param":
164 bracket = parts[4].find('[')
166 parts.insert(5, parts[4][bracket:])
167 parts[4] = parts[4][:bracket]
169 param = cur_func.get_param(parts[1])
170 param.set_type(parts[2], parts[3], parts[4])
172 param.set_size(parts[5][1:-1])
173 elif parts[0]=="category":
174 cur_func.set_category(parts[1])
175 elif parts[0]=="glxvendorglx" and cur_func.category=="glx":
176 cur_func.set_category("glxext")
178 paren = line.find('(')
180 cparen = line.rfind(')')
182 pnames = [n.strip() for n in line[paren+1:cparen].split(",")]
185 cur_func = Function(prefix+line[:paren], pnames)
186 funcs.append(cur_func)
196 def add_section(text, literal):
200 sections.append(text)
202 sections.append(compile(text, "-", "exec"))
204 def read_template(fn):
211 for line in open(fn):
215 parts = line[1:].split()
216 if parts[0]=="typemap":
217 typemap = Typemap(parts[1])
218 elif parts[0]=="iomap":
219 iomap = IOmap(parts[1])
220 elif parts[0]=="spec":
221 functions = read_spec(parts[2], parts[1])
223 if not literal and text:
224 add_section(text, literal)
230 add_section(text, literal)
235 add_section(text, literal)
237 def compsize(func, size, btype):
243 for c in size.replace(',', '/').split('/'):
244 param = func.get_param(c)
246 sys.stderr.write("Compsize '%s' for function '%s' failed: No parameter '%s'\n"%(size, func.name, c))
252 cn = strip_name(param.type)
253 if cn.endswith("Type"):
254 res += "typesize(%s)"%param.name
256 elif cn.endswith("Format"):
257 res += "formatsize(%s)"%param.name
258 elif cn.endswith(("Parameter", "ParameterPName", "ParameterName")) or cn=="GetPName":
259 res += "paramsize(%s)"%param.name
260 elif cn=="MapTarget":
261 res += "mapsize(%s)"%param.name
262 elif (cn=="SizeI" or cn.endswith("Int32")) and not param.size:
265 sys.stderr.write("Compsize '%s' for function '%s' failed: Parameter '%s' has unknown type '%s'\n"%(size, func.name, param.name, param.type))
268 res += "*sizeof(%s)"%param.ctype
271 read_template(sys.argv[1])
273 def write(str, *args):
274 sys.stdout.write(str%args)
276 def writeln(str, *args):
277 sys.stdout.write(str%args+"\n")
279 for sect in sections:
283 for func in functions:
289 "params": func.params