This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Guard clause should happen first, otherwise its not a guard clause.
[perl5.git] / regcomp.pl
1 BEGIN {
2     # Get function prototypes
3     require 'regen_lib.pl';
4 }
5 #use Fatal qw(open close rename chmod unlink);
6 open DESC, 'regcomp.sym';
7 $ind = 0;
8
9 while (<DESC>) {
10   next if /^\s*($|\#)/;
11   $ind++;
12   chomp;
13   ($name[$ind], $desc, $rest[$ind]) = split /\t+/, $_, 3;
14   ($type[$ind], $code[$ind], $args[$ind], $longj[$ind]) 
15     = split /[,\s]\s*/, $desc, 4;
16 }
17 close DESC;
18 $tot = $ind;
19 die "Too many regexp opcodes! Maximum is 256, but there are $tot in file!"
20     if $tot>256;
21
22 $tmp_h = 'tmp_reg.h';
23
24 unlink $tmp_h if -f $tmp_h;
25
26 open OUT, ">$tmp_h";
27 binmode OUT;
28
29 print OUT <<EOP;
30 /* -*- buffer-read-only: t -*-
31    !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!!
32    This file is built by regcomp.pl from regcomp.sym.
33    Any changes made here will be lost!
34 */
35
36 EOP
37
38 $ind = 0;
39 while (++$ind <= $tot) {
40   $oind = $ind - 1;
41   $hind = sprintf "%#4x", $oind;
42   print OUT <<EOP;
43 #define $name[$ind]     $oind   /* $hind $rest[$ind] */
44 EOP
45 }
46
47 print OUT <<EOP;
48
49 #ifndef DOINIT
50 EXTCONST U8 PL_regkind[];
51 #else
52 EXTCONST U8 PL_regkind[] = {
53 EOP
54
55 $ind = 0;
56 while (++$ind <= $tot) {
57   print OUT <<EOP;
58         $type[$ind],            /* $name[$ind] */
59 EOP
60 }
61
62 print OUT <<EOP;
63 };
64 #endif
65
66
67 #ifdef REG_COMP_C
68 static const U8 regarglen[] = {
69 EOP
70
71 $ind = 0;
72 while (++$ind <= $tot) {
73   $size = 0;
74   $size = "EXTRA_SIZE(struct regnode_$args[$ind])" if $args[$ind];
75   
76   print OUT <<EOP;
77         $size,          /* $name[$ind] */
78 EOP
79 }
80
81 print OUT <<EOP;
82 };
83
84 static const char reg_off_by_arg[] = {
85 EOP
86
87 $ind = 0;
88 while (++$ind <= $tot) {
89   $size = $longj[$ind] || 0;
90
91   print OUT <<EOP;
92         $size,          /* $name[$ind] */
93 EOP
94 }
95
96 print OUT <<EOP;
97 };
98
99 #ifdef DEBUGGING
100 static const char * const reg_name[] = {
101 EOP
102
103 $ind = 0;
104 while (++$ind <= $tot) {
105   $hind = sprintf "%#4x", $ind-1;
106   $size = $longj[$ind] || 0;
107
108   print OUT <<EOP;
109         "$name[$ind]",          /* $hind */
110 EOP
111 }
112
113 print OUT <<EOP;
114 };
115
116 static const int reg_num = $tot;
117
118 #endif /* DEBUGGING */
119 #endif /* REG_COMP_C */
120
121 /* ex: set ro: */
122 EOP
123
124 close OUT or die "close $tmp_h: $!";
125
126 safer_rename $tmp_h, 'regnodes.h';