#!/usr/bin/perl -w
use strict;
use XML::Simple;

# This script is called thus :
#
#   make_opengl [opengl_version]
#
#     - It needs files from the OpenGL extension registry:
#
#       https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/gl.xml
#       https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/wgl.xml
#
#       If they are not found in the current directory the script will
#       attempt to download them from there.
#
#     - opengl_version is the OpenGL version emulated by the library
#       (can be 1.0 to 1.5). The default is 1.1.
#
# 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).
#
#     - include/wine/wgl_driver.h: definitions for the tables of OpenGL functions.
#
#
# Copyright 2000 Lionel Ulmer
# Copyright 2012 Alexandre Julliard
#
# 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";
my $wgl_driver_file = "../../include/wine/wgl_driver.h";
my $wgl_file = "../../include/wine/wgl.h";

# Set to 0 for removing the ENTER / LEAVE GL calls
my $gen_thread_safe = 0;
# 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 = ( "GL_VERSION_1_0" => 1 );
my %cat_1_1 = ( %cat_1_0, "GL_VERSION_1_1" => 1 );
my %cat_1_2 = ( %cat_1_1, "GL_VERSION_1_2" => 1 );
my %cat_1_3 = ( %cat_1_2, "GL_VERSION_1_3" => 1 );
my %cat_1_4 = ( %cat_1_3, "GL_VERSION_1_4" => 1 );
my %cat_1_5 = ( %cat_1_4, "GL_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",
     "GLclampx" => "%d",
     "GLdouble" => "%f",
     "GLenum" => "%d",
     "GLfloat" => "%f",
     "GLfixed" => "%d",
     "GLint" => "%d",
     "GLshort" => "%d",
     "GLsizei" => "%d",
     "GLstring" => "%s",
     "GLsync" => "%p",
     "GLubyte" => "%d",
     "GLuint" => "%d",
     "GLushort" => "%d",
     "GLhalfNV" => "%d",
     "GLintptrARB" => "%ld",
     "GLsizeiptrARB" => "%ld",
     "GLintptr" => "%ld",
     "GLsizeiptr" => "%ld",
     "GLhandleARB" => "%d",
     "GLcharARB" => "%c",
     "GLuint64" => "%s,wine_dbgstr_longlong(%s)",
     "GLuint64EXT" => "%s,wine_dbgstr_longlong(%s)",
     "GLint64EXT" => "%s,wine_dbgstr_longlong(%s)",
     "GLvoid" => "(void)",
     "_GLfuncptr" => "%p",
     "GLDEBUGPROC" => "%p",
     "GLDEBUGPROCARB" => "%p",
     "GLDEBUGPROCAMD" => "%p",
     "GLDEBUGPROCKHR" => "%p",
     "GLvdpauSurfaceNV" => "%ld",
     "int" => "%d",
     "unsigned int" => "%u",
     "UINT" => "%u",
     "DWORD" => "%u",
     "BOOL" => "%u",
     "INT64" => "%s,wine_dbgstr_longlong(%s)",
     "UINT64" => "%s,wine_dbgstr_longlong(%s)",
     "LPVOID" => "%p",
     "HANDLE" => "%p",
     "HDC" => "%p",
     "HGLRC" => "%p",
     "HPBUFFERARB" => "%p",
     "HPBUFFEREXT" => "%p",
    );

