[Mesa-dev] [PATCH] mapi/glapi: Use ElementTree instead of libxml2.
Jose Fonseca
jfonseca at vmware.com
Wed Mar 26 06:55:57 PDT 2014
----- Original Message -----
> On 03/25/2014 09:34 AM, jfonseca at vmware.com wrote:
> > From: José Fonseca <jfonseca at vmware.com>
> >
> > It is quite hard to meet the dependency of the libxml2 python bindings
> > out side Linux, and in particularly on MacOSX; whereas ElementTree is
> > part of Python's standard library. ElementTree is more limited than
> > libxml2: no DTD verification, defaults from DTD, or XInclude support,
> > but none of this limitations is serious enough to justify libxml2.
> >
> > In fact, it was easier to refactor the code to use ElementTree than to
> > try to get libxml2 python bindings...
> >
> > In the process, gl_item_factory class was refactored so that there is
> > one method for each kind of object to be created, as it simplified
> > things substantially.
>
> glx_doc_item_factory (glX_doc.py) derives from glx_item_factory, and
> glX_proto_recv.py uses glx_item_factory. It doesn't look like
> glX_proto_recv.py should make any difference, but glX_doc.py is probably
> broken now. I had to look up WTF glX_doc.py is by 'git log --follow'...
> and apparently I wrote it. :)
I didn't know about `--follow`! Oh, all those times I manually followed the renames...
BTW, gitk sorts of supports it too, even though it's not documented, e.g., `gitk --follow src/mapi/glapi/gen/glX_doc.py`.
> I doubt it has been used by anyone in
> many years, so the right fix is probably 'git rm'.
I'll remove it then.
> However you decided to deal with glX_doc.py, the series that includes
> that fix is
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Thanks.
Jose
>
> > I confirmed that precisely the same output is generated for GL/GLX/GLES.
> > ---
> > SConstruct | 7 --
> > configure.ac | 1 -
> > docs/README.WIN32 | 16 ++-
> > docs/install.html | 4 -
> > src/mapi/glapi/gen/glX_XML.py | 55 ++++-----
> > src/mapi/glapi/gen/glX_proto_common.py | 13 +-
> > src/mapi/glapi/gen/gl_XML.py | 217
> > ++++++++++++++++-----------------
> > 7 files changed, 141 insertions(+), 172 deletions(-)
> >
> > diff --git a/SConstruct b/SConstruct
> > index de735e9..0e10818 100644
> > --- a/SConstruct
> > +++ b/SConstruct
> > @@ -59,13 +59,6 @@ else:
> >
> > Help(opts.GenerateHelpText(env))
> >
> > -# fail early for a common error on windows
> > -if env['gles']:
> > - try:
> > - import libxml2
> > - except ImportError:
> > - raise SCons.Errors.UserError, "GLES requires libxml2-python to
> > build"
> > -
> > #######################################################################
> > # Environment setup
> >
> > diff --git a/configure.ac b/configure.ac
> > index c5042f9..04bf711 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -54,7 +54,6 @@ AM_PROG_CC_C_O
> > AM_PROG_AS
> > AC_CHECK_PROGS([MAKE], [gmake make])
> > AC_CHECK_PROGS([PYTHON2], [python2 python])
> > -AX_PYTHON_MODULE([libxml2], [needed])
> > AC_PROG_SED
> > AC_PROG_MKDIR_P
> >
> > diff --git a/docs/README.WIN32 b/docs/README.WIN32
> > index 0cd007c..c8759f6 100644
> > --- a/docs/README.WIN32
> > +++ b/docs/README.WIN32
> > @@ -36,17 +36,15 @@ Recipe
> > Building on windows requires several open-source packages. These are
> > steps that work as of this writing.
> >
> > -1) install python 2.7
> > -2) install scons (latest)
> > -3) install mingw, flex, and bison
> > -4) install libxml2 from here:
> > https://urldefense.proofpoint.com/v1/url?u=http://www.lfd.uci.edu/~gohlke/pythonlibs&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=3abc5c307d6afd2ce2a3d955fe84d68df2c6aee42fe31df8eaa0ecd64c9581f5
> > - get libxml2-python-2.9.1.win-amd64-py2.7.exe
> > -5) install pywin32 from here:
> > https://urldefense.proofpoint.com/v1/url?u=http://www.lfd.uci.edu/~gohlke/pythonlibs&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=3abc5c307d6afd2ce2a3d955fe84d68df2c6aee42fe31df8eaa0ecd64c9581f5
> > +- install python 2.7
> > +- install scons (latest)
> > +- install mingw, flex, and bison
> > +- install pywin32 from here:
> > https://urldefense.proofpoint.com/v1/url?u=http://www.lfd.uci.edu/~gohlke/pythonlibs&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=3abc5c307d6afd2ce2a3d955fe84d68df2c6aee42fe31df8eaa0ecd64c9581f5
> > get pywin32-218.4.win-amd64-py2.7.exe
> > -6) install git
> > -7) download mesa from git
> > +- install git
> > +- download mesa from git
> > see
> > https://urldefense.proofpoint.com/v1/url?u=http://www.mesa3d.org/repository.html&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=1e32e0d790d26fd681af96b65de8ae3d30f161ba379c59371b3e9e4159cb64b3
> > -8) run scons
> > +- run scons
> >
> > General
> > -------
> > diff --git a/docs/install.html b/docs/install.html
> > index 24492a7..5061ede 100644
> > --- a/docs/install.html
> > +++ b/docs/install.html
> > @@ -44,10 +44,6 @@ On Windows with MinGW, install flex and bison with:
> > </li>
> > <li>python - Python is needed for building the Gallium components.
> > Version 2.6.4 or later should work.
> > -<br>
> > -<br>
> > -To build OpenGL ES 1.1 and 2.0 you'll also need
> > -<a
> > href="https://urldefense.proofpoint.com/v1/url?u=http://xmlsoft.org/sources/win32/python/libxml2-python-2.7.7.win32-py2.7.exe&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=e87080eec2c20846976710147184ba07b285713cd7ad9a94913cb0524b9ae61a">libxml2-python</a>.
> > </li>
> > </ul>
> >
> > diff --git a/src/mapi/glapi/gen/glX_XML.py b/src/mapi/glapi/gen/glX_XML.py
> > index 03a35b7..12ff291 100644
> > --- a/src/mapi/glapi/gen/glX_XML.py
> > +++ b/src/mapi/glapi/gen/glX_XML.py
> > @@ -33,29 +33,27 @@ import sys, getopt, string
> > class glx_item_factory(gl_XML.gl_item_factory):
> > """Factory to create GLX protocol oriented objects derived from
> > gl_item."""
> >
> > - def create_item(self, name, element, context):
> > - if name == "function":
> > - return glx_function(element, context)
> > - elif name == "enum":
> > - return glx_enum(element, context)
> > - elif name == "api":
> > - return glx_api(self)
> > - else:
> > - return gl_XML.gl_item_factory.create_item(self, name, element,
> > context)
> > + def create_function(self, element, context):
> > + return glx_function(element, context)
> > +
> > + def create_enum(self, element, context, category):
> > + return glx_enum(element, context, category)
> > +
> > + def create_api(self):
> > + return glx_api(self)
> >
> >
> > class glx_enum(gl_XML.gl_enum):
> > - def __init__(self, element, context):
> > - gl_XML.gl_enum.__init__(self, element, context)
> > + def __init__(self, element, context, category):
> > + gl_XML.gl_enum.__init__(self, element, context, category)
> >
> > self.functions = {}
> >
> > - child = element.children
> > - while child:
> > - if child.type == "element" and child.name == "size":
> > - n = child.nsProp( "name", None )
> > - c = child.nsProp( "count", None )
> > - m = child.nsProp( "mode", None )
> > + for child in element.getchildren():
> > + if child.tag == "size":
> > + n = child.get( "name" )
> > + c = child.get( "count" )
> > + m = child.get( "mode", "set" )
> >
> > if not c:
> > c = self.default_count
> > @@ -70,8 +68,6 @@ class glx_enum(gl_XML.gl_enum):
> > if not self.functions.has_key(n):
> > self.functions[ n ] = [c, mode]
> >
> > - child = child.next
> > -
> > return
> >
> >
> > @@ -120,10 +116,10 @@ class glx_function(gl_XML.gl_function):
> > # appears after the function that it aliases.
> >
> > if not self.vectorequiv:
> > - self.vectorequiv = element.nsProp("vectorequiv", None)
> > + self.vectorequiv = element.get("vectorequiv")
> >
> >
> > - name = element.nsProp("name", None)
> > + name = element.get("name")
> > if name == self.name:
> > for param in self.parameters:
> > self.parameters_by_name[ param.name ] = param
> > @@ -135,12 +131,11 @@ class glx_function(gl_XML.gl_function):
> > self.counter_list.append(param.counter)
> >
> >
> > - child = element.children
> > - while child:
> > - if child.type == "element" and child.name == "glx":
> > - rop = child.nsProp( 'rop', None )
> > - sop = child.nsProp( 'sop', None )
> > - vop = child.nsProp( 'vendorpriv', None )
> > + for child in element.getchildren():
> > + if child.tag == "glx":
> > + rop = child.get( 'rop' )
> > + sop = child.get( 'sop' )
> > + vop = child.get( 'vendorpriv' )
> >
> > if rop:
> > self.glx_rop = int(rop)
> > @@ -152,12 +147,12 @@ class glx_function(gl_XML.gl_function):
> > self.glx_vendorpriv = int(vop)
> > self.glx_vendorpriv_names.append(name)
> >
> > - self.img_reset = child.nsProp( 'img_reset', None )
> > + self.img_reset = child.get( 'img_reset' )
> >
> > # The 'handcode' attribute can be one of 'true',
> > # 'false', 'client', or 'server'.
> >
> > - handcode = child.nsProp( 'handcode', None )
> > + handcode = child.get( 'handcode', 'false' )
> > if handcode == "false":
> > self.server_handcode = 0
> > self.client_handcode = 0
> > @@ -179,8 +174,6 @@ class glx_function(gl_XML.gl_function):
> > self.reply_always_array = gl_XML.is_attr_true( child,
> > 'always_array' )
> > self.dimensions_in_reply = gl_XML.is_attr_true( child,
> > 'dimensions_in_reply' )
> >
> > - child = child.next
> > -
> >
> > # Do some validation of the GLX protocol information. As
> > # new tests are discovered, they should be added here.
> > diff --git a/src/mapi/glapi/gen/glX_proto_common.py
> > b/src/mapi/glapi/gen/glX_proto_common.py
> > index 86d9189..ae2c2d5 100644
> > --- a/src/mapi/glapi/gen/glX_proto_common.py
> > +++ b/src/mapi/glapi/gen/glX_proto_common.py
> > @@ -32,18 +32,15 @@ import string
> > class glx_proto_item_factory(glX_XML.glx_item_factory):
> > """Factory to create GLX protocol oriented objects derived from
> > gl_item."""
> >
> > - def create_item(self, name, element, context):
> > - if name == "type":
> > - return glx_proto_type(element, context)
> > - else:
> > - return glX_XML.glx_item_factory.create_item(self, name,
> > element, context)
> > + def create_type(self, element, context, category):
> > + return glx_proto_type(element, context, category)
> >
> >
> > class glx_proto_type(gl_XML.gl_type):
> > - def __init__(self, element, context):
> > - gl_XML.gl_type.__init__(self, element, context)
> > + def __init__(self, element, context, category):
> > + gl_XML.gl_type.__init__(self, element, context, category)
> >
> > - self.glx_name = element.nsProp( "glx_name", None )
> > + self.glx_name = element.get( "glx_name" )
> > return
> >
> >
> > diff --git a/src/mapi/glapi/gen/gl_XML.py b/src/mapi/glapi/gen/gl_XML.py
> > index 3bbc794..1a2bc2b 100644
> > --- a/src/mapi/glapi/gen/gl_XML.py
> > +++ b/src/mapi/glapi/gen/gl_XML.py
> > @@ -26,20 +26,19 @@
> > # Ian Romanick <idr at us.ibm.com>
> >
> > from decimal import Decimal
> > -import libxml2
> > +import xml.etree.ElementTree as ET
> > import re, sys, string
> > +import os.path
> > import typeexpr
> >
> >
> > def parse_GL_API( file_name, factory = None ):
> > - doc = libxml2.readFile( file_name, None, libxml2.XML_PARSE_XINCLUDE +
> > libxml2.XML_PARSE_NOBLANKS + libxml2.XML_PARSE_DTDVALID +
> > libxml2.XML_PARSE_DTDATTR + libxml2.XML_PARSE_DTDLOAD +
> > libxml2.XML_PARSE_NOENT )
> > - ret = doc.xincludeProcess()
> >
> > if not factory:
> > factory = gl_item_factory()
> >
> > - api = factory.create_item( "api", None, None )
> > - api.process_element( doc )
> > + api = factory.create_api()
> > + api.parse_file( file_name )
> >
> > # After the XML has been processed, we need to go back and assign
> > # dispatch offsets to the functions that request that their offsets
> > @@ -51,12 +50,10 @@ def parse_GL_API( file_name, factory = None ):
> > func.offset = api.next_offset;
> > api.next_offset += 1
> >
> > - doc.freeDoc()
> > -
> > return api
> >
> >
> > -def is_attr_true( element, name ):
> > +def is_attr_true( element, name, default = "false" ):
> > """Read a name value from an element's attributes.
> >
> > The value read from the attribute list must be either 'true' or
> > @@ -64,7 +61,7 @@ def is_attr_true( element, name ):
> > value is 'true', non-zero will be returned. An exception will be
> > raised for any other value."""
> >
> > - value = element.nsProp( name, None )
> > + value = element.get( name, default )
> > if value == "true":
> > return 1
> > elif value == "false":
> > @@ -254,8 +251,8 @@ class gl_print_base(object):
> >
> >
> > def real_function_name(element):
> > - name = element.nsProp( "name", None )
> > - alias = element.nsProp( "alias", None )
> > + name = element.get( "name" )
> > + alias = element.get( "alias" )
> >
> > if alias:
> > return alias
> > @@ -324,21 +321,22 @@ def create_parameter_string(parameters,
> > include_names):
> >
> >
> > class gl_item(object):
> > - def __init__(self, element, context):
> > + def __init__(self, element, context, category):
> > self.context = context
> > - self.name = element.nsProp( "name", None )
> > - self.category = real_category_name( element.parent.nsProp( "name",
> > None ) )
> > + self.name = element.get( "name" )
> > + self.category = real_category_name( category )
> > +
> > return
> >
> >
> > class gl_type( gl_item ):
> > - def __init__(self, element, context):
> > - gl_item.__init__(self, element, context)
> > - self.size = int( element.nsProp( "size", None ), 0 )
> > + def __init__(self, element, context, category):
> > + gl_item.__init__(self, element, context, category)
> > + self.size = int( element.get( "size" ), 0 )
> >
> > te = typeexpr.type_expression( None )
> > tn = typeexpr.type_node()
> > - tn.size = int( element.nsProp( "size", None ), 0 )
> > + tn.size = int( element.get( "size" ), 0 )
> > tn.integer = not is_attr_true( element, "float" )
> > tn.unsigned = is_attr_true( element, "unsigned" )
> > tn.pointer = is_attr_true( element, "pointer" )
> > @@ -354,11 +352,11 @@ class gl_type( gl_item ):
> >
> >
> > class gl_enum( gl_item ):
> > - def __init__(self, element, context):
> > - gl_item.__init__(self, element, context)
> > - self.value = int( element.nsProp( "value", None ), 0 )
> > + def __init__(self, element, context, category):
> > + gl_item.__init__(self, element, context, category)
> > + self.value = int( element.get( "value" ), 0 )
> >
> > - temp = element.nsProp( "count", None )
> > + temp = element.get( "count" )
> > if not temp or temp == "?":
> > self.default_count = -1
> > else:
> > @@ -404,12 +402,12 @@ class gl_enum( gl_item ):
> >
> > class gl_parameter(object):
> > def __init__(self, element, context):
> > - self.name = element.nsProp( "name", None )
> > + self.name = element.get( "name" )
> >
> > - ts = element.nsProp( "type", None )
> > + ts = element.get( "type" )
> > self.type_expr = typeexpr.type_expression( ts, context )
> >
> > - temp = element.nsProp( "variable_param", None )
> > + temp = element.get( "variable_param" )
> > if temp:
> > self.count_parameter_list = temp.split( ' ' )
> > else:
> > @@ -420,7 +418,7 @@ class gl_parameter(object):
> > # statement will throw an exception, and the except block will
> > # take over.
> >
> > - c = element.nsProp( "count", None )
> > + c = element.get( "count" )
> > try:
> > count = int(c)
> > self.count = count
> > @@ -430,7 +428,7 @@ class gl_parameter(object):
> > self.count = 0
> > self.counter = c
> >
> > - self.count_scale = int(element.nsProp( "count_scale", None ))
> > + self.count_scale = int(element.get( "count_scale", "1" ))
> >
> > elements = (count * self.count_scale)
> > if elements == 1:
> > @@ -450,19 +448,19 @@ class gl_parameter(object):
> >
> > # Pixel data has special parameters.
> >
> > - self.width = element.nsProp('img_width', None)
> > - self.height = element.nsProp('img_height', None)
> > - self.depth = element.nsProp('img_depth', None)
> > - self.extent = element.nsProp('img_extent', None)
> > + self.width = element.get('img_width')
> > + self.height = element.get('img_height')
> > + self.depth = element.get('img_depth')
> > + self.extent = element.get('img_extent')
> >
> > - self.img_xoff = element.nsProp('img_xoff', None)
> > - self.img_yoff = element.nsProp('img_yoff', None)
> > - self.img_zoff = element.nsProp('img_zoff', None)
> > - self.img_woff = element.nsProp('img_woff', None)
> > + self.img_xoff = element.get('img_xoff')
> > + self.img_yoff = element.get('img_yoff')
> > + self.img_zoff = element.get('img_zoff')
> > + self.img_woff = element.get('img_woff')
> >
> > - self.img_format = element.nsProp('img_format', None)
> > - self.img_type = element.nsProp('img_type', None)
> > - self.img_target = element.nsProp('img_target', None)
> > + self.img_format = element.get('img_format')
> > + self.img_type = element.get('img_type')
> > + self.img_target = element.get('img_target')
> >
> > self.img_pad_dimensions = is_attr_true( element,
> > 'img_pad_dimensions' )
> > self.img_null_flag = is_attr_true( element, 'img_null_flag' )
> > @@ -648,17 +646,17 @@ class gl_function( gl_item ):
> >
> >
> > def process_element(self, element):
> > - name = element.nsProp( "name", None )
> > - alias = element.nsProp( "alias", None )
> > + name = element.get( "name" )
> > + alias = element.get( "alias" )
> >
> > - if is_attr_true(element, "static_dispatch"):
> > + if is_attr_true(element, "static_dispatch", "true"):
> > self.static_entry_points.append(name)
> >
> > self.entry_points.append( name )
> >
> > self.entry_point_api_map[name] = {}
> > for api in ('es1', 'es2'):
> > - version_str = element.nsProp(api, None)
> > + version_str = element.get(api, 'none')
> > assert version_str is not None
> > if version_str != 'none':
> > version_decimal = Decimal(version_str)
> > @@ -667,15 +665,15 @@ class gl_function( gl_item ):
> > version_decimal < self.api_map[api]:
> > self.api_map[api] = version_decimal
> >
> > - exec_flavor = element.nsProp('exec', None)
> > + exec_flavor = element.get('exec')
> > if exec_flavor:
> > self.exec_flavor = exec_flavor
> >
> > - deprecated = element.nsProp('deprecated', None)
> > + deprecated = element.get('deprecated', 'none')
> > if deprecated != 'none':
> > self.deprecated = Decimal(deprecated)
> >
> > - if not is_attr_true(element, 'desktop'):
> > + if not is_attr_true(element, 'desktop', 'true'):
> > self.desktop = False
> >
> > if alias:
> > @@ -686,7 +684,7 @@ class gl_function( gl_item ):
> > # Only try to set the offset when a non-alias entry-point
> > # is being processed.
> >
> > - offset = element.nsProp( "offset", None )
> > + offset = element.get( "offset" )
> > if offset:
> > try:
> > o = int( offset )
> > @@ -712,16 +710,12 @@ class gl_function( gl_item ):
> >
> > parameters = []
> > return_type = "void"
> > - child = element.children
> > - while child:
> > - if child.type == "element":
> > - if child.name == "return":
> > - return_type = child.nsProp( "type", None )
> > - elif child.name == "param":
> > - param = self.context.factory.create_item( "parameter",
> > child, self.context)
> > - parameters.append( param )
> > -
> > - child = child.next
> > + for child in element.getchildren():
> > + if child.tag == "return":
> > + return_type = child.get( "type", "void" )
> > + elif child.tag == "param":
> > + param = self.context.factory.create_parameter(child,
> > self.context)
> > + parameters.append( param )
> >
> >
> > if self.initialized:
> > @@ -746,7 +740,7 @@ class gl_function( gl_item ):
> > if param.is_image():
> > self.images.append( param )
> >
> > - if element.children:
> > + if element.getchildren():
> > self.initialized = 1
> > self.entry_point_parameters[name] = parameters
> > else:
> > @@ -848,19 +842,20 @@ class gl_function( gl_item ):
> > class gl_item_factory(object):
> > """Factory to create objects derived from gl_item."""
> >
> > - def create_item(self, item_name, element, context):
> > - if item_name == "function":
> > - return gl_function(element, context)
> > - if item_name == "type":
> > - return gl_type(element, context)
> > - elif item_name == "enum":
> > - return gl_enum(element, context)
> > - elif item_name == "parameter":
> > - return gl_parameter(element, context)
> > - elif item_name == "api":
> > - return gl_api(self)
> > - else:
> > - return None
> > + def create_function(self, element, context):
> > + return gl_function(element, context)
> > +
> > + def create_type(self, element, context, category):
> > + return gl_type(element, context, category)
> > +
> > + def create_enum(self, element, context, category):
> > + return gl_enum(element, context, category)
> > +
> > + def create_parameter(self, element, context):
> > + return gl_parameter(element, context)
> > +
> > + def create_api(self):
> > + return gl_api(self)
> >
> >
> > class gl_api(object):
> > @@ -903,66 +898,64 @@ class gl_api(object):
> >
> > self.functions_by_name = functions_by_name
> >
> > - def process_element(self, doc):
> > - element = doc.children
> > - while element.type != "element" or element.name != "OpenGLAPI":
> > - element = element.next
> >
> > - if element:
> > - self.process_OpenGLAPI(element)
> > - return
> > + def parse_file(self, file_name):
> > + doc = ET.parse( file_name )
> > + self.process_element(file_name, doc)
> >
> >
> > - def process_OpenGLAPI(self, element):
> > - child = element.children
> > - while child:
> > - if child.type == "element":
> > - if child.name == "category":
> > - self.process_category( child )
> > - elif child.name == "OpenGLAPI":
> > - self.process_OpenGLAPI( child )
> > + def process_element(self, file_name, doc):
> > + element = doc.getroot()
> > + if element.tag == "OpenGLAPI":
> > + self.process_OpenGLAPI(file_name, element)
> > + return
> > +
> >
> > - child = child.next
> > + def process_OpenGLAPI(self, file_name, element):
> > + for child in element.getchildren():
> > + if child.tag == "category":
> > + self.process_category( child )
> > + elif child.tag == "OpenGLAPI":
> > + self.process_OpenGLAPI( file_name, child )
> > + elif child.tag ==
> > '{https://urldefense.proofpoint.com/v1/url?u=http://www.w3.org/2001/XInclude&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0A&m=VUZN4FMFp%2F%2B7p7K%2Ft3hutJU6Z9obEUOch%2FDef%2BJjKy0%3D%0A&s=bcba90269a248e30a01c734a92293b877f59760cc9a129a752f50d06ad659005}include':
> > + href = child.get('href')
> > + href = os.path.join(os.path.dirname(file_name), href)
> > + self.parse_file(href)
> >
> > return
> >
> >
> > def process_category(self, cat):
> > - cat_name = cat.nsProp( "name", None )
> > - cat_number = cat.nsProp( "number", None )
> > + cat_name = cat.get( "name" )
> > + cat_number = cat.get( "number" )
> >
> > [cat_type, key] = classify_category(cat_name, cat_number)
> > self.categories[cat_type][key] = [cat_name, cat_number]
> >
> > - child = cat.children
> > - while child:
> > - if child.type == "element":
> > - if child.name == "function":
> > - func_name = real_function_name( child )
> > -
> > - temp_name = child.nsProp( "name", None )
> > - self.category_dict[ temp_name ] = [cat_name,
> > cat_number]
> > -
> > - if self.functions_by_name.has_key( func_name ):
> > - func = self.functions_by_name[ func_name ]
> > - func.process_element( child )
> > - else:
> > - func = self.factory.create_item( "function",
> > child, self )
> > - self.functions_by_name[ func_name ] = func
> > + for child in cat.getchildren():
> > + if child.tag == "function":
> > + func_name = real_function_name( child )
> >
> > - if func.offset >= self.next_offset:
> > - self.next_offset = func.offset + 1
> > + temp_name = child.get( "name" )
> > + self.category_dict[ temp_name ] = [cat_name, cat_number]
> >
> > + if self.functions_by_name.has_key( func_name ):
> > + func = self.functions_by_name[ func_name ]
> > + func.process_element( child )
> > + else:
> > + func = self.factory.create_function( child, self )
> > + self.functions_by_name[ func_name ] = func
> >
> > - elif child.name == "enum":
> > - enum = self.factory.create_item( "enum", child, self )
> > - self.enums_by_name[ enum.name ] = enum
> > - elif child.name == "type":
> > - t = self.factory.create_item( "type", child, self )
> > - self.types_by_name[ "GL" + t.name ] = t
> > + if func.offset >= self.next_offset:
> > + self.next_offset = func.offset + 1
> >
> >
> > - child = child.next
> > + elif child.tag == "enum":
> > + enum = self.factory.create_enum( child, self, cat_name )
> > + self.enums_by_name[ enum.name ] = enum
> > + elif child.tag == "type":
> > + t = self.factory.create_type( child, self, cat_name )
> > + self.types_by_name[ "GL" + t.name ] = t
> >
> > return
> >
> >
>
More information about the mesa-dev
mailing list