blob: 8f48366ba7f19307aa57e0fc2c7d51db6bb83bd4 [file] [log] [blame]
#!/usr/bin/env python
# $Id: gltable.py,v 1.2 2000/05/11 17:44:42 brianp Exp $
# Mesa 3-D graphics library
# Version: 3.3
#
# Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# Generate the glapitable.h file.
#
# Usage:
# gltable.py >glapitable.h
#
# Dependencies:
# The gl.spec file from the SI must be in the current directory.
#
# Brian Paul 3 February 2000
import string
import re
#
# This table maps types from the gl.spec file to the OpenGL C types.
#
TypeTable = {
'AttribMask' : 'GLbitfield',
'Boolean' : 'GLboolean',
'CheckedFloat32' : 'GLfloat',
'CheckedInt32' : 'GLint',
'ClampedColorF' : 'GLclampf',
'ClampedFloat32' : 'GLclampf',
'ClampedFloat64' : 'GLclampd',
'ClampedStencilValue' : 'GLint',
'ClearBufferMask' : 'GLbitfield',
'ClientAttribMask' : 'GLbitfield',
'ColorB' : 'GLbyte',
'ColorD' : 'GLdouble',
'ColorF' : 'GLfloat',
'ColorI' : 'GLint',
'ColorIndexValueD' : 'GLdouble',
'ColorIndexValueF' : 'GLfloat',
'ColorIndexValueI' : 'GLint',
'ColorIndexValueS' : 'GLshort',
'ColorIndexValueUB' : 'GLubyte',
'ColorS' : 'GLshort',
'ColorUB' : 'GLubyte',
'ColorUI' : 'GLuint',
'ColorUS' : 'GLushort',
'CoordF' : 'GLfloat',
'CoordD' : 'GLdouble',
'CoordI' : 'GLint',
'CoordS' : 'GLshort',
'FeedbackElement' : 'GLfloat',
'Float32' : 'GLfloat',
'Float64' : 'GLdouble',
'Float32Pointer' : 'GLfloat',
'Float64Pointer' : 'GLdouble',
'Int8' : 'GLbyte',
'Int16' : 'GLshort',
'Int32' : 'GLint',
'LineStipple' : 'GLushort',
'List' : 'GLuint',
'MaskedColorIndexValueF' : 'GLfloat',
'MaskedColorIndexValueI' : 'GLuint',
'MaskedStencilValue' : 'GLuint',
'PixelInternalFormat' : 'GLenum',
'SelectName' : 'GLuint',
'SizeI' : 'GLsizei',
'StencilValue' : 'GLint',
'String' : 'const GLubyte *',
'TexelInternalFormat' : 'GLint',
'TextureComponentCount' : 'GLint',
'WinCoord' : 'GLint',
'UInt8' : 'GLubyte',
'UInt16' : 'GLushort',
'UInt32' : 'GLuint',
'Void' : 'GLvoid',
'VoidPointer' : 'GLvoid *',
'void' : 'void',
}
#
# Return C-style argument type string.
# Input: t = a type like ListMode, Int16, CoordF, etc.
# pointerQual = '' or '*'
# constQual = '' or 'const '
# Return: a string like "const GLubyte *'
#
def ActualType(t, pointerQual, constQual):
if TypeTable.has_key(t):
type = TypeTable[t]
else:
type = 'GLenum'
if pointerQual == '':
s = constQual + type
else:
s = constQual + type + ' ' + pointerQual
return s
#enddef
#
# Convert a Python list of arguments into a string.
#
def ArgListToString(argList):
result = ''
i = 1
n = len(argList)
for pair in argList:
result = result + pair[0] + ' ' + pair[1]
if i < n:
result = result + ', '
i = i + 1
if result == '':
result = 'void'
return result
#enddef
#
# Return a dispatch table entry, like "void (*Enable)(GLenum cap);"
#
def MakeTableEntry(retType, funcName, argList, offset):
s = ' '
s = s + ActualType(retType, '', '')
s = s + ' (*'
s = s + funcName
s = s + ')('
s = s + ArgListToString(argList)
s = s + '); /* '
s = s + str(offset)
s = s + ' */'
return s
#enddef
def GroupFromCategory(category):
baseCats = [
'display-list',
'drawing',
'drawing-control',
'feedback',
'framebuf',
'misc',
'modeling',
'pixel-op',
'pixel-rw',
'state-req',
'xform'
]
if baseCats.count(category) > 0:
return 'GL_1_0'
else:
return 'GL_' + category
#endif
#endif
def PrintGroup(group):
s = ' /* '
s = s + group
s = s + ' */'
print s
#enddef
#
# Parse gl.spec to generate all the function pointers in the dispatch struct.
#
def PrintTableEntries():
functionPattern = re.compile('^[a-zA-Z0-9]+\(')
functionNamePattern = re.compile('^[a-zA-Z0-9]+')
prevGroup = ''
funcName = ''
returnType = ''
argList = [ ]
maxOffset = 0
table = { }
f = open('gl.spec')
for line in f.readlines():
m = functionPattern.match(line)
if m:
# extract funcName
n = functionNamePattern.findall(line)
funcName = n[0]
argList = [ ]
#endif
m = string.split(line)
if len(m) > 1:
# return datatype
if m[0] == 'return':
returnType = m[1]
#endif
# function parameter
if m[0] == 'param':
constQual = ''
pointerQual = ''
if len(m) >= 5 and m[4] == 'array':
pointerQual = '*'
if m[3] == 'in':
constQual = 'const '
paramName = m[1]
paramType = ActualType(m[2], pointerQual, constQual)
argList.append( (paramType, paramName) )
#endif
# # category
if m[0] == 'category':
category = m[1]
group = GroupFromCategory(category)
if group != prevGroup:
# PrintGroup(group)
prevGroup = group
#endif
# end of function spec
if m[0] == 'offset':
if m[1] == '?':
#print 'WARNING: skipping', funcName
noop = 0
else:
funcOffset = int(m[1])
if funcOffset > maxOffset:
maxOffset = funcOffset
#PrintProto(returnType, funcName, argList)
s = MakeTableEntry(returnType, funcName, argList, funcOffset)
# print s
table[funcOffset] = s;
#endif
#endif
#endif
#endfor
# Now dump the table, this effectively does the sort by offset number
for i in range(0, maxOffset + 1):
if table.has_key(i):
print table[i]
#enddef
def PrintHead():
print '/* DO NOT EDIT - This file generated automatically with gltable.py script */'
print '#ifndef _GLAPI_TABLE_H_'
print '#define _GLAPI_TABLE_H_'
print ''
print '#include <GL/gl.h>'
print ''
print 'struct _glapi_table'
print '{'
return
#endif
def PrintTail():
print '};'
print ''
print '#endif'
#endif
PrintHead()
PrintTableEntries()
PrintTail()