gl_enums.py revision f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505
178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#!/usr/bin/python2
278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# -*- Mode: Python; py-indent-offset: 8 -*-
378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# (C) Copyright Zack Rusin 2005
578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# All Rights Reserved.
678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#
778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# Permission is hereby granted, free of charge, to any person obtaining a
878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# copy of this software and associated documentation files (the "Software"),
978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# to deal in the Software without restriction, including without limitation
1078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# on the rights to use, copy, modify, merge, publish, distribute, sub
1178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# license, and/or sell copies of the Software, and to permit persons to whom
1278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# the Software is furnished to do so, subject to the following conditions:
1378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#
1478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# The above copyright notice and this permission notice (including the next
1578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# paragraph) shall be included in all copies or substantial portions of the
1678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# Software.
1778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#
1878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
2178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# IN THE SOFTWARE.
2578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#
2678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul# Authors:
2778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#    Zack Rusin <zack@kde.org>
2878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
2978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulfrom xml.sax import saxutils
3078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulfrom xml.sax import make_parser
3178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulfrom xml.sax.handler import feature_namespaces
3278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
3378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulimport license
3478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulimport gl_XML
3578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulimport sys, getopt
3678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
3778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulclass PrintGlEnums(gl_XML.FilterGLAPISpecBase):
3878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	name = "gl_enums.py (from Mesa)"
3978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
4078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	def __init__(self):
4178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		gl_XML.FilterGLAPISpecBase.__init__(self)
4278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		self.license = license.bsd_license_template % ( \
4378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul"""Copyright (C) 1999-2005 Brian Paul All Rights Reserved.""", "BRIAN PAUL")
44f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		self.enum_table = {}
4578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
4678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
4778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	def printRealHeader(self):
4878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '#include "glheader.h"'
4978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '#include "enums.h"'
5078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '#include "imports.h"'
5178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print ''
5278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print 'typedef struct {'
53f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '   size_t offset;'
5478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '   int n;'
5578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '} enum_elt;'
5678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print ''
5778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
5878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
598f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul	def printBody(self):
6078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print """
6178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul#define Elements(x) sizeof(x)/sizeof(*x)
6278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
6378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paultypedef int (*cfunc)(const void *, const void *);
6478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
65f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick/**
66f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * Compare a key name to an element in the \c all_enums array.
67f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
68f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \c bsearch always passes the key as the first parameter and the pointer
69f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * to the array element as the second parameter.  We can elimiate some
70f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * extra work by taking advantage of that fact.
71f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
72f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param a  Pointer to the desired enum name.
73f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param b  Pointer to an element of the \c all_enums array.
7478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul */
75f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanickstatic int compar_name( const char *a, const enum_elt *b )
7678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
77f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   return _mesa_strcmp( a, & enum_string_table[ b->offset ] );
7878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
7978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
80f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick/**
81f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * Compare a key enum value to an element in the \c all_enums array.
82f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
83f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \c bsearch always passes the key as the first parameter and the pointer
84f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * to the array element as the second parameter.  We can elimiate some
85f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * extra work by taking advantage of that fact.
86f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
87f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param a  Pointer to the desired enum name.
88f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param b  Pointer to an index into the \c all_enums array.
89f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick */
90f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanickstatic int compar_nr( const int *a, const unsigned *b )
9178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
92f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   return a[0] - all_enums[*b].n;
9378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
9478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
9578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
968f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulstatic char token_tmp[20];
9778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
988f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulconst char *_mesa_lookup_enum_by_nr( int nr )
9978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
100f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   unsigned * i;
10178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
102f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   i = (unsigned *)bsearch( & nr, reduced_enums, Elements(reduced_enums),
103f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick                            sizeof(reduced_enums[0]), (cfunc) compar_nr );
10478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
105f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   if ( i != NULL ) {
106f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick      return & enum_string_table[ all_enums[ *i ].offset ];
1078f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   }
1088f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   else {
109f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick      /* this is not re-entrant safe, no big deal here */
1108f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul      _mesa_sprintf(token_tmp, "0x%x", nr);
1118f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul      return token_tmp;
1128f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   }
11378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
11478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
1158f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulint _mesa_lookup_enum_by_name( const char *symbol )
11678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
117f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   enum_elt * f = NULL;
11878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
119f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   if ( symbol != NULL ) {
120f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick      f = (enum_elt *)bsearch( symbol, all_enums, Elements(all_enums),
121f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			       sizeof( enum_elt ), (cfunc) compar_name );
122f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   }
12378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
124f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   return (f != NULL) ? f->n : -1;
12578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
1268f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul
12778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul"""
12878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
12978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
13078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	def printFunctions(self):
131f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		keys = self.enum_table.keys()
132f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		keys.sort()
133f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
134f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		name_table = []
135f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		enum_table = {}
136f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
137f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for enum in keys:
138f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			low_pri = 9
139f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			for [name, pri] in self.enum_table[ enum ]:
140f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				name_table.append( [name, enum] )
141f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
142f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				if pri < low_pri:
143f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					low_pri = pri
144f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					enum_table[enum] = name
145f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
146f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
147f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		name_table.sort()
148f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
149f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		string_offsets = {}
150f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		i = 0;
151f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print 'static const char enum_string_table[] = '
152f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for [name, enum] in name_table:
153f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			print '   "%s\\0"' % (name)
154f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			string_offsets[ name ] = i
155f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			i += len(name) + 1
156f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
157f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '   ;'
158f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print ''
159f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
160f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
161f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print 'static const enum_elt all_enums[%u] =' % (len(name_table))
162f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '{'
163f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for [name, enum] in name_table:
164f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			print '   { % 5u, 0x%08X }, /* %s */' % (string_offsets[name], enum, name)
165f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '};'
166f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print ''
167f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
168f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print 'static const unsigned reduced_enums[%u] =' % (len(keys))
169f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '{'
170f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for enum in keys:
171f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			name = enum_table[ enum ]
172f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			if [name, enum] not in name_table:
173f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				print '      /* Error! %s, 0x%04x */ 0,' % (name, enum)
174f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			else:
175f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				i = name_table.index( [name, enum] )
176f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
177f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				print '      % 4u, /* %s */' % (i, name)
178f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '};'
179f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
180f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
1818f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul		self.printBody();
18278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
18378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
18478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
185f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick	def append(self, object_type, obj):
186f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		if object_type == "enum":
187f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			if obj.value not in self.enum_table:
188f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				self.enum_table[ obj.value ] = []
189f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
190f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
191f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			# Prevent duplicate names in the enum table.
192f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
193f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			if obj.name not in self.enum_table[ obj.value ]:
194f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
195f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# Calculate a "priority" for this enum name.
196f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# When we lookup an enum by number, there may
197f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# be many possible names, but only one can be
198f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# returned.  The priority is used by this
199f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# script to select which name is the "best".
200f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				#
201f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# Highest precedence is given to "core" name.
202f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# ARB extension names have the next highest,
203f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# followed by EXT extension names.  Vendor
204f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				# extension names are the lowest.
205f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
206f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				if obj.category.startswith( "GL_VERSION_" ):
207f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					priority = 0
208f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				elif obj.category.startswith( "GL_ARB_" ):
209f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					priority = 1
210f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				elif obj.category.startswith( "GL_EXT_" ):
211f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					priority = 2
212f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				else:
213f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					priority = 3
214f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
215f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				self.enum_table[ obj.value ].append( [obj.name, priority] )
216f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
217f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		else:
218f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			gl_XML.FilterGLAPISpecBase.append(self, object_type, obj)
219f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
220f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
22178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Pauldef show_usage():
22278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	print "Usage: %s [-f input_file_name]" % sys.argv[0]
22378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	sys.exit(1)
22478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
22578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulif __name__ == '__main__':
22678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	file_name = "gl_API.xml"
227f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
22878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	try:
22978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		(args, trail) = getopt.getopt(sys.argv[1:], "f:")
23078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	except Exception,e:
23178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		show_usage()
23278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
23378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	for (arg,val) in args:
23478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		if arg == "-f":
23578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul			file_name = val
23678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
23778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	dh = PrintGlEnums()
23878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
23978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	parser = make_parser()
24078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	parser.setFeature(feature_namespaces, 0)
24178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	parser.setContentHandler(dh)
24278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
24378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	f = open(file_name)
24478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
24578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	dh.printHeader()
24678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	parser.parse(f)
24778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	dh.printFooter()
248