#
# This hash table gives the conversion between OpenGL types and what
# is used in the .spec and header files.
#
my %arg_conv =
    ("GLbitfield" =>       [ "long", "unsigned int" ],
     "GLboolean" =>        [ "long", "unsigned char" ],
     "GLbyte" =>           [ "long", "signed char" ],
     "GLchar" =>           [ "long", "char" ],
     "GLclampd" =>         [ "double", "double" ],
     "GLclampf" =>         [ "float", "float" ],
     "GLclampx" =>         [ "long", "int" ],
     "GLdouble" =>         [ "double", "double" ],
     "GLenum" =>           [ "long", "unsigned int" ],
     "GLfloat" =>          [ "float", "float" ],
     "GLfixed" =>          [ "long", "int" ],
     "GLint" =>            [ "long", "int" ],
     "GLint64" =>          [ "int64", "INT64" ],
     "GLint64EXT" =>       [ "int64", "INT64" ],
     "GLintptr" =>         [ "long", "INT_PTR" ],
     "GLshort" =>          [ "long", "short" ],
     "GLsizei" =>          [ "long", "int" ],
     "GLsizeiptr" =>       [ "long", "INT_PTR" ],
     "GLstring" =>         [ "str", "const unsigned char *" ],
     "GLsync" =>           [ "ptr", "struct __GLsync *" ],
     "GLubyte" =>          [ "long", "unsigned char" ],
     "GLuint" =>           [ "long", "unsigned int" ],
     "GLuint64" =>         [ "int64", "UINT64" ],
     "GLuint64EXT" =>      [ "int64", "UINT64" ],
     "GLushort" =>         [ "long", "unsigned short" ],
     "GLvoid" =>           [ "void", "void" ],
     "GLcharARB" =>        [ "long", "char" ],
     "GLhandleARB" =>      [ "long", "unsigned int" ],
     "GLintptrARB" =>      [ "long", "INT_PTR" ],
     "GLsizeiptrARB" =>    [ "long", "INT_PTR" ],
     "GLhalfNV" =>         [ "long", "unsigned short" ],
     "GLvdpauSurfaceNV" => [ "long", "INT_PTR" ]);

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

    my %hash = (
              "struct _cl_context" => "void",
              "struct _cl_event" => "void",
              "HGLRC" => "struct wgl_context *",
              "GLDEBUGPROC" => "void *",
              "GLDEBUGPROCARB" => "void *",
              "GLDEBUGPROCAMD" => "void *",
              "GLDEBUGPROCKHR" => "void *",
              "HPBUFFERARB" => "struct wgl_pbuffer *",
              "HPBUFFEREXT" => "struct wgl_pbuffer *",
        );

    foreach my $org (reverse sort keys %hash) {
        if ($type =~ /^(.*)$org(.*)$/) {
            return "$1$hash{$org}$2";
        }
    }
    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(.*)$/) {
            return "$1$hash{$org}$2";
        }
    }
    return $type;
}

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

    return "" if $name eq "glDebugEntry";
    return "" if $name eq "glGetString";
    return "" if $func_ref->[2] && $func_ref->[2]->[0] =~ /WGL_/;

    # 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 .= "/***********************************************************************\n";
        $ret .= " *              $name (OPENGL32.\@)\n";
        $ret .= " */\n";
    }
    $ret .= ConvertType($func_ref->[0]) . " WINAPI $name( ";
    for (my $i = 0; $i < @{$func_ref->[1]}; $i++) {
        my $type = $func_ref->[1]->[$i]->[0];
        my $name = ConvertVarName($func_ref->[1]->[$i]->[1]);
        $ret .= ConvertType($type) . " $name";
        $call_arg .= $name;
        if ($type =~ /\*/) {
            $trace_arg .= "%p";
            $trace_call_arg .= $name;
        } elsif (defined $debug_conv{$type}) {
            if ($debug_conv{$type} =~ /(.*),(.*)/)
            {
                $trace_arg .= $1;
                $trace_call_arg .= sprintf $2, $name;
            }
            else
            {
                $trace_arg .= $debug_conv{$type};
                $trace_call_arg .= $name;
            }
        }
        else { printf "Unknown type %s\n", $type; }
        if ($i+1 < @{$func_ref->[1]}) {
            $ret .= ", ";
            $call_arg .= ", ";
            $trace_call_arg .= ", ";
            $trace_arg .= ", ";
        } else {
            $ret .= " ";
            $call_arg .= " ";
            $trace_call_arg .= " ";
        }
    }
    $ret .= 'void ' if (!@{$func_ref->[1]});
    $ret .= ") {\n";
    $ret .= "  const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;\n";
    if ($func_ref->[0] ne "void" && $gen_thread_safe) {
        $ret .= "  " . ConvertType($func_ref->[0]) . " ret_value;\n";
    }
    if ($gen_traces) {
        $ret .= "  TRACE(\"($trace_arg)\\n\"";
        if ($trace_arg ne "") {
            $ret .= ", $trace_call_arg";
        }
        $ret .= ");\n";
    }
    if ($gen_thread_safe) {
        $ret .= "  ENTER_GL();\n";
        $ret .= "  ";
        if ($func_ref->[0] ne "void") {
            $ret .= "ret_value = ";
        }
        $ret .= "funcs->$prefix.p_$name( $call_arg);\n";
        $ret .= "  LEAVE_GL();\n";
        if ($func_ref->[0] ne "void") {
            $ret .= "  return ret_value;\n"
        }
    }
    else {
        $ret .= "  ";
        if ($func_ref->[0] ne "void") {
            $ret .= "return ";
        }
        $ret .= "funcs->$prefix.p_$name( $call_arg);\n";
    }
    $ret .= "}\n";

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

