Merge branch 'mesa_7_6_branch'
[mesa.git] / src / mesa / glapi / gl_enums.py
index 2237b7d148a5368aafcef39a211114e27d6a9452..27ab119537ec3dc9a8f81ab5a69de6614d388caf 100644 (file)
 # 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)"
+class PrintGlEnums(gl_XML.gl_print_base):
 
        def __init__(self):
-               gl_XML.FilterGLAPISpecBase.__init__(self)
+               gl_XML.gl_print_base.__init__(self)
+
+               self.name = "gl_enums.py (from Mesa)"
                self.license = license.bsd_license_template % ( \
 """Copyright (C) 1999-2005 Brian Paul All Rights Reserved.""", "BRIAN PAUL")
                self.enum_table = {}
@@ -46,6 +43,7 @@ class PrintGlEnums(gl_XML.FilterGLAPISpecBase):
 
        def printRealHeader(self):
                print '#include "glheader.h"'
+               print '#include "mfeatures.h"'
                print '#include "enums.h"'
                print '#include "imports.h"'
                print ''
@@ -56,10 +54,8 @@ class PrintGlEnums(gl_XML.FilterGLAPISpecBase):
                print ''
                return
 
-       def printBody(self):
+       def print_code(self):
                print """
-#define Elements(x) sizeof(x)/sizeof(*x)
-
 typedef int (*cfunc)(const void *, const void *);
 
 /**
@@ -99,8 +95,10 @@ const char *_mesa_lookup_enum_by_nr( int nr )
 {
    unsigned * i;
 
-   i = (unsigned *)bsearch( & nr, reduced_enums, Elements(reduced_enums),
-                            sizeof(reduced_enums[0]), (cfunc) compar_nr );
+   i = (unsigned *) _mesa_bsearch(& nr, reduced_enums,
+                                  Elements(reduced_enums),
+                                  sizeof(reduced_enums[0]),
+                                  (cfunc) compar_nr);
 
    if ( i != NULL ) {
       return & enum_string_table[ all_enums[ *i ].offset ];
@@ -112,13 +110,38 @@ const char *_mesa_lookup_enum_by_nr( int nr )
    }
 }
 
+/* Get the name of an enum given that it is a primitive type.  Avoids
+ * GL_FALSE/GL_POINTS ambiguity and others.
+ */
+const char *_mesa_lookup_prim_by_nr( int nr )
+{
+   switch (nr) {
+   case GL_POINTS: return "GL_POINTS";
+   case GL_LINES: return "GL_LINES";
+   case GL_LINE_STRIP: return "GL_LINE_STRIP";
+   case GL_LINE_LOOP: return "GL_LINE_LOOP";
+   case GL_TRIANGLES: return "GL_TRIANGLES";
+   case GL_TRIANGLE_STRIP: return "GL_TRIANGLE_STRIP";
+   case GL_TRIANGLE_FAN: return "GL_TRIANGLE_FAN";
+   case GL_QUADS: return "GL_QUADS";
+   case GL_QUAD_STRIP: return "GL_QUAD_STRIP";
+   case GL_POLYGON: return "GL_POLYGON";
+   case GL_POLYGON+1: return "OUTSIDE_BEGIN_END";
+   default: return "<invalid>";
+   }
+}
+
+
+
 int _mesa_lookup_enum_by_name( const char *symbol )
 {
    enum_elt * f = NULL;
 
    if ( symbol != NULL ) {
-      f = (enum_elt *)bsearch( symbol, all_enums, Elements(all_enums),
-                              sizeof( enum_elt ), (cfunc) compar_name );
+      f = (enum_elt *) _mesa_bsearch(symbol, all_enums,
+                                     Elements(all_enums),
+                                     sizeof( enum_elt ),
+                                     (cfunc) compar_name);
    }
 
    return (f != NULL) ? f->n : -1;
@@ -127,7 +150,10 @@ int _mesa_lookup_enum_by_name( const char *symbol )
 """
                return
 
-       def printFunctions(self):
+
+       def printBody(self, api):
+               self.process_enums( api )
+
                keys = self.enum_table.keys()
                keys.sort()
 
@@ -148,7 +174,7 @@ int _mesa_lookup_enum_by_name( const char *symbol )
 
                string_offsets = {}
                i = 0;
-               print 'static const char enum_string_table[] = '
+               print 'LONGSTRING static const char enum_string_table[] = '
                for [name, enum] in name_table:
                        print '   "%s\\0"' % (name)
                        string_offsets[ name ] = i
@@ -161,7 +187,7 @@ int _mesa_lookup_enum_by_name( const char *symbol )
                print 'static const enum_elt all_enums[%u] =' % (len(name_table))
                print '{'
                for [name, enum] in name_table:
-                       print '   { % 5u, 0x%08X }, /* %s */' % (string_offsets[name], enum, name)
+                       print '   { %5u, 0x%08X }, /* %s */' % (string_offsets[name], enum, name)
                print '};'
                print ''
 
@@ -174,48 +200,25 @@ int _mesa_lookup_enum_by_name( const char *symbol )
                        else:
                                i = name_table.index( [name, enum] )
 
-                               print '      % 4u, /* %s */' % (i, name)
+                               print '      %4u, /* %s */' % (i, name)
                print '};'
 
 
-               self.printBody();
+               self.print_code()
                return
 
 
-       def append(self, object_type, obj):
-               if object_type == "enum":
+       def process_enums(self, api):
+               self.enum_table = {}
+               
+               for obj in api.enumIterateByName():
                        if obj.value not in self.enum_table:
                                self.enum_table[ obj.value ] = []
 
 
-                       # Prevent duplicate names in the enum table.
-
-                       if obj.name not in self.enum_table[ obj.value ]:
-
-                               # Calculate a "priority" for this enum name.
-                               # When we lookup an enum by number, there may
-                               # be many possible names, but only one can be
-                               # returned.  The priority is used by this
-                               # script to select which name is the "best".
-                               #
-                               # Highest precedence is given to "core" name.
-                               # ARB extension names have the next highest,
-                               # followed by EXT extension names.  Vendor
-                               # extension names are the lowest.
-
-                               if obj.category.startswith( "GL_VERSION_" ):
-                                       priority = 0
-                               elif obj.category.startswith( "GL_ARB_" ):
-                                       priority = 1
-                               elif obj.category.startswith( "GL_EXT_" ):
-                                       priority = 2
-                               else:
-                                       priority = 3
-
-                               self.enum_table[ obj.value ].append( [obj.name, priority] )
-
-               else:
-                       gl_XML.FilterGLAPISpecBase.append(self, object_type, obj)
+                       name = "GL_" + obj.name
+                       priority = obj.priority()
+                       self.enum_table[ obj.value ].append( [name, priority] )
 
 
 def show_usage():
@@ -234,14 +237,7 @@ if __name__ == '__main__':
                if arg == "-f":
                        file_name = val
 
-       dh = PrintGlEnums()
-
-       parser = make_parser()
-       parser.setFeature(feature_namespaces, 0)
-       parser.setContentHandler(dh)
-
-       f = open(file_name)
+       api = gl_XML.parse_GL_API( file_name )
 
-       dh.printHeader()
-       parser.parse(f)
-       dh.printFooter()
+       printer = PrintGlEnums()
+       printer.Print( api )