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 Paulimport license
3078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulimport gl_XML
3178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulimport sys, getopt
3278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
3366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanickclass PrintGlEnums(gl_XML.gl_print_base):
3478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
3578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	def __init__(self):
3666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		gl_XML.gl_print_base.__init__(self)
3770dbbbf89af4c1d6d9b52cbbb79ee7f9ad654592Ian Romanick
3870dbbbf89af4c1d6d9b52cbbb79ee7f9ad654592Ian Romanick		self.name = "gl_enums.py (from Mesa)"
3978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		self.license = license.bsd_license_template % ( \
4078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul"""Copyright (C) 1999-2005 Brian Paul All Rights Reserved.""", "BRIAN PAUL")
41f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		self.enum_table = {}
4278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
4378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
4478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	def printRealHeader(self):
455b426288c2dbc42ef44ea13fe37afa77223107bbChia-I Wu		print '#include "main/glheader.h"'
465b426288c2dbc42ef44ea13fe37afa77223107bbChia-I Wu		print '#include "main/mfeatures.h"'
475b426288c2dbc42ef44ea13fe37afa77223107bbChia-I Wu		print '#include "main/enums.h"'
485b426288c2dbc42ef44ea13fe37afa77223107bbChia-I Wu		print '#include "main/imports.h"'
49887d2b647bae7f6536bab08649bad9f799995d08Brian Paul		print '#include "main/mtypes.h"'
5078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print ''
5178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print 'typedef struct {'
52f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '   size_t offset;'
5378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '   int n;'
5478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print '} enum_elt;'
5578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print ''
5678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
5778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
5866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def print_code(self):
5978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		print """
6078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paultypedef int (*cfunc)(const void *, const void *);
6178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
62f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick/**
63f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * Compare a key name to an element in the \c all_enums array.
64f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
65f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \c bsearch always passes the key as the first parameter and the pointer
66f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * to the array element as the second parameter.  We can elimiate some
67f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * extra work by taking advantage of that fact.
68f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
69f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param a  Pointer to the desired enum name.
70f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param b  Pointer to an element of the \c all_enums array.
7178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul */
72f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanickstatic int compar_name( const char *a, const enum_elt *b )
7378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
748d73aa6d1ae6e89bb2cd8f52f5586d569a4b6eebKenneth Graunke   return strcmp( a, & enum_string_table[ b->offset ] );
7578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
7678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
77f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick/**
78f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * Compare a key enum value to an element in the \c all_enums array.
79f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
80f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \c bsearch always passes the key as the first parameter and the pointer
81f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * to the array element as the second parameter.  We can elimiate some
82f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * extra work by taking advantage of that fact.
83f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick *
84f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param a  Pointer to the desired enum name.
85f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick * \param b  Pointer to an index into the \c all_enums array.
86f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick */
87f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanickstatic int compar_nr( const int *a, const unsigned *b )
8878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
89f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   return a[0] - all_enums[*b].n;
9078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
9178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
9278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
938f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulstatic char token_tmp[20];
9478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
958f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulconst char *_mesa_lookup_enum_by_nr( int nr )
9678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
97f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   unsigned * i;
9878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
9959cc9739400c3a1654c069586070ff218993cd37Brian Paul   i = (unsigned *) _mesa_bsearch(& nr, reduced_enums,
10059cc9739400c3a1654c069586070ff218993cd37Brian Paul                                  Elements(reduced_enums),
10159cc9739400c3a1654c069586070ff218993cd37Brian Paul                                  sizeof(reduced_enums[0]),
10259cc9739400c3a1654c069586070ff218993cd37Brian Paul                                  (cfunc) compar_nr);
10378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
104f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   if ( i != NULL ) {
105f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick      return & enum_string_table[ all_enums[ *i ].offset ];
1068f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   }
1078f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   else {
108f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick      /* this is not re-entrant safe, no big deal here */
109672f6cdc19c5f89d85e20dc04bacb5a7905ff334Brian Paul      _mesa_snprintf(token_tmp, sizeof(token_tmp) - 1, "0x%x", nr);
110672f6cdc19c5f89d85e20dc04bacb5a7905ff334Brian Paul      token_tmp[sizeof(token_tmp) - 1] = '\\0';
1118f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul      return token_tmp;
1128f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul   }
11378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
11478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
115887d2b647bae7f6536bab08649bad9f799995d08Brian Paul/**
116887d2b647bae7f6536bab08649bad9f799995d08Brian Paul * Primitive names
117887d2b647bae7f6536bab08649bad9f799995d08Brian Paul */
118887d2b647bae7f6536bab08649bad9f799995d08Brian Paulstatic const char *prim_names[PRIM_UNKNOWN + 1] = {
119887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_POINTS",
120887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_LINES",
121887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_LINE_LOOP",
122887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_LINE_STRIP",
123887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_TRIANGLES",
124887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_TRIANGLE_STRIP",
125887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_TRIANGLE_FAN",
126887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_QUADS",
127887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_QUAD_STRIP",
128887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "GL_POLYGON",
129887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "outside begin/end",
130887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "inside unknown primitive",
131887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   "unknown state"
132887d2b647bae7f6536bab08649bad9f799995d08Brian Paul};
133887d2b647bae7f6536bab08649bad9f799995d08Brian Paul
134887d2b647bae7f6536bab08649bad9f799995d08Brian Paul
135798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell/* Get the name of an enum given that it is a primitive type.  Avoids
136798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell * GL_FALSE/GL_POINTS ambiguity and others.
137798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell */
138887d2b647bae7f6536bab08649bad9f799995d08Brian Paulconst char *
139887d2b647bae7f6536bab08649bad9f799995d08Brian Paul_mesa_lookup_prim_by_nr(GLuint nr)
140798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell{
141887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   if (nr < Elements(prim_names))
142887d2b647bae7f6536bab08649bad9f799995d08Brian Paul      return prim_names[nr];
143887d2b647bae7f6536bab08649bad9f799995d08Brian Paul   else
144887d2b647bae7f6536bab08649bad9f799995d08Brian Paul      return "invalid mode";
145798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell}
146798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell
147798cd2a98d66a1b841930e121676ae1a8f9fb244Keith Whitwell
1488f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paulint _mesa_lookup_enum_by_name( const char *symbol )
14978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul{
150f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   enum_elt * f = NULL;
15178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
152f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   if ( symbol != NULL ) {
15359cc9739400c3a1654c069586070ff218993cd37Brian Paul      f = (enum_elt *) _mesa_bsearch(symbol, all_enums,
15459cc9739400c3a1654c069586070ff218993cd37Brian Paul                                     Elements(all_enums),
15559cc9739400c3a1654c069586070ff218993cd37Brian Paul                                     sizeof( enum_elt ),
15659cc9739400c3a1654c069586070ff218993cd37Brian Paul                                     (cfunc) compar_name);
157f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   }
15878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
159f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick   return (f != NULL) ? f->n : -1;
16078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul}
1618f5f6b3d59fa2ee25654283a235991f332bc8960Brian Paul
16278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul"""
16378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
16478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
16566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
1669664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg	def printBody(self, api_list):
1679664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg		self.enum_table = {}
1689664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg		for api in api_list:
1699664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			self.process_enums( api )
17066a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
171f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		keys = self.enum_table.keys()
172f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		keys.sort()
173f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
174f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		name_table = []
175f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		enum_table = {}
176f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
177f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for enum in keys:
178f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			low_pri = 9
179f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			for [name, pri] in self.enum_table[ enum ]:
180f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				name_table.append( [name, enum] )
181f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
182f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				if pri < low_pri:
183f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					low_pri = pri
184f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick					enum_table[enum] = name
185f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
186f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
187f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		name_table.sort()
188f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
189f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		string_offsets = {}
190f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		i = 0;
1917438a78cf4c220be18134a1d8dde7c776edbbbd3Brian Paul		print 'LONGSTRING static const char enum_string_table[] = '
192f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for [name, enum] in name_table:
193f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			print '   "%s\\0"' % (name)
194f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			string_offsets[ name ] = i
195f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			i += len(name) + 1
196f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
197f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '   ;'
198f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print ''
199f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
200f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
201f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print 'static const enum_elt all_enums[%u] =' % (len(name_table))
202f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '{'
203f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for [name, enum] in name_table:
2043bca4f679a411246306e7e141c562253cb5f4c2dIan Romanick			print '   { %5u, 0x%08X }, /* %s */' % (string_offsets[name], enum, name)
205f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '};'
206f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print ''
207f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
208f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print 'static const unsigned reduced_enums[%u] =' % (len(keys))
209f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '{'
210f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		for enum in keys:
211f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			name = enum_table[ enum ]
212f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			if [name, enum] not in name_table:
213f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				print '      /* Error! %s, 0x%04x */ 0,' % (name, enum)
214f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			else:
215f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				i = name_table.index( [name, enum] )
216f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
2173bca4f679a411246306e7e141c562253cb5f4c2dIan Romanick				print '      %4u, /* %s */' % (i, name)
218f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick		print '};'
219f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
220f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
22166a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		self.print_code()
22278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		return
22378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
22478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
22566a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	def process_enums(self, api):
22666a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick		for obj in api.enumIterateByName():
227f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick			if obj.value not in self.enum_table:
228f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick				self.enum_table[ obj.value ] = []
229f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
230f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
2319664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			enum = self.enum_table[ obj.value ]
23266a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			name = "GL_" + obj.name
23366a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick			priority = obj.priority()
2349664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			already_in = False;
2359664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			for n, p in enum:
2369664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg				if n == name:
2379664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg					already_in = True
2389664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			if not already_in:
2399664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg				enum.append( [name, priority] )
240f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
241f3a6e4fa5b40f2ae09e43b4fe0d46244e96f6505Ian Romanick
24278123bb38b1e4638747f55ddaef39e561cd81d6eBrian Pauldef show_usage():
24378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	print "Usage: %s [-f input_file_name]" % sys.argv[0]
24478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	sys.exit(1)
24578123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
24678123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paulif __name__ == '__main__':
24778123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	try:
24878123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		(args, trail) = getopt.getopt(sys.argv[1:], "f:")
24978123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	except Exception,e:
25078123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		show_usage()
25178123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul
2529664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg	api_list = []
25378123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul	for (arg,val) in args:
25478123bb38b1e4638747f55ddaef39e561cd81d6eBrian Paul		if arg == "-f":
2559664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			api = gl_XML.parse_GL_API( val )
2569664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg			api_list.append(api);
25766a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick
25866a5548fbbf4c04a74b0bbc451718a8fc95502d9Ian Romanick	printer = PrintGlEnums()
2599664f10023b0d57202134ca53795bf40daf580efKristian Høgsberg	printer.Print( api_list )
260