sub generate_null_func($$)
{
    my ($name, $func_ref) = @_;
    my $ret;

    return "" if $name eq "glDebugEntry";

    $ret = "static " . ConvertType($func_ref->[0]) . " null_$name( ";
    for (my $i = 0; $i < @{$func_ref->[1]}; $i++) {
        my $type = $func_ref->[1]->[$i]->[0];
        my $name = ConvertVarName($func_ref->[1]->[$i]->[1]);
        $ret .= ConvertType($type) . " $name";
        $ret .= "," if ($i+1 < @{$func_ref->[1]});
        $ret .= " ";
    }
    $ret .= 'void ' if (!@{$func_ref->[1]});
    $ret .= ") {";
    if ($name eq "glGetError")
    {
        $ret .= " return GL_INVALID_OPERATION;";
    }
    elsif ($func_ref->[0] ne "void")
    {
        $ret .= " return 0;";
    }
    $ret .= " }\n";
    return $ret;
}

sub get_func_proto($$$)
{
    my ($format, $name, $func) = @_;
    my $ret = sprintf "%-10s", ConvertType($func->[0]);
    $ret .= " " . sprintf($format,$name) . "(";
    for (my $i = 0; $i < @{$func->[1]}; $i++)
    {
        $ret .= ConvertType($func->[1]->[$i]->[0]);
        $ret .= "," if ($i+1 < @{$func->[1]});
    }
    $ret .= "void" unless @{$func->[1]};
    $ret .= ")";
    return $ret;
}

#
# Extract and checks the number of arguments
#
if (@ARGV > 1) {
    my $name0=$0;
    $name0=~s%^.*/%%;
    die "Usage: $name0 [version]\n";
}
my $version = $ARGV[0] || "1.1";
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";
}

#
# Fetch the registry files
#
-f "gl.xml" || system "wget --no-check-certificate https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/gl.xml" || die "cannot download gl.xml";
-f "wgl.xml" || system "wget --no-check-certificate https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/wgl.xml" || die "cannot download wgl.xml";


#
# Then, create the list of all OpenGL functions using the registry
# files. 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 = ( "glDebugEntry" => [ "GLint", [[ "GLint", "unknown1" ],
                                                     [ "GLint", "unknown2" ]] ] );

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

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


my %wgl_functions =
   (
    "wglCopyContext" => [ "BOOL", [ [ "struct wgl_context *", "src" ],
                                    [ "struct wgl_context *", "dst" ],
                                    [ "UINT", "mask" ] ] ],
    "wglCreateContext" => [ "struct wgl_context *", [ [ "HDC", "hdc" ] ] ],
    "wglDeleteContext" => [ "void", [ [ "struct wgl_context *", "context" ] ] ],
    "wglDescribePixelFormat" => [ "INT", [ [ "HDC", "hdc" ],
                                           [ "INT", "format" ],
                                           [ "UINT", "size" ],
                                           [ "PIXELFORMATDESCRIPTOR *", "descr" ] ] ],
    "wglGetPixelFormat" => [ "INT", [ [ "HDC", "hdc" ] ] ],
    "wglGetProcAddress" => [ "PROC", [ [ "LPCSTR", "name" ] ] ],
    "wglMakeCurrent" => [ "BOOL", [ [ "HDC", "hdc" ],
                                    [ "struct wgl_context *", "context" ] ] ],
    "wglSetPixelFormat" => [ "BOOL", [ [ "HDC", "hdc" ],
                                       [ "INT", "format" ],
                                       [ "const PIXELFORMATDESCRIPTOR *", "descr" ] ] ],
    "wglShareLists" => [ "BOOL", [ [ "struct wgl_context *", "org" ],
                                   [ "struct wgl_context *", "dst" ] ] ],
    "wglSwapBuffers" => [ "BOOL", [ [ "HDC", "hdc" ] ] ],
   );

