-#!/usr/bin/python2
+#!/usr/bin/env python
-# (C) Copyright IBM Corporation 2004
+# (C) Copyright IBM Corporation 2004, 2005
# All Rights Reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# Authors:
# Ian Romanick <idr@us.ibm.com>
-from xml.sax import saxutils
-from xml.sax import make_parser
-from xml.sax.handler import feature_namespaces
-
import license
-import gl_XML
+import gl_XML, glX_XML
import sys, getopt
-class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
- name = "gl_procs.py (from Mesa)"
-
+class PrintGlProcs(gl_XML.gl_print_base):
def __init__(self, long_strings):
+ gl_XML.gl_print_base.__init__(self)
+
self.long_strings = long_strings
- gl_XML.FilterGLAPISpecBase.__init__(self)
+ self.name = "gl_procs.py (from Mesa)"
self.license = license.bsd_license_template % ( \
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
-(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
+(C) Copyright IBM Corporation 2004, 2006""", "BRIAN PAUL, IBM")
def printRealHeader(self):
- print '/* This file is only included by glapi.c and is used for'
- print ' * the GetProcAddress() function'
- print ' */'
- print ''
- print 'typedef struct {'
- print ' int Name_offset;'
- print '#ifdef NEED_FUNCTION_POINTER'
- print ' void * Address;'
- print '#endif'
- print ' unsigned int Offset;'
- print '} glprocs_table_t;'
- print ''
- print '#ifdef NEED_FUNCTION_POINTER'
- print '# define NAME_FUNC_OFFSET(n,f,o) { n , (void *) f , o }'
- print '#else'
- print '# define NAME_FUNC_OFFSET(n,f,o) { n , o }'
- print '#endif'
- print ''
+ print """
+/* This file is only included by glapi.c and is used for
+ * the GetProcAddress() function
+ */
+
+typedef struct {
+ GLint Name_offset;
+#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)
+ _glapi_proc Address;
+#endif
+ GLuint Offset;
+} glprocs_table_t;
+
+#if !defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , o }
+#elif defined(NEED_FUNCTION_POINTER) && !defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f1 , o }
+#elif defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f2 , o }
+#elif !defined(NEED_FUNCTION_POINTER) && defined(GLX_INDIRECT_RENDERING)
+# define NAME_FUNC_OFFSET(n,f1,f2,f3,o) { n , (_glapi_proc) f3 , o }
+#endif
+
+"""
return
def printRealFooter(self):
print '#undef NAME_FUNC_OFFSET'
return
- def printFunctionString(self, f):
+ def printFunctionString(self, name):
if self.long_strings:
- print ' "gl%s\\0"' % (f.name)
+ print ' "gl%s\\0"' % (name)
else:
print " 'g','l',",
- for c in f.name:
+ for c in name:
print "'%s'," % (c),
print "'\\0',"
- def printFunctionOffset(self, f, offset_of_name):
- print ' NAME_FUNC_OFFSET( % 5u, gl%s, _gloffset_%s ),' % (offset_of_name, f.name, f.real_name)
-
- def printFunctions(self):
+ def printBody(self, api):
print ''
if self.long_strings:
print 'static const char gl_string_table[] ='
else:
print 'static const char gl_string_table[] = {'
- keys = self.functions.keys()
- keys.sort()
- for k in keys:
- if k < 0: continue
- self.printFunctionString(self.functions[k])
+ base_offset = 0
+ table = []
+ for func in api.functionIterateByOffset():
+ name = func.dispatch_name()
+ self.printFunctionString(func.name)
+ table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name))
+
+ # The length of the function's name, plus 2 for "gl",
+ # plus 1 for the NUL.
+
+ base_offset += len(func.name) + 3
+
+
+ for func in api.functionIterateByOffset():
+ for n in func.entry_points:
+ if n != func.name:
+ name = func.dispatch_name()
+ self.printFunctionString( n )
+
+ if func.has_different_protocol(n):
+ alt_name = "gl" + func.static_glx_name(n)
+ table.append((base_offset, "gl" + name, alt_name, alt_name, func.name))
+ else:
+ table.append((base_offset, "gl" + name, "gl" + name, "NULL", func.name))
+
+ base_offset += len(n) + 3
- keys.reverse()
- for k in keys:
- if k >= -1: continue
- self.printFunctionString(self.functions[k])
if self.long_strings:
print ' ;'
print '};'
print ''
- print 'static const glprocs_table_t static_functions[] = {'
-
- keys = self.functions.keys()
- keys.sort()
- base_offset = 0
- for k in keys:
- if k < 0: continue
- self.printFunctionOffset(self.functions[k], base_offset)
-
- # The length of the function's name, plus 2 for "gl",
- # plus 1 for the NUL.
-
- base_offset += len(self.functions[k].name) + 3
+ print ''
+ print "#ifdef USE_MGL_NAMESPACE"
+ for func in api.functionIterateByOffset():
+ for n in func.entry_points:
+ if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)):
+ print '#define gl_dispatch_stub_%u mgl_dispatch_stub_%u' % (func.offset, func.offset)
+ break
+ print "#endif /* USE_MGL_NAMESPACE */"
+ print ''
+ print ''
+ print '#if defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING)'
+ for func in api.functionIterateByOffset():
+ for n in func.entry_points:
+ if (not func.is_static_entry_point(func.name)) or (func.has_different_protocol(n) and not func.is_static_entry_point(n)):
+ print '%s GLAPIENTRY gl_dispatch_stub_%u(%s);' % (func.return_type, func.offset, func.get_parameter_string())
+ break
- keys.reverse()
- for k in keys:
- if k >= -1: continue
- self.printFunctionOffset(self.functions[k], base_offset)
+ print '#endif /* defined(NEED_FUNCTION_POINTER) || defined(GLX_INDIRECT_RENDERING) */'
- # The length of the function's name, plus 2 for "gl",
- # plus 1 for the NUL.
+ print ''
+ print 'static const glprocs_table_t static_functions[] = {'
- base_offset += len(self.functions[k].name) + 3
+ for info in table:
+ print ' NAME_FUNC_OFFSET(%5u, %s, %s, %s, _gloffset_%s),' % info
- print ' NAME_FUNC_OFFSET( -1, NULL, -1 )'
+ print ' NAME_FUNC_OFFSET(-1, NULL, NULL, NULL, 0)'
print '};'
return
def show_usage():
print "Usage: %s [-f input_file_name] [-m mode]" % sys.argv[0]
print "mode can be one of:"
- print " long - Create code for compilers that can handle very "
+ print " long - Create code for compilers that can handle very"
print " long string constants. (default)"
- print " short - Create code for compilers that can only handle "
+ print " short - Create code for compilers that can only handle"
print " ANSI C89 string constants."
sys.exit(1)
if __name__ == '__main__':
file_name = "gl_API.xml"
-
+
try:
(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
except Exception,e:
else:
show_usage()
- dh = PrintGlProcs( long_string )
-
- parser = make_parser()
- parser.setFeature(feature_namespaces, 0)
- parser.setContentHandler(dh)
-
- f = open(file_name)
-
- dh.printHeader()
- parser.parse(f)
- dh.printFooter()
+ api = gl_XML.parse_GL_API(file_name, glX_XML.glx_item_factory())
+ printer = PrintGlProcs(long_string)
+ printer.Print(api)