#!/usr/bin/perl -w
use strict;

# This script is called thus :
#
#   make_opengl path_to_spec_file opengl_version
#
#     - path_to_spec_file is the path to the directory where the OpenGL
#       spec files are located. These files are hosted in the OpenGL
#       extension registry at opengl.org:
#       http://www.opengl.org/registry/api/gl.spec
#       http://www.opengl.org/registry/api/gl.tm
#
#       The files used to be hosted and maintained by SGI. You can still find
#       find them in the sample implementation CVS tree which is located at
#       CVS_ROOT/projects/ogl-sample/main/doc/registry/specs.
#       You can also find them on the web at the following URL :
#         http://oss.sgi.com/cgi-bin/cvsweb.cgi/projects/ogl-sample/main/doc/registry/specs/
#
#     - opengl_version is the OpenGL version emulated by the library
#       (can be 1.0 to 1.5).
#
# This script generates the three following files :
#
#     - opengl32.spec : the spec file giving all the exported functions
#       of the OpenGL32.DLL library. These functions are the one an
#       application can directly link to (and are all the functions
#       defined in the OpenGL core for the version defined by
#       'opengl_version').
#
#     - opengl_norm.c : this file contains the thunks for all OpenGL
#       functions that are defined in 'opengl32.spec'. The corresponding
#       functions NEED to be defined in Linux's libGL or the library
#       won't be able to be linked in.
#
#     - opengl_ext.c : in this file are stored thunks for ALL possible
#       OpenGL extensions (at least, all the extensions that are defined
#       in the OpenGL extension registry). Contrary to 'opengl_norm.c',
#       you do not need to have these extensions in your libGL to have
#       OpenGL work (as they are resolved at run-time using
#       glXGetProcAddressARB).
#
# Copyright 2000 Lionel Ulmer
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#

#
# Files to generate
#
my $spec_file = "opengl32.spec";
my $norm_file = "opengl_norm.c";
my $ext_file  = "opengl_ext.c";

# Set to 0 for removing the ENTER / LEAVE GL calls
my $gen_thread_safe = 1;
# Prefix used for the local variables
my $ext_prefix = "func_";
# If set to 1, generate TRACEs for each OpenGL function
my $gen_traces = 1;

#
# List of categories to put in the 'opengl_norm.c' file
#
my %cat_1_0 = ( "display-list" => 1,
	     "drawing" => 1,
	     "drawing-control" => 1,
	     "feedback" => 1,
	     "framebuf" => 1,
	     "misc" => 1,
	     "modeling" => 1,
	     "pixel-op" => 1,
	     "pixel-rw" => 1,
	     "state-req" => 1,
	     "xform" => 1 );
my %cat_1_1 = ( %cat_1_0,
	     "1_1" => 1 );
my %cat_1_2 = ( %cat_1_1,
	     "VERSION_1_2" => 1 );
my %cat_1_3 = ( %cat_1_2,
	     "VERSION_1_3" => 1 );
my %cat_1_4 = ( %cat_1_3,
	     "VERSION_1_4" => 1 );
my %cat_1_5 = ( %cat_1_4,
	     "VERSION_1_5" => 1 );

my %norm_categories = ();

#
# This hash table gives the conversion between OpenGL types and what
# is used by the TRACE printfs
#
my %debug_conv =
    ("GLbitfield" => "%d",
     "GLboolean" => "%d",
     "GLbyte" => "%d",
     "GLclampd" => "%f",
     "GLclampf" => "%f",
     "GLdouble" => "%f",
     "GLenum" => "%d",
     "GLfloat" => "%f",
     "GLint" => "%d",
     "GLshort" => "%d",
     "GLsizei" => "%d",
     "GLstring" => "%s",
     "GLubyte" => "%d",
     "GLuint" => "%d",
     "GLushort" => "%d",
     "GLhalfNV" => "%d",
     "GLintptrARB" => "%d",
     "GLsizeiptrARB" => "%d",
     "GLintptr" => "%d",
     "GLsizeiptr" => "%d",
     "GLhandleARB" => "%d",
     "GLcharARB" => "%c",
     "GLvoid" => "(void)",
     "_GLfuncptr" => "%p");