my %supported_wgl_extensions =
   (
    "WGL_ARB_create_context" => 1,
    "WGL_ARB_extensions_string" => 1,
    "WGL_ARB_make_current_read" => 1,
    "WGL_ARB_pbuffer" => 1,
    "WGL_ARB_pixel_format" => 1,
    "WGL_ARB_render_texture" => 1,
    "WGL_EXT_extensions_string" => 1,
    "WGL_EXT_swap_control" => 1,
    "WGL_NV_vertex_array_range" => 1,
    "WGL_WINE_pixel_format_passthrough" => 1,
   );

my %enums = ();

sub parse_variable($)
{
    my $p = shift;
    my $ptype = '';
    my $pname = '';
    my $pnamebefore = '';
    my $pnameafter = '';

    while (my ($k, $v) = each(%$p)){
        if ($k eq 'ptype') {
            $ptype = ${$v}[0];
        } elsif ($k eq 'name') {
            $pname = ${$v}[0];
        } elsif ($k eq 'content') {
            if (ref($v) eq 'ARRAY') {
                my @n = @{$v};
                $pnamebefore = $n[0];
                $pnameafter = $n[1] if (@n > 0);
            } else {
                $pnameafter = $v;
            }
        }
    }
    $ptype = $pnamebefore . $ptype . $pnameafter;
    $ptype =~ s/ \*/\*/g;
    $ptype =~ s/ $//g;
    return [ $ptype, $pname ];
}

sub parse_file($$)
{
    my ($file, $generate_enums) = @_;
    my $xml = new XML::Simple;
    my $data = $xml->XMLin($file, ForceArray => 1);
    my %functions;

    # save all functions
    for my $command ( @{${$data->{commands}}[0]->{'command'}} ) {
        my $name = '';
        my $ret = '';
        my $params = [];
        my @alias = '';
        while (my ($k, $v) = each(%$command)){
            if ($k eq 'param') {
                push(@$params, parse_variable($_)) for (@{$v});
            } elsif ($k eq 'proto') {
                ($ret, $name) = @{parse_variable(${$v}[0])};
            }
        }
        $functions{$name} = [ $ret, $params ];
    }

    # save all enums (only GL)
    if ($generate_enums) {
        for my $enum ( @{$data->{'enums'}} ) {
            if (ref($enum->{'enum'}) eq "HASH") {
                while (my ($k, $v) = each(%{$enum->{'enum'}})){
                    $enums{$k} = $v->{'value'};
                }
            }
        }
    }

    # generate norm functions
    while (my ($k, $v) = each(%{$data->{feature}})) {
        if ($norm_categories{$k}) {
            for my $req (@{$v->{require}}) {
                for(keys %{$req->{command}}) {
                    $norm_functions{$_} = $functions{$_};
                }
            }
        }
    }

    # generate extension functions from norm functions, if they are newer than the category
    while (my ($k, $v) = each(%{$data->{feature}})) {
        if (!$norm_categories{$k} && $v->{api} =~ /^gl(\||$)/)
        {
            for my $req (@{$v->{require}}) {
                for (keys %{$req->{command}}) {
                    if (!$norm_functions{$_}) {
                        $ext_functions{$_} = [ $functions{$_}[0], $functions{$_}[1], [ $k ] ];
                    }
                }
            }
        }
    }

    # generate extension functions
    while (my ($k, $v) = each(%{${$data->{extensions}}[0]->{extension}})) {
        if ($v->{supported} =~ /^gl(\||$)/) {
            for my $req (@{$v->{require}}) {
                if (!defined $req->{api} || $req->{api} =~ /^gl(\||$)/) {
                    for (keys %{$req->{command}}) {
                        if (!$ext_functions{$_} && !$norm_functions{$_}) {
                            $ext_functions{$_} = [$functions{$_}[0], $functions{$_}[1], [ $k ]];
                        }
                        elsif ($ext_functions{$_}) {
                            push @{$ext_functions{$_}->[2]}, $k;
                        }
                    }
                }
            }
        }
        elsif ($v->{supported} =~ /^wgl$/) {
            for (keys %{${$v->{require}}[0]->{command}}) {
                if (defined $supported_wgl_extensions{$k}) {
                    $ext_functions{$_} = [ $functions{$_}[0], $functions{$_}[1], [ $k ] ];
                }
            }
        }
    }
}

