Modify glprocs.h to have two tables instead of one. The first table
is just a huge string will all the function names in it. The second table contains offsets into the first table instead of pointers to strings.
This commit is contained in:
@@ -36,48 +36,137 @@ import sys, getopt
|
|||||||
class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
|
class PrintGlProcs(gl_XML.FilterGLAPISpecBase):
|
||||||
name = "gl_procs.py (from Mesa)"
|
name = "gl_procs.py (from Mesa)"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, long_strings):
|
||||||
|
self.long_strings = long_strings
|
||||||
gl_XML.FilterGLAPISpecBase.__init__(self)
|
gl_XML.FilterGLAPISpecBase.__init__(self)
|
||||||
self.license = license.bsd_license_template % ( \
|
self.license = license.bsd_license_template % ( \
|
||||||
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
||||||
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
|
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
|
||||||
|
|
||||||
|
|
||||||
def printRealHeader(self):
|
def printRealHeader(self):
|
||||||
print ''
|
|
||||||
print '/* This file is only included by glapi.c and is used for'
|
print '/* This file is only included by glapi.c and is used for'
|
||||||
print ' * the GetProcAddress() function'
|
print ' * the GetProcAddress() function'
|
||||||
print ' */'
|
print ' */'
|
||||||
print ''
|
print ''
|
||||||
print 'static const struct name_address_offset static_functions[] = {'
|
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 ''
|
||||||
return
|
return
|
||||||
|
|
||||||
def printRealFooter(self):
|
def printRealFooter(self):
|
||||||
print ' { NULL, NULL, 0 } /* end of list marker */'
|
print ''
|
||||||
|
print '#undef NAME_FUNC_OFFSET'
|
||||||
|
return
|
||||||
|
|
||||||
|
def printFunctionString(self, f):
|
||||||
|
if self.long_strings:
|
||||||
|
print ' "gl%s\\0"' % (f.name)
|
||||||
|
else:
|
||||||
|
print " 'g','l',",
|
||||||
|
for c in f.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):
|
||||||
|
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])
|
||||||
|
|
||||||
|
keys.reverse()
|
||||||
|
for k in keys:
|
||||||
|
if k >= -1: continue
|
||||||
|
self.printFunctionString(self.functions[k])
|
||||||
|
|
||||||
|
if self.long_strings:
|
||||||
|
print ' ;'
|
||||||
|
else:
|
||||||
|
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
|
||||||
|
|
||||||
|
keys.reverse()
|
||||||
|
for k in keys:
|
||||||
|
if k >= -1: 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 ' NAME_FUNC_OFFSET( -1, NULL, -1 )'
|
||||||
print '};'
|
print '};'
|
||||||
return
|
return
|
||||||
|
|
||||||
def printFunction(self, f):
|
|
||||||
print ' { "gl%s", (GLvoid *) gl%s, _gloffset_%s },' \
|
|
||||||
% (f.name, f.name, f.real_name)
|
|
||||||
|
|
||||||
|
|
||||||
def show_usage():
|
def show_usage():
|
||||||
print "Usage: %s [-f input_file_name]" % sys.argv[0]
|
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 string constants. (default)"
|
||||||
|
print " short - Create code for compilers that can only handle "
|
||||||
|
print " ANSI C89 string constants."
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
file_name = "gl_API.xml"
|
file_name = "gl_API.xml"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
(args, trail) = getopt.getopt(sys.argv[1:], "f:")
|
(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
|
||||||
except Exception,e:
|
except Exception,e:
|
||||||
show_usage()
|
show_usage()
|
||||||
|
|
||||||
|
long_string = 1
|
||||||
for (arg,val) in args:
|
for (arg,val) in args:
|
||||||
if arg == "-f":
|
if arg == "-f":
|
||||||
file_name = val
|
file_name = val
|
||||||
|
elif arg == "-m":
|
||||||
|
if val == "short":
|
||||||
|
long_string = 0
|
||||||
|
elif val == "long":
|
||||||
|
long_string = 1
|
||||||
|
else:
|
||||||
|
show_usage()
|
||||||
|
|
||||||
dh = PrintGlProcs()
|
dh = PrintGlProcs( long_string )
|
||||||
|
|
||||||
parser = make_parser()
|
parser = make_parser()
|
||||||
parser.setFeature(feature_namespaces, 0)
|
parser.setFeature(feature_namespaces, 0)
|
||||||
|
@@ -446,10 +446,28 @@ struct name_address_offset {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define NEED_FUNCTION_POINTER
|
||||||
|
|
||||||
/* The code in this file is auto-generated with Python */
|
/* The code in this file is auto-generated with Python */
|
||||||
#include "glprocs.h"
|
#include "glprocs.h"
|
||||||
|
|
||||||
|
|
||||||
|
static const glprocs_table_t *
|
||||||
|
find_entry( const char * n )
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for ( i = 0 ; static_functions[i].Name_offset >= 0 ; i++ ) {
|
||||||
|
const char * test_name;
|
||||||
|
|
||||||
|
test_name = gl_string_table + static_functions[i].Name_offset;
|
||||||
|
if (strcmp(test_name, n) == 0) {
|
||||||
|
return & static_functions[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return dispatch table offset of the named static (built-in) function.
|
* Return dispatch table offset of the named static (built-in) function.
|
||||||
@@ -458,11 +476,10 @@ struct name_address_offset {
|
|||||||
static GLint
|
static GLint
|
||||||
get_static_proc_offset(const char *funcName)
|
get_static_proc_offset(const char *funcName)
|
||||||
{
|
{
|
||||||
GLuint i;
|
const glprocs_table_t * const f = find_entry( funcName );
|
||||||
for (i = 0; static_functions[i].Name; i++) {
|
|
||||||
if (strcmp(static_functions[i].Name, funcName) == 0) {
|
if ( f != NULL ) {
|
||||||
return static_functions[i].Offset;
|
return f->Offset;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -472,13 +489,22 @@ get_static_proc_offset(const char *funcName)
|
|||||||
* Return dispatch function address the named static (built-in) function.
|
* Return dispatch function address the named static (built-in) function.
|
||||||
* Return NULL if function not found.
|
* Return NULL if function not found.
|
||||||
*/
|
*/
|
||||||
static GLvoid *
|
static const GLvoid *
|
||||||
get_static_proc_address(const char *funcName)
|
get_static_proc_address(const char *funcName)
|
||||||
{
|
{
|
||||||
GLint i;
|
const glprocs_table_t * const f = find_entry( funcName );
|
||||||
for (i = 0; static_functions[i].Name; i++) {
|
return ( f != NULL ) ? f->Address : NULL;
|
||||||
if (strcmp(static_functions[i].Name, funcName) == 0) {
|
}
|
||||||
return static_functions[i].Address;
|
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_static_proc_name( GLuint offset )
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for ( i = 0 ; static_functions[i].Name_offset >= 0 ; i++ ) {
|
||||||
|
if (static_functions[i].Offset == offset) {
|
||||||
|
return gl_string_table + static_functions[i].Name_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -802,13 +828,13 @@ _glapi_get_proc_address(const char *funcName)
|
|||||||
const char *
|
const char *
|
||||||
_glapi_get_proc_name(GLuint offset)
|
_glapi_get_proc_name(GLuint offset)
|
||||||
{
|
{
|
||||||
const GLuint n = sizeof(static_functions) / sizeof(struct name_address_offset);
|
|
||||||
GLuint i;
|
GLuint i;
|
||||||
|
const char * n;
|
||||||
|
|
||||||
/* search built-in functions */
|
/* search built-in functions */
|
||||||
for (i = 0; i < n; i++) {
|
n = get_static_proc_name(offset);
|
||||||
if (static_functions[i].Offset == offset)
|
if ( n != NULL ) {
|
||||||
return static_functions[i].Name;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* search added extension functions */
|
/* search added extension functions */
|
||||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user