#!/usr/bin/perl -w

# 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 part of the OpenGL
#       sample implementation CVS tree and are located in
#       CVS_ROOT/projects/ogl-sample/main/doc/registry/specs.
#       You can 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.2).
#
# 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

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

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

#
# List of categories to put in the 'opengl_norm.c' file
#
%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 );
%cat_1_1 = ( %cat_1_0,
	     "1_1" => 1 );
%cat_1_2 = ( %cat_1_1,
	     "VERSION_1_2" => 1 );
%cat_1_3 = ( %cat_1_2,
	     "VERSION_1_3" => 1 );
%cat_1_4 = ( %cat_1_3,
	     "VERSION_1_4" => 1 );
%cat_1_5 = ( %cat_1_4,
	     "VERSION_1_5" => 1 );

%norm_categories = ();

#
# This hash table gives the conversion between OpenGL types and what
# is used by the TRACE printfs
#
%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
#
%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) = @_;

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

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

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

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

    foreach $org (keys %hash) {
	if ($type =~ /$org/) {
	    ($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) = @_;
    my ($ret) = ("");
    my ($call_arg) = ("");
    my ($trace_arg) = ("");
    my ($wine_func_ref_name) = ("");

    # 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 ($i = 0; $i <= $#{@{$func_ref->[2]}}; $i++) {
	## Quick debug code :-)
	## print $func_ref->[2]->[$i]->[1] . "\n";
	$type = $func_ref->[2]->[$i]->[0];
	$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 = $ret . ") {\n";
    if ($func_ref->[1] ne "void") {
	$ret = $ret . "  " . ConvertType($func_ref->[1]) . " ret_value;\n";
    }
    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 = ";
    }
    $wine_func_ref_name = $func_ref->[0];
    if ( $func_ref->[0] eq "glGetString" ) {
	$wine_func_ref_name = "internal_glGetString";
    }
    $ret = $ret . $prefix . $wine_func_ref_name . "( " . $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....
    $ret;
}

#
# Extract and checks the number of arguments
#
if ($#ARGV != 1) {
    die "Usage : make_opengl OpenGL_registry_location OpenGL_version.\n";
}
$registry_path = shift @ARGV;
$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.
#
%pseudo_to_opengl = ();
while ($line = <TYPES>) {
    if ($line !~ /\w*\#/) {
	($pseudo, $opengl) = ($line =~ /(\w*),\*,\*,\s*(.*),\*,\*/);
	$pseudo_to_opengl{$pseudo} = $opengl;
    }
}
# This is to override the 'void' -> '*' bogus conversion
$pseudo_to_opengl{"void"} = "void";
# This is a bug in the spec file...
$pseudo_to_opengl{"FfdTargetSGIX"} = "GLint";
$pseudo_to_opengl{"FfdMaskSGIX"} = "GLint";
$pseudo_to_opengl{"IglooFunctionSelectSGIX"} = "GLint";
$pseudo_to_opengl{"IglooParameterSGIX"} = "GLint";

#
# 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"] ] ];
#
%norm_functions = ();

