X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=regcomp.pl;h=17472cc8110f1494430a4e8d35afe7dd65a416a5;hb=cd7f9af76f0d337e0b6ef5b49db2576247d0d50f;hp=d7d07330109c9432c16551d88c63064a8d281187;hpb=9b155405e1006cdd8b8d8ffbf82a0cdd100aa3a4;p=p5sagit%2Fp5-mst-13.2.git diff --git a/regcomp.pl b/regcomp.pl index d7d0733..17472cc 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 <) { + if (/#define\s+(RXf_\w+)\s+(0x[A-F\d]+)/i) { + $rxfv{$1}= eval $2; + $val|=$rxfv{$1}; + } +} +my %vrxf=reverse %rxfv; +printf OUT "\t/* Bits in extflags defined: %032b */\n",$val; +for (0..31) { + my $n=$vrxf{2**$_}||"UNUSED_BIT_$_"; + $n=~s/^RXf_(PMf_)?//; + printf OUT qq(\t%-20s/* 0x%08x */\n), + qq("$n",),2**$_; +} + +print OUT <