#
# This hash table gives the conversion between OpenGL types and what
# is used in the .spec file
#
my %arg_conv =
    ("GLbitfield" => [ "long", 4 ],
     "GLboolean" => [ "long", 4 ],
     "GLbyte" => [ "long", 4 ],
     "GLclampd" => [ "double", 8 ],
     "GLclampf" => [ "long", 4 ],
     "GLdouble" => [ "double", 8 ],
     "GLenum" => [ "long", 4 ],
     "GLfloat" => [ "long", 4 ],
     "GLint" => [ "long", 4 ],
     "GLshort" => [ "long", 4 ],
     "GLsizei" => [ "long", 4 ],
     "GLstring" => [ "str", 4 ],
     "GLubyte" => [ "long", 4 ],
     "GLuint" => [ "long", 4 ],
     "GLushort" => [ "long", 4 ],
     "GLhalfNV" => [ "long", 4 ],
     "GLintptrARB" => [ "long", 4 ],
     "GLsizeiptrARB" => [ "long", 4 ],
     "GLhandleARB" => [ "long", 4 ],
     "GLcharARB" => [ "long", 4 ],
     "GLintptr" => [ "long", 4 ],
     "GLsizeiptr" => [ "long", 4 ],
     "GLvoid" => [ "void", 4 ],
     "_GLfuncptr" => [ "ptr", 4 ]);

#
# Used to convert some types
#
sub ConvertType($)
{
    my ($type) = @_;

    my %hash = ( "GLstring" => "const GLubyte *",
	      "GLintptrARB" => "ptrdiff_t",
	      "GLsizeiptrARB" => "ptrdiff_t",
	      "GLintptr" => "ptrdiff_t",
	      "GLsizeiptr" => "ptrdiff_t",
	      "GLhandleARB" => "unsigned int",
	      "GLcharARB" => "char",
	      "GLchar" => "char",
	      "GLhalfNV" => "unsigned short" );

    foreach my $org (reverse sort keys %hash) {
	if ($type =~ /$org/) {
	    my ($before, $after) = ($type =~ /^(.*)$org(.*)$/);
	    return "$before$hash{$org}$after";
	}
    }
    return $type;
}

#
# Used to convert some variable names
#
sub ConvertVarName($)
{
    my ($type) = @_;

    my %hash = ( "near" => "nearParam",
                 "far"  => "farParam" );

    foreach my $org (keys %hash) {
	if ($type =~ /$org/) {
	    my ($before, $after) = ($type =~ /^(.*)$org(.*)$/);
	    return "$before$hash{$org}$after";
	}
    }
    return $type;
}

