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):
name = "gl_procs.py (from Mesa)"
def __init__(self):
def __init__(self, long_strings):
self.long_strings = long_strings
gl_XML.FilterGLAPISpecBase.__init__(self)
self.license = license.bsd_license_template % ( \
"""Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
(C) Copyright IBM Corporation 2004""", "BRIAN PAUL, IBM")
def printRealHeader(self):
print ''
print '/* This file is only included by glapi.c and is used for'
print ' * the GetProcAddress() function'
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
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 '};'
return
def printFunction(self, f):
print ' { "gl%s", (GLvoid *) gl%s, _gloffset_%s },' \
% (f.name, f.name, f.real_name)
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)
if __name__ == '__main__':
file_name = "gl_API.xml"
try:
(args, trail) = getopt.getopt(sys.argv[1:], "f:")
(args, trail) = getopt.getopt(sys.argv[1:], "f:m:")
except Exception,e:
show_usage()
long_string = 1
for (arg,val) in args:
if arg == "-f":
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.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 */
#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.
@ -458,11 +476,10 @@ struct name_address_offset {
static GLint
get_static_proc_offset(const char *funcName)
{
GLuint i;
for (i = 0; static_functions[i].Name; i++) {
if (strcmp(static_functions[i].Name, funcName) == 0) {
return static_functions[i].Offset;
}
const glprocs_table_t * const f = find_entry( funcName );
if ( f != NULL ) {
return f->Offset;
}
return -1;
}
@ -472,13 +489,22 @@ get_static_proc_offset(const char *funcName)
* Return dispatch function address the named static (built-in) function.
* Return NULL if function not found.
*/
static GLvoid *
static const GLvoid *
get_static_proc_address(const char *funcName)
{
GLint i;
for (i = 0; static_functions[i].Name; i++) {
if (strcmp(static_functions[i].Name, funcName) == 0) {
return static_functions[i].Address;
const glprocs_table_t * const f = find_entry( funcName );
return ( f != NULL ) ? f->Address : NULL;
}
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;
@ -802,13 +828,13 @@ _glapi_get_proc_address(const char *funcName)
const char *
_glapi_get_proc_name(GLuint offset)
{
const GLuint n = sizeof(static_functions) / sizeof(struct name_address_offset);
GLuint i;
const char * n;
/* search built-in functions */
for (i = 0; i < n; i++) {
if (static_functions[i].Offset == offset)
return static_functions[i].Name;
n = get_static_proc_name(offset);
if ( n != NULL ) {
return n;
}
/* search added extension functions */

File diff suppressed because it is too large Load Diff