#!perl -w
use strict;
my $file = __FILE__;
$file =~ s/\.PL$//;
chmod(0666,$file) unless -w $file;
rename($file,"$file.old") unless -w $file;
open(F,">$file") || die "Cannot open $file:$!";
select(F);
my @vtable = qw(Tkoption Lang Tkevent Tk Tkint Tkglue Tkintdecls Tkdecls Tcldecls);
my @wtable = qw(Tkintxlibdecls Tkplatdecls Tkintplatdecls);
my @utable = qw(Xlib);
my @tix = qw(Tix Tixint);
my @tixxpm = qw(Tiximgxpm);
my @photo = qw(Tkimgphoto Imgint);
my @event = qw(Tkevent);
my $maxl = 0;
length > $maxl and $maxl = length foreach (@vtable,@wtable,@utable);
print <<'END';
#define IMPORT_VTABLE(ptr,type,name) do { \
ptr = INT2PTR(type *,SvIV(get_sv(name,GV_ADDWARN|GV_ADD))); \
if ((*ptr->tabSize)() != sizeof(type)) { \
Perl_warn(aTHX_ "%s wrong size for %s",name,#type); \
} \
} while (0)
END
print "#ifdef WIN32\n";
do_tables(VTABLES => @vtable,@wtable);
print "#else\n";
do_tables(VTABLES => @vtable,@utable);
print "#endif\n";
do_tables(TIX => @tix);
do_tables(PHOTO => @photo);
do_tables(EVENT => @event);
do_tables(TIXXPM => @tixxpm);
sub do_tables
{
my $name = shift;
my @tables = sort(@_);
print "#define DECLARE_$name\t\\\n";
while (@tables)
{
my $tab = shift(@tables);
my $pad = ' ' x ($maxl - length($tab));
print $tab,"Vtab$pad *",$tab,"Vptr";
print ";$pad\\" if @tables;
print "\n";
}
print "\n";
print "#define IMPORT_$name\tdo { \\\n";
foreach my $tab (sort @_)
{
my $pad = ' ' x ($maxl - length($tab));
print qq/IMPORT_VTABLE(${tab}Vptr$pad,$pad${tab}Vtab,"Tk::${tab}Vtab");$pad \\\n/;
}
print "} while (0)\n";
}