#
# This stores various extensions NOT part of the GL extension registry but still
# implemented by most OpenGL libraries out there...
#
%ext_functions  =
    ( "glDeleteBufferRegion" => [ "glDeleteBufferRegion", "void", [ [ "GLenum", "region" ] ], "glDeleteBufferRegion" ],
      "glReadBufferRegion" => [ "glReadBufferRegion", "void", [ [ "GLenum", "region" ],
								[ "GLint", "x" ],
								[ "GLint", "y" ],
								[ "GLsizei", "width" ],
								[ "GLsizei", "height" ] ], "glReadBufferRegion" ],
      "glDrawBufferRegion" => [ "glDrawBufferRegion", "void", [ [ "GLenum", "region" ],
								[ "GLint", "x" ],
								[ "GLint", "y" ],
								[ "GLsizei", "width" ],
								[ "GLsizei", "height" ],
								[ "GLint", "xDest" ],
								[ "GLint", "yDest" ] ], "glDrawBufferRegion" ],
      "glBufferRegionEnabled" => [ "glBufferRegionEnabled", "GLuint", [ ], "glBufferRegionEnabled" ],
      "glNewBufferRegion" => [ "glNewBufferRegion", "GLuint", [ [ "GLenum", "type" ] ], "glNewBufferRegion" ],
      "glMTexCoord2fSGIS" => [ "glMTexCoord2fSGIS", "void", [ [ "GLenum", "target" ],
							      [ "GLfloat", "s" ],
							      [ "GLfloat", "t" ] ], "glMTexCoord2fSGIS" ],
      "glMTexCoord2fvSGIS" => [ "glMTexCoord2fvSGIS", "void", [ [ "GLenum", "target" ],
								[ "GLfloat *", "v" ] ], "glMTexCoord2fvSGIS" ],
      "glMultiTexCoord1dSGIS" => [ "glMultiTexCoord1dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ] ],  "glMultiTexCoord1dSGIS" ],
      "glMultiTexCoord1dvSGIS" => [ "glMultiTexCoord1dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord1dvSGIS" ],
      "glMultiTexCoord1fSGIS" => [ "glMultiTexCoord1fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ] ], "glMultiTexCoord1fSGIS" ],
      "glMultiTexCoord1fvSGIS" => [ "glMultiTexCoord1fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "const GLfloat *", "v" ] ], "glMultiTexCoord1fvSGIS" ],
      "glMultiTexCoord1iSGIS" => [ "glMultiTexCoord1iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ] ], "glMultiTexCoord1iSGIS" ],
      "glMultiTexCoord1ivSGIS" => [ "glMultiTexCoord1ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord1ivSGIS" ],
      "glMultiTexCoord1sSGIS" => [ "glMultiTexCoord1sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ] ], "glMultiTexCoord1sSGIS" ],
      "glMultiTexCoord1svSGIS" => [ "glMultiTexCoord1svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord1svSGIS" ],
      "glMultiTexCoord2dSGIS" => [ "glMultiTexCoord2dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s"],
								      [ "GLdouble", "t" ] ], "glMultiTexCoord2dSGIS" ],
      "glMultiTexCoord2dvSGIS" => [ "glMultiTexCoord2dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord2dvSGIS" ],
      "glMultiTexCoord2fSGIS" => [ "glMultiTexCoord2fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ] ], "glMultiTexCoord2fSGIS" ],
      "glMultiTexCoord2fvSGIS" => [ "glMultiTexCoord2fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord2fvSGIS" ],
      "glMultiTexCoord2iSGIS" => [ "glMultiTexCoord2iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ] ], "glMultiTexCoord2iSGIS" ],
      "glMultiTexCoord2ivSGIS" => [ "glMultiTexCoord2ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord2ivSGIS" ],
      "glMultiTexCoord2sSGIS" => [ "glMultiTexCoord2sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ] ], "glMultiTexCoord2sSGIS" ],
      "glMultiTexCoord2svSGIS" => [ "glMultiTexCoord2svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord2svSGIS" ],
      "glMultiTexCoord3dSGIS" => [ "glMultiTexCoord3dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ],
								      [ "GLdouble", "t" ],
								      [ "GLdouble", "r" ] ], "glMultiTexCoord3dSGIS" ],
      "glMultiTexCoord3dvSGIS" => [ "glMultiTexCoord3dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord3dvSGIS" ],
      "glMultiTexCoord3fSGIS" => [ "glMultiTexCoord3fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ],
								      [ "GLfloat", "r" ] ], "glMultiTexCoord3fSGIS" ],
      "glMultiTexCoord3fvSGIS" => [ "glMultiTexCoord3fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord3fvSGIS" ],
      "glMultiTexCoord3iSGIS" => [ "glMultiTexCoord3iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ],
								      [ "GLint", "r" ] ], "glMultiTexCoord3iSGIS" ],
      "glMultiTexCoord3ivSGIS" => [ "glMultiTexCoord3ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord3ivSGIS" ],
      "glMultiTexCoord3sSGIS" => [ "glMultiTexCoord3sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ],
								      [ "GLshort", "r" ] ], "glMultiTexCoord3sSGIS" ],
      "glMultiTexCoord3svSGIS" => [ "glMultiTexCoord3svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord3svSGIS" ],
      "glMultiTexCoord4dSGIS" => [ "glMultiTexCoord4dSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLdouble", "s" ],
								      [ "GLdouble", "t" ],
								      [ "GLdouble", "r" ],
								      [ "GLdouble", "q" ] ], "glMultiTexCoord4dSGIS" ],
      "glMultiTexCoord4dvSGIS" => [ "glMultiTexCoord4dvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLdouble *", "v" ] ], "glMultiTexCoord4dvSGIS" ],
      "glMultiTexCoord4fSGIS" => [ "glMultiTexCoord4fSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLfloat", "s" ],
								      [ "GLfloat", "t" ],
								      [ "GLfloat", "r" ],
								      [ "GLfloat", "q" ] ], "glMultiTexCoord4fSGIS" ],
      "glMultiTexCoord4fvSGIS" => [ "glMultiTexCoord4fvSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLfloat *", "v" ] ], "glMultiTexCoord4fvSGIS" ],
      "glMultiTexCoord4iSGIS" => [ "glMultiTexCoord4iSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLint", "s" ],
								      [ "GLint", "t" ],
								      [ "GLint", "r" ],
								      [ "GLint", "q" ] ], "glMultiTexCoord4iSGIS" ],
      "glMultiTexCoord4ivSGIS" => [ "glMultiTexCoord4ivSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLint *", "v" ] ], "glMultiTexCoord4ivSGIS" ],
      "glMultiTexCoord4sSGIS" => [ "glMultiTexCoord4sSGIS", "void", [ [ "GLenum", "target" ],
								      [ "GLshort", "s" ],
								      [ "GLshort", "t" ],
								      [ "GLshort", "r" ],
								      [ "GLshort", "q" ] ], "glMultiTexCoord4sSGIS" ],
      "glMultiTexCoord4svSGIS" => [ "glMultiTexCoord4svSGIS", "void", [ [ "GLenum", "target" ],
									[ "GLshort *", "v" ] ], "glMultiTexCoord4svSGIS" ],
      "glMultiTexCoordPointerSGIS" => [ "glMultiTexCoordPointerSGIS", "void", [ [ "GLenum", "target" ],
										[ "GLint", "size" ],
										[ "GLenum", "type" ],
										[ "GLsizei", "stride" ],
										[ "GLvoid *", "pointer" ] ], "glMultiTexCoordPointerSGIS" ],
      "glSelectTextureSGIS" => [ "glSelectTextureSGIS", "void", [ [ "GLenum", "target" ] ], "glSelectTextureSGIS" ],
      "glSelectTextureCoordSetSGIS" => [ "glSelectTextureCoordSetSGIS", "void", [ [ "GLenum", "target" ] ], "glSelectTextureCoordSetSGIS" ],
      "wglAllocateMemoryNV" => [ "wglAllocateMemoryNV", "void *", [ [ "GLsizei", "size" ],
								    [ "GLfloat", "readfreq" ],
								    [ "GLfloat", "writefreq"],
								    [ "GLfloat", "priority" ] ], "glXAllocateMemoryNV" ],
      "wglFreeMemoryNV" => [ "wglFreeMemoryNV", "void", [ [ "GLvoid *", "pointer" ] ], "glXFreeMemoryNV" ],
      "glDeleteObjectBufferATI" => [ "glDeleteObjectBufferATI", "void", [ [ "GLuint", "buffer" ] ], "glDeleteObjectBufferATI" ]
      );


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

	# After get :
	#  - the return type
	#  - the argument types
	#  - the category the function belongs
	%arg_types = ();
	$category = "";
	$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/) {
		($name, $base_type, $ext) = ($line =~ /\t*param\s*(\w*)\s*(\w*) (.*)/);
		$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
		$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
	$arg_ref = [ ];
	for ($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] ];
	}
	$func_ref = [ "gl" . $funcname,
		      $ret_type,
		      $arg_ref,
		      "gl" . $funcname ];

	# 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);

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

