Change close_and_rename() to read_only_bottom_close_and_rename()
[perl.git] / regen / overload.pl
1 #!/usr/bin/perl -w
2 #
3 # Regenerate (overwriting only if changed):
4 #
5 #    overload.h
6 #    overload.c
7 #    lib/overload/numbers.pm
8 #
9 # from information stored in the DATA section of this file.
10 #
11 # This allows the order of overloading constants to be changed.
12 #
13 # Accepts the standard regen_lib -q and -v args.
14 #
15 # This script is normally invoked from regen.pl.
16
17 BEGIN {
18     # Get function prototypes
19     require 'regen/regen_lib.pl';
20 }
21
22 use strict;
23
24 my (@enums, @names);
25 while (<DATA>) {
26   next if /^#/;
27   next if /^$/;
28   my ($enum, $name) = /^(\S+)\s+(\S+)/ or die "Can't parse $_";
29   push @enums, $enum;
30   push @names, $name;
31 }
32
33 my $c = safer_open('overload.c-new', 'overload.c');
34 my $h = safer_open('overload.h-new', 'overload.h');
35 mkdir("lib/overload", 0777) unless -d 'lib/overload';
36 my $p = safer_open('lib/overload/numbers.pm-new', 'lib/overload/numbers.pm');
37
38
39 select $p;
40
41 print read_only_top(lang => 'Perl', by => 'regen/overload.pl',
42                     file => 'lib/overload/numbers.pm', copyright => [2008]);
43
44 {
45 local $" = "\n    ";
46 print <<"EOF";
47 package overload::numbers;
48
49 our \@names = qw#
50     @names
51 #;
52
53 our \@enums = qw#
54     @enums
55 #;
56
57 { my \$i = 0; our %names = map { \$_ => \$i++ } \@names }
58
59 { my \$i = 0; our %enums = map { \$_ => \$i++ } \@enums }
60 EOF
61 }
62
63 for ([$c, 'overload.c'], [$h, 'overload.h']) {
64     my ($handle, $file) = @$_;
65     print $handle read_only_top(lang => 'C', by => 'regen/overload.pl',
66                                 file => $file, style => '*',
67                                 copyright => [1997, 1998, 2000, 2001,
68                                              2005 .. 2007, 2011]);
69 }
70
71 select $h;
72 print "enum {\n";
73
74 for (0..$#enums) {
75     my $op = $names[$_];
76     $op = 'fallback' if $op eq '()';
77     $op =~ s/^\(//;
78     die if $op =~ m{\*/};
79     my $l =   3 - int((length($enums[$_]) + 9) / 8);
80     $l = 1 if $l < 1;
81     printf "    %s_amg,%s/* 0x%02x %-8s */\n", $enums[$_],
82         ("\t" x $l), $_, $op;
83 }
84
85 print <<'EOF';
86     max_amg_code
87     /* Do not leave a trailing comma here.  C9X allows it, C89 doesn't. */
88 };
89
90 #define NofAMmeth max_amg_code
91 EOF
92
93 print $c <<'EOF';
94 #define AMG_id2name(id) (PL_AMG_names[id]+1)
95 #define AMG_id2namelen(id) (PL_AMG_namelens[id]-1)
96
97 static const U8 PL_AMG_namelens[NofAMmeth] = {
98 EOF
99
100 my $last = pop @names;
101
102 print $c map { "    " . (length $_) . ",\n" } @names;
103
104 my $lastlen = length $last;
105 print $c <<"EOT";
106     $lastlen
107 };
108
109 static const char * const PL_AMG_names[NofAMmeth] = {
110   /* Names kept in the symbol table.  fallback => "()", the rest has
111      "(" prepended.  The only other place in perl which knows about
112      this convention is AMG_id2name (used for debugging output and
113      'nomethod' only), the only other place which has it hardwired is
114      overload.pm.  */
115 EOT
116
117 for (0..$#names) {
118     my $n = $names[$_];
119     $n =~ s/(["\\])/\\$1/g;
120     my $l =   3 - int((length($n) + 7) / 8);
121     $l = 1 if $l < 1;
122     printf $c "    \"%s\",%s/* %-10s */\n", $n, ("\t" x $l), $enums[$_];
123 }
124
125 print $c <<"EOT";
126     "$last"
127 };
128 EOT
129
130 foreach ($h, $c, $p) {
131     read_only_bottom_close_and_rename($_);
132 }
133 __DATA__
134 # Fallback should be the first
135 fallback        ()
136
137 # These 5 are the most common in the fallback switch statement in amagic_call
138 to_sv           (${}
139 to_av           (@{}
140 to_hv           (%{}
141 to_gv           (*{}
142 to_cv           (&{}
143
144 # These have non-default cases in that switch statement
145 inc             (++
146 dec             (--
147 bool_           (bool
148 numer           (0+
149 string          (""
150 not             (!
151 copy            (=
152 abs             (abs
153 neg             (neg
154 iter            (<>
155 int             (int
156
157 # These 12 feature in the next switch statement
158 lt              (<
159 le              (<=
160 gt              (>
161 ge              (>=
162 eq              (==
163 ne              (!=
164 slt             (lt
165 sle             (le
166 sgt             (gt
167 sge             (ge
168 seq             (eq
169 sne             (ne
170
171 nomethod        (nomethod
172 add             (+
173 add_ass         (+=
174 subtr           (-
175 subtr_ass       (-=
176 mult            (*
177 mult_ass        (*=
178 div             (/
179 div_ass         (/=
180 modulo          (%
181 modulo_ass      (%=
182 pow             (**
183 pow_ass         (**=
184 lshift          (<<
185 lshift_ass      (<<=
186 rshift          (>>
187 rshift_ass      (>>=
188 band            (&
189 band_ass        (&=
190 bor             (|
191 bor_ass         (|=
192 bxor            (^
193 bxor_ass        (^=
194 ncmp            (<=>
195 scmp            (cmp
196 compl           (~
197 atan2           (atan2
198 cos             (cos
199 sin             (sin
200 exp             (exp
201 log             (log
202 sqrt            (sqrt
203 repeat          (x
204 repeat_ass      (x=
205 concat          (.
206 concat_ass      (.=
207 smart           (~~
208 ftest           (-X
209 regexp          (qr
210 # Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry
211 DESTROY         DESTROY