X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=regcomp.pl;h=14c2eb7be2e672e940dea1bd978d7c1c430e13fb;hb=404c68920bc89ad702536fbd16b3bceafd287acb;hp=d78321895cc25197638d0419e23fc00c17f9fc9c;hpb=22c35a8c2392967a5ba6b5370695be464bd7012c;p=p5sagit%2Fp5-mst-13.2.git diff --git a/regcomp.pl b/regcomp.pl index d783218..14c2eb7 100644 --- a/regcomp.pl +++ b/regcomp.pl @@ -1,43 +1,110 @@ +BEGIN { + # Get function prototypes + require 'regen_lib.pl'; +} #use Fatal qw(open close rename chmod unlink); +use strict; +use warnings; + open DESC, 'regcomp.sym'; -$ind = 0; +my $ind = 0; +my (@name,@rest,@type,@code,@args,@longj); +my ($desc,$lastregop); while () { - next if /^\s*($|\#)/; - $ind++; - chomp; - ($name[$ind], $desc, $rest[$ind]) = split /\t+/, $_, 3; - ($type[$ind], $code[$ind], $args[$ind], $longj[$ind]) - = split /[,\s]\s*/, $desc, 4; + s/#.*$//; + next if /^\s*$/; + s/\s*\z//; + if (/^-+\s*$/) { + $lastregop= $ind; + next; + } + unless ($lastregop) { + $ind++; + ($name[$ind], $desc, $rest[$ind]) = split /\t+/, $_, 3; + ($type[$ind], $code[$ind], $args[$ind], $longj[$ind]) + = split /[,\s]\s*/, $desc, 4; + } else { + my ($type,@lists)=split /\s*\t+\s*/, $_; + die "No list? $type" if !@lists; + foreach my $list (@lists) { + my ($names,$special)=split /:/, $list , 2; + $special ||= ""; + foreach my $name (split /,/,$names) { + my $real= $name eq 'resume' + ? "resume_$type" + : "${type}_$name"; + my @suffix; + if (!$special) { + @suffix=(""); + } elsif ($special=~/\d/) { + @suffix=(1..$special); + } elsif ($special eq 'FAIL') { + @suffix=("","_fail"); + } else { + die "unknown :type ':$special'"; + } + foreach my $suffix (@suffix) { + $ind++; + $name[$ind]="$real$suffix"; + $type[$ind]=$type; + $rest[$ind]="state for $type"; + } + } + } + + } } +# use fixed width to keep the diffs between regcomp.pl recompiles +# as small as possible. +my ($width,$rwidth,$twidth)=(22,12,9); +$lastregop ||= $ind; +my $tot = $ind; close DESC; -$tot = $ind; +die "Too many regexp/state opcodes! Maximum is 256, but there are $lastregop in file!" + if $lastregop>256; -$tmp_h = 'tmp_reg.h'; +my $tmp_h = 'tmp_reg.h'; unlink $tmp_h if -f $tmp_h; open OUT, ">$tmp_h"; +#*OUT=\*STDOUT; +binmode OUT; -print OUT < $lastregop - 1, + -$width, REGMATCH_STATE_MAX => $tot - 1 +; + + +for ($ind=1; $ind <= $lastregop ; $ind++) { + my $oind = $ind - 1; + printf OUT "#define\t%*s\t%d\t/* %#04x %s */\n", + -$width, $name[$ind], $ind-1, $ind-1, $rest[$ind]; +} +print OUT "\t/* ------------ States ------------- */\n"; +for ( ; $ind <= $tot ; $ind++) { + printf OUT "#define\t%*s\t(REGNODE_MAX + %d)\t/* %s */\n", + -$width, $name[$ind], $ind - $lastregop, $rest[$ind]; } print OUT <