foreach (sort keys %norm_functions) {
    $func_name = $norm_functions{$_}->[0];
    print SPEC "@  stdcall $func_name( ";
    for ($i = 0; $i <= $#{@{$norm_functions{$_}->[2]}}; $i++) {
	$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 convertion for GL type $type...\n";
	}
    }
    print SPEC ") wine_$func_name\n";
}
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) {
    $string = GenerateThunk($norm_functions{$_}, 1, "", $gen_thread_safe);

    print NORM "\n$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);

";

# First, generate the function pointers
foreach (sort keys %ext_functions) {
    $func_ref = $ext_functions{$_};
    print EXT ConvertType($func_ref->[1]) . " (*" . $ext_prefix . $func_ref->[0] . ")( ";
    for ($i = 0; $i <= $#{@{$func_ref->[2]}}; $i++) {
	$type = ConvertType($func_ref->[2]->[$i]->[0]);
	print EXT "$type";
	if ($i != $#{@{$func_ref->[2]}}) {
	    print EXT ", ";
	} else {
	    print EXT " ";
	}
    }
    print EXT ") = (void *) 0xdeadbeef;\n";
}

# Then, the function prototypes
print EXT "\n\n/* The function prototypes */\n";
foreach (sort keys %ext_functions) {
    $func_ref = $ext_functions{$_};
    print EXT ConvertType($func_ref->[1]) . " WINAPI " . "wine_" . $func_ref->[0] . "( ";
    for ($i = 0; $i <= $#{@{$func_ref->[2]}}; $i++) {
	$type = ConvertType($func_ref->[2]->[$i]->[0]);
	print EXT "$type";
	if ($i != $#{@{$func_ref->[2]}}) {
	    print EXT ", ";
	} else {
	    print EXT " ";
	}
    }
    print EXT ");\n";
}

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

# And, finally, the thunks themselves....
print EXT "\n/* The thunks themselves....*/";
foreach (sort keys %ext_functions) {
    $string = GenerateThunk($ext_functions{$_}, 0, $ext_prefix, $gen_thread_safe);

    print EXT "\n$string";
}
close(EXT);
