import gl_XML
import sys, getopt
-class PrintGlEnums(gl_XML.FilterGLAPISpecBase):
+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 % ( \
def printRealHeader(self):
print '#include "glheader.h"'
+ print '#include "mfeatures.h"'
print '#include "enums.h"'
print '#include "imports.h"'
print ''
print ''
return
- def printBody(self):
+ def print_code(self):
print """
-#define Elements(x) sizeof(x)/sizeof(*x)
-
typedef int (*cfunc)(const void *, const void *);
/**
{
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 ];
}
}
+/* 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;
"""
return
- def printFunctions(self):
+
+ def printBody(self, api):
+ self.process_enums( api )
+
keys = self.enum_table.keys()
keys.sort()
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
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 ''
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.
-
- found_it = 0
- for [n, junk] in self.enum_table[ obj.value ]:
- if n == obj.name:
- found_it = 1
- break
-
- if not found_it:
-
- # 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():
if arg == "-f":
file_name = val
- dh = PrintGlEnums()
- gl_XML.parse_GL_API( dh, file_name )
+ api = gl_XML.parse_GL_API( file_name )
+
+ printer = PrintGlEnums()
+ printer.Print( api )