parse_file( "gl.xml", 1 );
parse_file( "wgl.xml", 0 );

#
# Get the current wgl_driver.h version
#
my $wgl_version = 0;
open HEADER, "<$wgl_driver_file" or die "cannot open $wgl_driver_file";
while (<HEADER>)
{
    next unless /^#define WINE_WGL_DRIVER_VERSION (\d+)/;
    $wgl_version = $1;
    last;
}
close HEADER;

#
# Generate the wgl_driver.h file
#
open HEADER, ">$wgl_driver_file" or die "cannot create $wgl_driver_file";
print HEADER "/* Automatically generated from http://www.opengl.org/registry files; DO NOT EDIT! */\n\n";
print HEADER "#ifndef __WINE_WGL_DRIVER_H\n";
print HEADER "#define __WINE_WGL_DRIVER_H\n\n";
print HEADER "#ifndef WINE_GLAPI\n";
print HEADER "#define WINE_GLAPI\n";
print HEADER "#endif\n\n";

printf HEADER "#define WINE_WGL_DRIVER_VERSION %u\n\n", $wgl_version + 1;

print HEADER "struct wgl_context;\n";
print HEADER "struct wgl_pbuffer;\n\n";

print HEADER "struct opengl_funcs\n{\n";
print HEADER "    struct\n    {\n";
foreach (sort keys %wgl_functions)
{
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $wgl_functions{$_});
}
print HEADER "    } wgl;\n\n";

print HEADER "    struct\n    {\n";
foreach (sort keys %norm_functions)
{
    next if $_ eq "glDebugEntry";
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $norm_functions{$_});
}
print HEADER "    } gl;\n\n";

print HEADER "    struct\n    {\n";
foreach (sort keys %ext_functions)
{
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $ext_functions{$_});
}
print HEADER "    } ext;\n";
print HEADER "};\n\n";

print HEADER "#define ALL_WGL_FUNCS";
foreach (sort keys %norm_functions)
{
    next if $_ eq "glDebugEntry";
    printf HEADER " \\\n    USE_GL_FUNC(\%s)", $_;
}
print HEADER "\n\n";

print HEADER "extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );\n";
print HEADER "extern BOOL CDECL __wine_set_pixel_format( HWND hwnd, int format );\n\n";
print HEADER "#endif /* __WINE_WGL_DRIVER_H */\n";
close HEADER;

#
# Generate the wgl.h file
#
open HEADER, ">$wgl_file" or die "cannot create $wgl_file";
print HEADER "/* Automatically generated from http://www.opengl.org/registry files; DO NOT EDIT! */\n\n";
print HEADER "#ifndef __WINE_WGL_H\n";
print HEADER "#define __WINE_WGL_H\n\n";

print HEADER "#ifndef GLAPIENTRY\n";
print HEADER "#define GLAPIENTRY __stdcall\n";
print HEADER "#endif\n\n";

foreach (sort keys %arg_conv)
{
    printf HEADER "typedef %-22s %s;\n", $arg_conv{$_}[1], $_;
}
print HEADER "\n";

my $maxlen = 1;
foreach (keys %enums) { $maxlen = length($_) if length($_) > $maxlen; }
foreach (sort keys %enums)
{
    printf HEADER "#define %-*s %s\n", $maxlen, $_, $enums{$_};
}
print HEADER "\n";

