diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/glapi/Makefile | 4 | ||||
| -rw-r--r-- | src/mesa/glapi/gl_XML.py | 3 | ||||
| -rw-r--r-- | src/mesa/glapi/gl_enums.py | 183 | 
3 files changed, 190 insertions, 0 deletions
| diff --git a/src/mesa/glapi/Makefile b/src/mesa/glapi/Makefile index 9fad47e00a..96fdacb343 100644 --- a/src/mesa/glapi/Makefile +++ b/src/mesa/glapi/Makefile @@ -5,6 +5,7 @@  OUTPUTS = glprocs.h glapitemp.h glapioffsets.h glapitable.h \ +	../main/enums.c \  	../x86/glapi_x86.S \  	../../glx/x11/indirect.c \  	../../glx/x11/indirect.h \ @@ -44,6 +45,9 @@ glapioffsets.h: $(COMMON) gl_offsets.py  glapitable.h: $(COMMON) gl_table.py  	$(PYTHON2) $(PYTHON_FLAGS) gl_table.py > glapitable.h +../main/enums.c: $(COMMON) gl_enums.py +	$(PYTHON2) $(PYTHON_FLAGS) gl_enums.py > ../main/enums.c +  ../x86/glapi_x86.S: $(COMMON) gl_x86_asm.py  	$(PYTHON2) $(PYTHON_FLAGS) gl_x86_asm.py > ../x86/glapi_x86.S diff --git a/src/mesa/glapi/gl_XML.py b/src/mesa/glapi/gl_XML.py index b2e3cd4325..f096d3d953 100644 --- a/src/mesa/glapi/gl_XML.py +++ b/src/mesa/glapi/gl_XML.py @@ -503,6 +503,7 @@ class FilterGLAPISpecBase(saxutils.XMLFilterBase):  		self.factory = glItemFactory()  		self.header_tag = None  		self.undef_list = [] +		self.enums = []  	def find_type(self,type_name): @@ -587,6 +588,8 @@ class FilterGLAPISpecBase(saxutils.XMLFilterBase):  				self.xref[obj.name] = index  		elif object_type == "type":  			self.types[obj.name] = obj +		elif object_type == "enum": +			self.enums.append(obj)  		return diff --git a/src/mesa/glapi/gl_enums.py b/src/mesa/glapi/gl_enums.py new file mode 100644 index 0000000000..509afec381 --- /dev/null +++ b/src/mesa/glapi/gl_enums.py @@ -0,0 +1,183 @@ +#!/usr/bin/python2 +# -*- Mode: Python; py-indent-offset: 8 -*- + +# (C) Copyright Zack Rusin 2005 +# All Rights Reserved. +#  +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# on the rights to use, copy, modify, merge, publish, distribute, sub +# license, and/or sell copies of the Software, and to permit persons to whom +# the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL +# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. +# +# Authors: +#    Zack Rusin <zack@kde.org> + +from xml.sax import saxutils +from xml.sax import make_parser +from xml.sax.handler import feature_namespaces + +import license +import gl_XML +import sys, getopt + +class PrintGlEnums(gl_XML.FilterGLAPISpecBase): +	name = "gl_enums.py (from Mesa)" + +	def __init__(self): +		gl_XML.FilterGLAPISpecBase.__init__(self) +		self.license = license.bsd_license_template % ( \ +"""Copyright (C) 1999-2005 Brian Paul All Rights Reserved.""", "BRIAN PAUL") + + +	def printRealHeader(self): +		print '#include "glheader.h"' +		print '#include "enums.h"' +		print '#include "imports.h"' +		print '' +		print 'typedef struct {' +		print '   const char *c;' +		print '   int n;' +		print '} enum_elt;' +		print '' +		print 'static enum_elt all_enums[] =' +		print '{' +		return + +	def printRealFooter(self): +		print """ +}; + +#define Elements(x) sizeof(x)/sizeof(*x) + +typedef int (*cfunc)(const void *, const void *); + +static enum_elt **index1; +static int sorted; + +static int compar_name( const enum_elt *a, const enum_elt *b ) +{ +   return _mesa_strcmp(a->c, b->c); +} + + +/* note the extra level of indirection + */ +static int compar_nr( const enum_elt **a, const enum_elt **b ) +{ +   return (*a)->n - (*b)->n; +} + + +static void sort_enums( void ) +{ +   GLuint i; +   index1 = (enum_elt **)MALLOC( Elements(all_enums) * sizeof(enum_elt *) ); +   sorted = 1; + +   if (!index1) +      return;  /* what else can we do? */ + +   qsort( all_enums, Elements(all_enums), sizeof(*all_enums), +	  (cfunc) compar_name ); + +   for (i = 0 ; i < Elements(all_enums) ; i++) +      index1[i] = &all_enums[i]; + +   qsort( index1, Elements(all_enums), sizeof(*index1), (cfunc) compar_nr ); +} + + + +int _mesa_lookup_enum_by_name( const char *symbol ) +{ +   enum_elt tmp; +   enum_elt *e; + +   if (!sorted) +      sort_enums(); + +   if (!symbol) +      return 0; + +   tmp.c = symbol; +   e = (enum_elt *)bsearch( &tmp, all_enums, Elements(all_enums), +			    sizeof(*all_enums), (cfunc) compar_name ); + +   return e ? e->n : -1; +} + + +static char token_tmp[20]; + +const char *_mesa_lookup_enum_by_nr( int nr ) +{ +   enum_elt tmp, *e, **f; + +   if (!sorted) +      sort_enums(); + +   tmp.n = nr; +   e = &tmp; + +   f = (enum_elt **)bsearch( &e, index1, Elements(all_enums), +			     sizeof(*index1), (cfunc) compar_nr ); + +   if (f) { +      return (*f)->c; +   } +   else { +      /* this isn't re-entrant safe, no big deal here */ +      _mesa_sprintf(token_tmp, "0x%x", nr); +      return token_tmp; +   } +} +""" +		return + +	def printFunctions(self): +		for enum in self.enums: +			print '   { "%s", 0x%X },' % (enum.name, enum.value) +		return + + +def show_usage(): +	print "Usage: %s [-f input_file_name]" % sys.argv[0] +	sys.exit(1) + +if __name__ == '__main__': +	file_name = "gl_API.xml" +     +	try: +		(args, trail) = getopt.getopt(sys.argv[1:], "f:") +	except Exception,e: +		show_usage() + +	for (arg,val) in args: +		if arg == "-f": +			file_name = val + +	dh = PrintGlEnums() + +	parser = make_parser() +	parser.setFeature(feature_namespaces, 0) +	parser.setContentHandler(dh) + +	f = open(file_name) + +	dh.printHeader() +	parser.parse(f) +	dh.printFooter() | 
