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:
parent
c1d455f582
commit
7867799c72
|
@ -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)
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue