#!/usr/bin/perl -w # Since the sdl_const.pl and gl_const.pl scripts with 2.0-beta2 don't seem to # work at all, this script takes SDL/Constans.pm and OpenGL/Constants.pm (as # original from 2.0-beta2) and fixes them up, and moves them into ../lib/ # I already did this for 1.20.2, so you need to run this only if you intent # to rebuild the .pm files. # See http://Bloodgate.com/perl/sdl/sdl_perl.html use strict; ############################################################################## my $sdl = read_file('SDL/Constants.pm'); # remove 'main::' on subs $sdl =~ s/sub main::([\w]+)/sub $1/g; # turn on () on subs to make peep optimizer to inline them #$sdl =~ s/sub ([\w]+)\s+{/sub $1 () {/g; write_file('../lib/SDL/Constants.pm',insert_export($sdl)); undef $sdl; ############################################################################## my $gl = read_file('OpenGL/Constants.pm'); # remove 'main::' on subs $gl =~ s/sub main::([\w]+)/sub $1/g; # turn on () on subs to make peep optimizer to inline them #$gl =~ s/sub ([\w]+)\s+{/sub $1 () {/g; write_file ('../lib/SDL/OpenGL/Constants.pm',insert_export($gl,grep_constants())); 1; sub read_file { my $file = shift; print "Reading $file..."; my $FILE; open $FILE, $file or die ("Cannot read $file: $!\n"); local $/; # slurp mode my $doc = <$FILE>; close $FILE; print "done.\n"; $doc; } sub write_file { my ($file,$txt) = @_; print "Writing $file..."; my $FILE; open $FILE, ">$file" or die ("Cannot write $file: $!\n"); print $FILE $txt; close $FILE; print "done.\n"; } sub insert_export { my $txt = shift; my @sub = (); # gather all sub names $txt =~ s/sub ([\w]+)\s+/push @sub, $1; 'sub ' . $1 . ' '/eg; # if we got a second list of names, parse it and include anything that isn't # alreay in my $add = ""; if (ref($_[0]) eq 'ARRAY') { my $const = shift; foreach my $c (sort @$const) { if ( grep (/^$c->[0]$/, @sub) == 0) { print "Adding $c->[0] $c->[1]\n"; $add .= "sub $c->[0] () { $c->[1] }\n"; push @sub, $c->[0]; } } $add .= "\n"; } # SDL/Constants.pm contains doubles :-( So filter them out. my @sorted = sort @sub; my $last; @sub = (); my @doubles; foreach my $cur (@sorted) { if (defined $last && $last eq $cur) { # double! push @doubles,$last; } else { push @sub, $last if defined $last; } $last = $cur; } foreach my $cur (@doubles) { $txt =~ s/\bsub $cur.*//g; # remove } my $export = "require Exporter;\nuse strict;\n"; $export .= "use vars qw/\$VERSION \@ISA \@EXPORT/;"; $export .= "\n\@ISA = qw/Exporter/;\n"; # this makes Exporter export the symbols from SDL::Constants to whatever # package used SDL::Constants (usually SDL::Event.pm) my $pack; if ($txt =~ /SDL::Constants/) { $txt =~ s/SDL::Constants/SDL::Event/g; $pack = 'SDL::Event'; } if ($txt =~ /SDL::OpenGL::Constants/) { $txt =~ s/SDL::OpenGL::Constants/SDL::OpenGL/g; $pack = 'SDL::OpenGL'; } $export .= "\nsub import { $pack\->export_to_level(1, \@_); }\n"; $export .= "\n\@EXPORT = qw/\n"; my $line = "\t"; foreach my $s (sort @sub) { if (length($line)+length($s) > 70) { $export .= "$line\n"; $line = "\t"; } $line .= "$s "; } $export .= "$line /;\n"; # insert Exporter section $txt =~ s/sub/$export\n\n$add\nsub/; $txt; } sub grep_constants { # grep all the OpenGL constants from SDL and return them my $sdl_gl = read_file('/usr/include/GL/gl.h'); my @const = (); $sdl_gl =~ s/^#define (GL_.*?)\s+(0x[\da-fA-F]+)/push @const,[$1,$2];/egm; \@const; } END { print "\n"; }