initial check-in
diff --git a/src/mesa/glapi/gltable.py b/src/mesa/glapi/gltable.py
new file mode 100644
index 0000000..06a9c8a
--- /dev/null
+++ b/src/mesa/glapi/gltable.py
@@ -0,0 +1,295 @@
+#!/usr/bin/env python
+
+# $Id: gltable.py,v 1.1 2000/02/22 22:45:20 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':
+				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
+	#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 */'
+	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()
\ No newline at end of file