Add a glFunctionIterator class to iterate over the functions stored in a

higher-level API object.  Use this type of object to implement the
printFunctions method.  Modify other functions that iterate over the list of
functions to use this type of object.
This commit is contained in:
Ian Romanick
2005-01-25 23:53:13 +00:00
parent e4d41524a2
commit 38e6e09cb8
3 changed files with 68 additions and 54 deletions

View File

@@ -425,6 +425,58 @@ class glItemFactory:
return None return None
class glFunctionIterator:
"""Class to iterate over a list of glFunctions
Objects of this classare returned by
FilterGLAPISpecBase::functionIterator. This default version
iterates over the functions in order of dispatch table offset. All
of the "true" functions are iterated first, followed by the alias
functions."""
def __init__(self, context):
self.context = context
self.keys = context.functions.keys()
self.keys.sort()
self.prevk = -1
self.direction = 1
for self.index in range(0, len(self.keys)):
if self.keys[ self.index ] >= 0: break
if self.index == len(self.keys):
self.direction = -1
self.index -= 1
self.split = self.index - 1
return
def __iter__(self):
return self
def next(self):
if self.index < 0:
raise StopIteration
k = self.keys[ self.index ]
#if self.context.functions[k].fn_alias == None:
# if k != self.prevk + 1:
# print 'Missing offset %d' % (prevk)
# self.prevk = int(k)
self.index += self.direction
if self.index == len(self.keys):
self.index = self.split
self.direction = -1
return self.context.functions[k]
class FilterGLAPISpecBase(saxutils.XMLFilterBase): class FilterGLAPISpecBase(saxutils.XMLFilterBase):
name = "a" name = "a"
license = "The license for this file is unspecified." license = "The license for this file is unspecified."
@@ -457,25 +509,13 @@ class FilterGLAPISpecBase(saxutils.XMLFilterBase):
return self.functions[index] return self.functions[index]
def functionIterator(self):
return glFunctionIterator(self)
def printFunctions(self): def printFunctions(self):
keys = self.functions.keys() for f in self.functionIterator():
keys.sort() self.printFunction(f)
prevk = -1
for k in keys:
if k < 0: continue
if self.functions[k].fn_alias == None:
if k != prevk + 1:
#print 'Missing offset %d' % (prevk)
pass
prevk = int(k)
self.printFunction(self.functions[k])
keys.reverse()
for k in keys:
if self.functions[k].fn_alias != None:
self.printFunction(self.functions[k])
return return

View File

@@ -149,12 +149,10 @@ class PrintGlOffsets(gl_XML.FilterGLAPISpecBase):
#endif #endif
static _glapi_proc DISPATCH_TABLE_NAME[] = {""" static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
keys = self.functions.keys() for f in self.functionIterator():
keys.sort() if f.fn_offset < 0: continue
for k in keys:
if k < 0: continue
print ' TABLE_ENTRY(%s),' % (self.functions[k].name) print ' TABLE_ENTRY(%s),' % (f.name)
print ' /* A whole bunch of no-op functions. These might be called' print ' /* A whole bunch of no-op functions. These might be called'
print ' * when someone tries to call a dynamically-registered' print ' * when someone tries to call a dynamically-registered'
@@ -177,11 +175,7 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {"""
#ifdef UNUSED_TABLE_NAME #ifdef UNUSED_TABLE_NAME
static _glapi_proc UNUSED_TABLE_NAME[] = {""" static _glapi_proc UNUSED_TABLE_NAME[] = {"""
keys = self.functions.keys() for f in self.functionIterator():
keys.sort()
keys.reverse();
for k in keys:
f = self.functions[k]
if f.fn_offset < 0: if f.fn_offset < 0:
print ' TABLE_ENTRY(%s),' % (f.name) print ' TABLE_ENTRY(%s),' % (f.name)

View File

@@ -91,16 +91,8 @@ class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
else: else:
print 'static const char gl_string_table[] = {' print 'static const char gl_string_table[] = {'
keys = self.functions.keys() for f in self.functionIterator():
keys.sort() self.printFunctionString(f)
for k in keys:
if k < 0: continue
self.printFunctionString(self.functions[k])
keys.reverse()
for k in keys:
if k >= -1: continue
self.printFunctionString(self.functions[k])
if self.long_strings: if self.long_strings:
print ' ;' print ' ;'
@@ -110,27 +102,15 @@ class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
print '' print ''
print 'static const glprocs_table_t static_functions[] = {' print 'static const glprocs_table_t static_functions[] = {'
keys = self.functions.keys()
keys.sort()
base_offset = 0 base_offset = 0
for k in keys:
if k < 0: continue for f in self.functionIterator():
self.printFunctionOffset(self.functions[k], base_offset) self.printFunctionOffset(f, base_offset)
# The length of the function's name, plus 2 for "gl", # The length of the function's name, plus 2 for "gl",
# plus 1 for the NUL. # plus 1 for the NUL.
base_offset += len(self.functions[k].name) + 3 base_offset += len(f.name) + 3
keys.reverse()
for k in keys:
if k >= -1: continue
self.printFunctionOffset(self.functions[k], base_offset)
# The length of the function's name, plus 2 for "gl",
# plus 1 for the NUL.
base_offset += len(self.functions[k].name) + 3
print ' NAME_FUNC_OFFSET( -1, NULL, 0 )' print ' NAME_FUNC_OFFSET( -1, NULL, 0 )'
print '};' print '};'