From 78123bb38b1e4638747f55ddaef39e561cd81d6e Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 22 Feb 2005 15:39:46 +0000 Subject: [PATCH] generate enums.c file (Zack Rusin) --- src/mesa/glapi/Makefile | 4 + src/mesa/glapi/gl_XML.py | 3 + src/mesa/glapi/gl_enums.py | 183 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 src/mesa/glapi/gl_enums.py diff --git a/src/mesa/glapi/Makefile b/src/mesa/glapi/Makefile index 9fad47e..96fdacb 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 b2e3cd4..f096d3d 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 0000000..509afec --- /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 + +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() -- 2.7.4