#
# This functions generates the thunk for a given function.
#
sub GenerateThunk($$$$$)
{
    my ($func_ref, $comment, $prefix, $thread_safe, $local_var) = @_;
    my $ret = "";
    my $call_arg = "";
    my $trace_arg = "";

    return "" if $func_ref->[0] eq "glGetString";
    return "" if $func_ref->[0] eq "glGetIntegerv";
    return "" if $func_ref->[0] eq "glEnable";
    return "" if $func_ref->[0] eq "glIsEnabled";
    return "" if $func_ref->[0] eq "glDisable";
    return "" if $func_ref->[0] eq "glScissor";
    return "" if $func_ref->[0] eq "glViewport";
    return "" if $func_ref->[0] eq "glFinish";
    return "" if $func_ref->[0] eq "glFlush";

    # If for opengl_norm.c, generate a nice heading otherwise Patrik won't be happy :-)
    # Patrik says: Well I would be even happier if a (OPENGL32.@) was added as well. Done. :-)
    if ($comment eq 1) {
	$ret = "$ret/***********************************************************************\n";
	$ret = "$ret *              $func_ref->[0] (OPENGL32.\@)\n";
	$ret = "$ret */\n";
    }
    $ret = $ret . ConvertType($func_ref->[1]) . " WINAPI wine_$func_ref->[0]( ";
    for (my $i = 0; $i <= $#{@{$func_ref->[2]}}; $i++) {
	## Quick debug code :-)
	## print $func_ref->[2]->[$i]->[1] . "\n";
	my $type = $func_ref->[2]->[$i]->[0];
	my $name = ConvertVarName($func_ref->[2]->[$i]->[1]);
	$ret = $ret . ConvertType($type) . " $name";
	$call_arg = "$call_arg$name";
	if ($type =~ /\*/) {
	    $trace_arg = "$trace_arg\%p";
	} else {
	    $trace_arg = "$trace_arg$debug_conv{$type}";
	}
	if ($i != $#{@{$func_ref->[2]}}) {
	    $ret = "$ret, ";
	    $call_arg = "$call_arg, ";
	    $trace_arg = "$trace_arg, ";
	} else {
	    $ret = "$ret ";
	    $call_arg = "$call_arg ";
	}
    }
    $ret .= 'void ' if ($#{@{$func_ref->[2]}} < 0);
    $ret = "$ret) {\n";
    if ($func_ref->[1] ne "void") {
	$ret = "$ret  " . ConvertType($func_ref->[1]) . " ret_value;\n";
    }
    $ret .= $local_var;
    if ($gen_traces) {
	$ret = "$ret  TRACE(\"($trace_arg)\\n\"";
	if ($trace_arg ne "") {
	    $ret = "$ret, $call_arg";
	}
	$ret = "$ret);\n";
    }
    if ($thread_safe) {
	$ret = "$ret  ENTER_GL();\n";
    }
    $ret = "$ret  ";
    if ($func_ref->[1] ne "void") {
	$ret = $ret . "ret_value = ";
    }
    $ret = "$ret$prefix$func_ref->[0]( $call_arg);\n";
    if ($thread_safe) {
	$ret = "$ret  LEAVE_GL();\n";
    }
    if ($func_ref->[1] ne "void") {
	$ret = "$ret  return ret_value;\n"
    }
    $ret = "$ret}\n";

    # Return this string....
    return $ret;
}

#
# Extract and checks the number of arguments
#
if (@ARGV != 2) {
    my $name0=$0;
    $name0=~s%^.*/%%;
    die "Usage: $name0 OpenGL_registry_location OpenGL_version\n";
}
my $registry_path = shift @ARGV;
my $version       = shift @ARGV;
if ($version eq "1.0") {
    %norm_categories = %cat_1_0;
} elsif ($version eq "1.1") {
    %norm_categories = %cat_1_1;
} elsif ($version eq "1.2") {
    %norm_categories = %cat_1_2;
} elsif ($version eq "1.3") {
    %norm_categories = %cat_1_3;
} elsif ($version eq "1.4") {
    %norm_categories = %cat_1_4;
} elsif ($version eq "1.5") {
    %norm_categories = %cat_1_5;
} else {
    die "Incorrect OpenGL version.\n";
}

#
# Open the registry files
#
open(TYPES,    "$registry_path/gl.tm")   || die "Could not open 'gl.tm'. Please check your path the the registry files.\n";
open(REGISTRY, "$registry_path/gl.spec") || die "Could not open 'gl.spec'. Please check your path the the registry files.\n";

#
# First, create a mapping between the pseudo types used in the spec file
# and OpenGL types using the 'gl.tm' file.
#
my %pseudo_to_opengl = ();
while (my $line = <TYPES>) {
    if ($line !~ /\w*\#/) {
	my ($pseudo, $opengl) = ($line =~ /(\w*),\*,\*,\s*(.*),\*,\*/);
	$pseudo_to_opengl{$pseudo} = $opengl;
    }
}
# This is to override the 'void' -> '*' bogus conversion
$pseudo_to_opengl{"void"} = "void";
$pseudo_to_opengl{"Int64EXT"} = "INT64";
$pseudo_to_opengl{"UInt64EXT"} = "UINT64";

#
# Then, create the list of all OpenGL functions using the 'gl.spec'
# file. This will create two hash-tables, one with all the function
# whose category matches the one listed in '@norm_categories', the other
# with all other functions.
#
# An element of the hash table is a reference to an array with these
# elements :
#
#  - function name
#
#  - return type
#
#  - reference to an array giving the list of arguments (an empty array
#    for a 'void' function).
#
# The list of arguments is itself an array of reference to arrays. Each
# of these arrays represents the argument type and the argument name.
#
# An example :
#
# void glBitmap( GLsizei width, GLsizei height,
#                GLfloat xorig, GLfloat yorig,
#                GLfloat xmove, GLfloat ymove,
#                const GLubyte *bitmap );
#
# Would give something like that :
#
# [ "glBitmap",
#   "void",
#   [ [ "GLsizei", "width" ],
#     [ "GLsizei", "height" ],
#     [ "GLfloat", "xorig" ],
#     [ "GLfloat", "yorig" ],
#     [ "GLfloat", "xmove" ],
#     [ "GLfloat", "ymove" ],
#     [ "GLubyte *", "bitmap"] ] ];
#
my %norm_functions = ();

#
# This stores various extensions NOT part of the GL extension registry but still
# implemented by most OpenGL libraries out there...
#

my %ext_functions  =
    ( "glDeleteBufferRegion" => [ "glDeleteBufferRegion", "void", [ [ "GLenum", "region" ] ], "glDeleteBufferRegion", "GL_KTX_buffer_region" ],
      "glReadBufferRegion" => [ "glReadBufferRegion", "void", [ [ "GLenum", "region" ],
								[ "GLint", "x" ],
								[ "GLint", "y" ],
								[ "GLsizei", "width" ],
								[ "GLsizei", "height" ] ], "glReadBufferRegion", "GL_KTX_buffer_region" ],
      "glDrawBufferRegion" => [ "glDrawBufferRegion", "void", [ [ "GLenum", "region" ],
								[ "GLint", "x" ],
								[ "GLint", "y" ],
								[ "GLsizei", "width" ],
								[ "GLsizei", "height" ],
								[ "GLint", "xDest" ],
								[ "GLint", "yDest" ] ], "glDrawBufferRegion", "GL_KTX_buffer_region" ],
      "glBufferRegionEnabled" => [ "glBufferRegionEnabled", "GLuint", [ ], "glBufferRegionEnabled",  "GL_KTX_buffer_region" ],
      "glNewBufferRegion" => [ "glNewBufferRegion", "GLuint", [ [ "GLenum", "type" ] ], "glNewBufferRegion", "GL_KTX_buffer_region" ],
      "glMTexCoord2fSGIS" => [ "glMTexCoord2fSGIS", "void", [ [ "GLenum", "target" ],
							      [ "GLfloat", "s" ],
							      [ "GLfloat", "t" ] ], "glMTexCoord2fSGIS", "GL_SGIS_multitexture" ],
      "glMTexCoord2fvSGIS" => [ "glMTexCoord2fvSGIS", "void", [ [ "GLenum", "target" ],
								[ "GLfloat *", "v" ] ], "glMTexCoord2fvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1dSGIS" => [ "glMultiTexCoord1dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ] ],  "glMultiTexCoord1dSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1dvSGIS" => [ "glMultiTexCoord1dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord1dvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1fSGIS" => [ "glMultiTexCoord1fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ] ], "glMultiTexCoord1fSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1fvSGIS" => [ "glMultiTexCoord1fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "const GLfloat *", "v" ] ], "glMultiTexCoord1fvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1iSGIS" => [ "glMultiTexCoord1iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ] ], "glMultiTexCoord1iSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1ivSGIS" => [ "glMultiTexCoord1ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord1ivSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1sSGIS" => [ "glMultiTexCoord1sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ] ], "glMultiTexCoord1sSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord1svSGIS" => [ "glMultiTexCoord1svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord1svSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2dSGIS" => [ "glMultiTexCoord2dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s"],
								      [ "GLdouble", "t" ] ], "glMultiTexCoord2dSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2dvSGIS" => [ "glMultiTexCoord2dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord2dvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2fSGIS" => [ "glMultiTexCoord2fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ] ], "glMultiTexCoord2fSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2fvSGIS" => [ "glMultiTexCoord2fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord2fvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2iSGIS" => [ "glMultiTexCoord2iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ] ], "glMultiTexCoord2iSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2ivSGIS" => [ "glMultiTexCoord2ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord2ivSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2sSGIS" => [ "glMultiTexCoord2sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ] ], "glMultiTexCoord2sSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord2svSGIS" => [ "glMultiTexCoord2svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord2svSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3dSGIS" => [ "glMultiTexCoord3dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ],
								      [ "GLdouble", "t" ],
								      [ "GLdouble", "r" ] ], "glMultiTexCoord3dSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3dvSGIS" => [ "glMultiTexCoord3dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord3dvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3fSGIS" => [ "glMultiTexCoord3fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ],
								      [ "GLfloat", "r" ] ], "glMultiTexCoord3fSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3fvSGIS" => [ "glMultiTexCoord3fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord3fvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3iSGIS" => [ "glMultiTexCoord3iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ],
								      [ "GLint", "r" ] ], "glMultiTexCoord3iSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3ivSGIS" => [ "glMultiTexCoord3ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord3ivSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3sSGIS" => [ "glMultiTexCoord3sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ],
								      [ "GLshort", "r" ] ], "glMultiTexCoord3sSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord3svSGIS" => [ "glMultiTexCoord3svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord3svSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4dSGIS" => [ "glMultiTexCoord4dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ],
								      [ "GLdouble", "t" ],
								      [ "GLdouble", "r" ],
								      [ "GLdouble", "q" ] ], "glMultiTexCoord4dSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4dvSGIS" => [ "glMultiTexCoord4dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord4dvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4fSGIS" => [ "glMultiTexCoord4fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ],
								      [ "GLfloat", "r" ],
								      [ "GLfloat", "q" ] ], "glMultiTexCoord4fSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4fvSGIS" => [ "glMultiTexCoord4fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord4fvSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4iSGIS" => [ "glMultiTexCoord4iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ],
								      [ "GLint", "r" ],
								      [ "GLint", "q" ] ], "glMultiTexCoord4iSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4ivSGIS" => [ "glMultiTexCoord4ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord4ivSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4sSGIS" => [ "glMultiTexCoord4sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ],
								      [ "GLshort", "r" ],
								      [ "GLshort", "q" ] ], "glMultiTexCoord4sSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoord4svSGIS" => [ "glMultiTexCoord4svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord4svSGIS", "GL_SGIS_multitexture" ],
      "glMultiTexCoordPointerSGIS" => [ "glMultiTexCoordPointerSGIS", "void", [ [ "GLenum", "target" ],
										[ "GLint", "size" ],
										[ "GLenum", "type" ],
										[ "GLsizei", "stride" ],
										[ "GLvoid *", "pointer" ] ], "glMultiTexCoordPointerSGIS", "GL_SGIS_multitexture" ],
      "glSelectTextureSGIS" => [ "glSelectTextureSGIS", "void", [ [ "GLenum", "target" ] ], "glSelectTextureSGIS", "GL_SGIS_multitexture" ],
      "glSelectTextureCoordSetSGIS" => [ "glSelectTextureCoordSetSGIS", "void", [ [ "GLenum", "target" ] ], "glSelectTextureCoordSetSGIS", "GL_SGIS_multitexture" ],
      "glDeleteObjectBufferATI" => [ "glDeleteObjectBufferATI", "void", [ [ "GLuint", "buffer" ] ], "glDeleteObjectBufferATI", "GL_ATI_vertex_array_object" ]
      );

my @arg_names;
my %arg_types;
while (my $line = <REGISTRY>) {
    if ($line =~ /^\w*\(.*\)/) {
	# Get the function name (NOTE: the 'gl' prefix needs to be added later)
	my ($funcname, $args) = ($line =~ /^(\w*)\((.*)\)/);
	# and the argument names
	@arg_names = split /\s*,\s*/, $args;

	# After get :
	#  - the return type
	#  - category (the extension the function is part of)
	#  - the argument types
	#  - the category the function belongs
	%arg_types = ();
	my $category = "";
	my $ret_type = "";
	while (1) {
	    $line = <REGISTRY>;
	    unless (defined($line)) {
		last;
	    } elsif ($line =~ /^\s*$/) {
		if (($category eq "") || ($ret_type eq "")) {
		    die "Missing 'category' line in function $funcname.\n";
		}
		last;
	    } elsif ($line =~ /\t*return\t*(\w*)/) {
		($ret_type) = ($line =~ /\t*return\s*(\w*)/);
		$ret_type = $pseudo_to_opengl{$ret_type};
		unless (defined($ret_type)) {
		    die "Unsupported return type in function $funcname\n";
		}
	    } elsif ($line =~ /^\t*category/) {
		($category) = ($line =~ /^\t*category\s*([\w-]*)/);
	    } elsif ($line =~ /^\t*param/) {
		my ($name, $base_type, $ext) = ($line =~ /\t*param\s*(\w*)\s*(\w*) (.*)/);
		my $ptr = 0;
		unless (defined($name)) {
		    chomp $line;
		    die "Broken spec file line $line in function $funcname\n";
		}

		if ($ext =~ /array/) {
		    # This is a pointer
		    $ptr = 1;
		} elsif ($ext =~ /value/) {
		    # And this a 'normal' value
		    $ptr = 0;
		} else {
		    chomp $line;
		    die "Unsupported type : $line in function $funcname\n";
		}
		# Get the 'real' type and append a '*' in case of a pointer
		my $type = $pseudo_to_opengl{$base_type};
		unless (defined($type)) {
		    chomp $line;
		    die "Unsupported return type in function $funcname for type $base_type (line $line)\n";
		}
		if ($ptr) {
		    $type = "$type*";
		}

		$arg_types{$name} = $type;
	    }
	}

	# Now, build the argument reference
	my $arg_ref = [ ];
	for (my $i = 0; $i <= $#arg_names; $i++) {
	    unless (defined($arg_types{$arg_names[$i]})) {
		print "@arg_names\n";
		foreach (sort keys %arg_types) {
		    print "$_ => $arg_types{$_}\n";
		}
		die "Undefined type for $arg_names[$i] in function $funcname\n";
	    }

	    push @$arg_ref, [ $arg_types{$arg_names[$i]}, $arg_names[$i] ];
	}
	my $func_ref = [ "gl$funcname",
                         $ret_type,
                         $arg_ref,
                         "gl$funcname",
                         "GL_$category" ];

	# Now, put in one or the other hash table
	if ($norm_categories{$category}) {
	    $norm_functions{"gl$funcname"} = $func_ref;
	} else {
	    $ext_functions{"gl$funcname"} = $func_ref;
	}
    }
}

#
# Clean up the input files
#
close(TYPES);
close(REGISTRY);

#
# Now, generate the output files. First, the spec file.
#
open(SPEC, ">$spec_file");

foreach (sort keys %norm_functions) {
    my $func_name = $norm_functions{$_}->[0];
    print SPEC "@  stdcall $func_name( ";
    for (my $i = 0; $i <= $#{@{$norm_functions{$_}->[2]}}; $i++) {
	my $type = $norm_functions{$_}->[2]->[$i]->[0];
	if ($type =~ /\*/) {
	    print SPEC "ptr ";
	} elsif (defined($arg_conv{$type})) {
	    print SPEC "$@$arg_conv{$type}[0] ";
	} else {
	    die "No conversion for GL type $type...\n";
	}
    }
    print SPEC ") wine_$func_name\n";
}

print SPEC "@  stub    glGetLevelParameterfv
@  stub    glGetLevelParameteriv
@  stdcall wglChoosePixelFormat(long ptr) gdi32.ChoosePixelFormat
@  stdcall wglCopyContext(long long long)
@  stdcall wglCreateContext(long) gdi32.wglCreateContext
@  stdcall wglCreateLayerContext(long long)
@  stdcall wglDeleteContext(long) gdi32.wglDeleteContext
@  stdcall wglDescribeLayerPlane(long long long long ptr)
@  stdcall wglDescribePixelFormat(long long long ptr) gdi32.DescribePixelFormat
@  stdcall wglGetCurrentContext() gdi32.wglGetCurrentContext
@  stdcall wglGetCurrentDC() gdi32.wglGetCurrentDC
@  stub    wglGetDefaultProcAddress
@  stdcall wglGetLayerPaletteEntries(long long long long ptr)
@  stdcall wglGetPixelFormat(long) gdi32.GetPixelFormat
@  stdcall wglGetProcAddress(str)
@  stdcall wglMakeCurrent(long long) gdi32.wglMakeCurrent
@  stdcall wglRealizeLayerPalette(long long long)
@  stdcall wglSetLayerPaletteEntries(long long long long ptr)
@  stdcall wglSetPixelFormat(long long ptr) gdi32.SetPixelFormat
@  stdcall wglShareLists(long long) gdi32.wglShareLists
@  stdcall wglSwapBuffers(long) gdi32.SwapBuffers
@  stdcall wglSwapLayerBuffers(long long)
@  stdcall wglUseFontBitmapsA(long long long long) gdi32.wglUseFontBitmapsA
@  stdcall wglUseFontBitmapsW(long long long long) gdi32.wglUseFontBitmapsW
@  stdcall wglUseFontOutlinesA(long long long long long long long ptr)
@  stdcall wglUseFontOutlinesW(long long long long long long long ptr)
";

close(SPEC);

#
# After the spec file, the opengl_norm.c file
#
open(NORM, ">$norm_file");
print NORM "
/* Auto-generated file... Do not edit ! */

#include \"config.h\"
#include \"opengl_ext.h\"
#include \"wine/debug.h\"

WINE_DEFAULT_DEBUG_CHANNEL(opengl);
";
foreach (sort keys %norm_functions) {
    my $string = GenerateThunk($norm_functions{$_}, 1, "", $gen_thread_safe, "");

    print NORM "\n$string" if $string;
}
close(NORM);

#
# Finally, more complex, the opengl_ext.c file
#
open(EXT, ">$ext_file");
print EXT "
/* Auto-generated file... Do not edit ! */

#include \"config.h\"
#include \"opengl_ext.h\"
#include \"wine/debug.h\"

WINE_DEFAULT_DEBUG_CHANNEL(opengl);

";

# The thunks themselves....
my $count = keys %ext_functions;
print EXT "const int extension_registry_size = $count;\n";
print EXT "void *extension_funcs[$count];\n";
print EXT "\n/* The thunks themselves....*/";
my $pos = 0;
foreach (sort keys %ext_functions) {
    my $func_ref = $ext_functions{$_};
    my $local_var = "  " . ConvertType($func_ref->[1]) . " (*$ext_prefix$func_ref->[0])( ";
    for (my $i = 0; $i <= $#{@{$func_ref->[2]}}; $i++) {
	my $type = ConvertType($func_ref->[2]->[$i]->[0]);
	$local_var .= "$type";
	if ($i != $#{@{$func_ref->[2]}}) {
	    $local_var .= ", ";
	} else {
	    $local_var .= " ";
	}
    }
    $local_var .= 'void ' if ($#{@{$func_ref->[2]}} < 0);
    $local_var .= ") = extension_funcs[$pos];\n";
    $pos++;
    print EXT "\nstatic ", GenerateThunk($ext_functions{$_}, 0, $ext_prefix, $gen_thread_safe, $local_var);
}

# Then the table giving the string <-> function correspondance */
print EXT "\n\n/* The table giving the correspondance between names and functions */\n";
print EXT "const OpenGL_extension extension_registry[$count] = {\n";
my $i = 0;
foreach (sort keys %ext_functions) {
    my $func_ref = $ext_functions{$_};
    if ($func_ref->[0] eq $func_ref->[3])
    {
        print EXT "  { \"$func_ref->[0]\", \"$func_ref->[4]\", (void *) wine_$func_ref->[0] }";
    }
    if ($i != $count-1) {
	print EXT ",";
    }
    $i++;
    print EXT "\n";
}
print EXT "};\n";

close(EXT);
