#!/usr/bin/perl
##
## Copyright (C) 2003-2007, Marcelo E. Magallon <mmagallo[]debian org>
## Copyright (C) 2003-2007, Milan Ikits <milan ikits[]ieee org>
##
## This program is distributed under the terms and conditions of the GNU
## General Public License Version 2 as published by the Free Software
## Foundation or, at your option, any later version.

use strict;
use warnings;

do 'bin/make.pl';

#---------------------------------------------------------------------------------------

# function pointer definition
sub make_init_call($%)
{
    my $name = prefixname($_[0]);
    return "  r = r || (" . $_[0] . " = (PFN" . (uc $_[0]) . "PROC)glewGetProcAddress(\"" . $name . "\")) == NULL;";
}

#---------------------------------------------------------------------------------------

my @extlist = ();
my %extensions = ();

if (@ARGV)
{
    @extlist = @ARGV;

	foreach my $ext (sort @extlist)
	{
		my ($extname, $exturl, $types, $tokens, $functions, $exacts) = parse_ext($ext);

		my $extvar = $extname;
		$extvar =~ s/GL(X*)_/GL$1EW_/;

		my $extpre = $extname;
		$extpre =~ s/^(W?)GL(X?).*$/\l$1gl\l$2ew/;

		#my $pextvar = prefix_varname($extvar);

		print "#ifdef $extname\n";
		print "  CONST_CAST(" . $extvar . ") = " . $extpre . "GetExtension(\"$extname\");\n";
		if (keys %$functions)
		{
			if ($extname =~ /WGL_.*/)
			{
				print "  if (glewExperimental || " . $extvar . "|| crippled) CONST_CAST(" . $extvar . ")= !_glewInit_$extname(GLEW_CONTEXT_ARG_VAR_INIT);\n";
			}
			else
			{
				print "  if (glewExperimental || " . $extvar . ") CONST_CAST(" . $extvar . ") = !_glewInit_$extname(GLEW_CONTEXT_ARG_VAR_INIT);\n";
			}
		}
		print "#endif /* $extname */\n";
	}

}
