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:
Ian Romanick
2004-05-27 00:05:13 +00:00
parent c1d455f582
commit 7867799c72
3 changed files with 2023 additions and 944 deletions

View File

@@ -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)

View File

@@ -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