foreach (sort keys %norm_functions)
{
    printf HEADER "%s;\n", get_func_proto("GLAPIENTRY %s", $_, $norm_functions{$_});
}

print HEADER "\n#endif /* __WINE_WGL_H */\n";
close HEADER;

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

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

print SPEC "@ stdcall wglChoosePixelFormat(long ptr)
@ stdcall wglCopyContext(long long long)
@ stdcall wglCreateContext(long)
@ stdcall wglCreateLayerContext(long long)
@ stdcall wglDeleteContext(long)
@ stdcall wglDescribeLayerPlane(long long long long ptr)
@ stdcall wglDescribePixelFormat(long long long ptr)
@ stdcall wglGetCurrentContext()
@ stdcall wglGetCurrentDC()
@ stub    wglGetDefaultProcAddress
@ stdcall wglGetLayerPaletteEntries(long long long long ptr)
@ stdcall wglGetPixelFormat(long)
@ stdcall wglGetProcAddress(str)
@ stdcall wglMakeCurrent(long long)
@ stdcall wglRealizeLayerPalette(long long long)
@ stdcall wglSetLayerPaletteEntries(long long long long ptr)
@ stdcall wglSetPixelFormat(long long ptr)
@ stdcall wglShareLists(long long)
@ stdcall wglSwapBuffers(long)
@ stdcall wglSwapLayerBuffers(long long)
@ stdcall wglUseFontBitmapsA(long long long long)
@ stdcall wglUseFontBitmapsW(long long long long)
@ 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") or die "cannot create $norm_file";
print NORM "
/* Auto-generated file... Do not edit ! */

#include \"config.h\"
#include <stdarg.h>
#include \"winternl.h\"
#include \"wingdi.h\"
#include \"wine/wgl.h\"
#include \"wine/wgl_driver.h\"
#include \"wine/debug.h\"

WINE_DEFAULT_DEBUG_CHANNEL(opengl);
";

foreach (sort keys %norm_functions) {
    my $string = GenerateThunk($_, $norm_functions{$_}, 1, "gl");
    print NORM "\n$string" if $string;
}

foreach (sort keys %wgl_functions) {
    print NORM generate_null_func($_, $wgl_functions{$_});
}
foreach (sort keys %norm_functions) {
    print NORM generate_null_func($_, $norm_functions{$_});
}
foreach (sort keys %ext_functions) {
    print NORM generate_null_func($_, $ext_functions{$_});
}

print NORM "\nstruct opengl_funcs null_opengl_funcs =\n{\n    {\n";
foreach (sort keys %wgl_functions) { print NORM "        null_$_,\n"; }
print NORM "    },\n    {\n";
foreach (sort keys %norm_functions) { print NORM "        null_$_,\n" unless $_ eq "glDebugEntry"; }
print NORM "    },\n    {\n";
foreach (sort keys %ext_functions) { print NORM "        null_$_,\n"; }
print NORM "    }\n};\n";

close(NORM);

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

#include \"config.h\"
#include <stdarg.h>
#include \"opengl_ext.h\"
#include \"winternl.h\"
#include \"wingdi.h\"
#include \"wine/wgl.h\"
#define WGL_WGLEXT_PROTOTYPES
#include \"wine/wglext.h\"
#include \"wine/wgl_driver.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";
foreach (sort keys %ext_functions) {
    my $string = GenerateThunk($_, $ext_functions{$_}, 0, "ext");
    print EXT "\nstatic $string" if $string;
}

# Then the table giving the string <-> function correspondence */
print EXT "\nconst OpenGL_extension extension_registry[$count] = {\n";
my $i = 0;
foreach (sort keys %ext_functions) {
    my $func_ref = $ext_functions{$_};
    printf EXT "  { \"%s\", \"%s\", %s }", $_, join(" ", sort @{$func_ref->[2]}), $_;
    if ($i != $count-1) {
        print EXT ",";
    }
    $i++;
    print EXT "\n";
}
print EXT "};\n";

close(EXT);
