X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=overload.pl;h=6f0fe34ffd83879e5ccd2d5599f7a745ec49dac3;hb=08d0d8ab11be611f4baf746cfb6ff7791962f494;hp=6b1050e6854c75275d1a7eaac567e9b1ee47b94b;hpb=d279ab826c469db5d93d3d728fdcf1acd9265665;p=p5sagit%2Fp5-mst-13.2.git diff --git a/overload.pl b/overload.pl index 6b1050e..6f0fe34 100644 --- a/overload.pl +++ b/overload.pl @@ -12,6 +12,8 @@ BEGIN { use strict; +use File::Spec::Functions qw(catdir catfile);; + my (@enums, @names); while () { next if /^#/; @@ -21,11 +23,48 @@ while () { push @names, $name; } -safer_unlink ('overload.h', 'overload.c'); -die "overload.h: $!" unless open(C, ">overload.c"); -binmode C; -die "overload.h: $!" unless open(H, ">overload.h"); -binmode H; +safer_unlink ('overload.h', 'overload.c', catfile(qw(lib overload numbers.pm))); +my $c = safer_open("overload.c"); +my $h = safer_open("overload.h"); +mkdir("lib/overload") unless -d catdir(qw(lib overload)); +my $p = safer_open(catfile(qw(lib overload numbers.pm))); + + +select $p; + +{ +local $" = "\n "; +print <<"EOF"; +# -*- buffer-read-only: t -*- +# +# lib/overload/numbers.pm +# +# Copyright (C) 2008 by Larry Wall and others +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by overload.pl +# + +package overload::numbers; + +our \@names = qw# + @names +#; + +our \@enums = qw# + @enums +#; + +{ my \$i = 0; our %names = map { \$_ => \$i++ } \@names } + +{ my \$i = 0; our %enums = map { \$_ => \$i++ } \@enums } + +EOF +} + sub print_header { my $file = shift; @@ -46,10 +85,10 @@ sub print_header { EOF } -select C; +select $c; print_header('overload.c'); -select H; +select $h; print_header('overload.h'); print <<'EOF'; @@ -67,23 +106,24 @@ print <<'EOF'; EOF -print C <<'EOF'; +print $c <<'EOF'; #define AMG_id2name(id) (PL_AMG_names[id]+1) +#define AMG_id2namelen(id) (PL_AMG_namelens[id]-1) -const U8 PL_AMG_namelens[NofAMmeth] = { +static const U8 PL_AMG_namelens[NofAMmeth] = { EOF my $last = pop @names; -print C " $_,\n" foreach map { length $_ } @names; +print $c " $_,\n" foreach map { length $_ } @names; my $lastlen = length $last; -print C <<"EOT"; +print $c <<"EOT"; $lastlen }; -char * const PL_AMG_names[NofAMmeth] = { +static const char * const PL_AMG_names[NofAMmeth] = { /* Names kept in the symbol table. fallback => "()", the rest has "(" prepended. The only other place in perl which knows about this convention is AMG_id2name (used for debugging output and @@ -91,15 +131,16 @@ char * const PL_AMG_names[NofAMmeth] = { overload.pm. */ EOT -print C " \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names; +print $c " \"$_\",\n" foreach map { s/(["\\"])/\\$1/g; $_ } @names; -print C <<"EOT"; +print $c <<"EOT"; "$last" }; EOT -close H or die $!; -close C or die $!; +safer_close($h); +safer_close($c); +safer_close($p); __DATA__ # Fallback should be the first