123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- #!/usr/bin/perl
- use strict;
- use warnings;
- use autodie; # die if problem reading or writing a file
- my $filein = "./agast.txt";
- my $fileout = "./agast_new.txt";
- my $i1=1;
- my $i2=1;
- my $i3=1;
- my $tmp;
- my $ifcount0=0;
- my $ifcount1=0;
- my $ifcount2=0;
- my $ifcount3=0;
- my $ifcount4=0;
- my $elsecount;
- my $myfirstline = $ARGV[0];
- my $mylastline = $ARGV[1];
- my $tablename = $ARGV[2];
- my @array0 = ();
- my @array1 = ();
- my @array2 = ();
- my @array3 = ();
- my $homogeneous;
- my $success_homogeneous;
- my $structured;
- my $success_structured;
- open(my $in1, "<", $filein) or die "Can't open $filein: $!";
- open(my $out, ">", $fileout) or die "Can't open $fileout: $!";
- $array0[0] = 0;
- $i1=1;
- while (my $line1 = <$in1>)
- {
- chomp $line1;
- $array0[$i1] = 0;
- if (($i1>=$myfirstline)&&($i1<=$mylastline))
- {
- if($line1=~/if\(ptr\[offset(\d+)/)
- {
- if($line1=~/if\(ptr\[offset(\d+).*\>.*cb/)
- {
- $tmp=$1;
- }
- else
- {
- if($line1=~/if\(ptr\[offset(\d+).*\<.*c\_b/)
- {
- $tmp=$1+128;
- }
- else
- {
- die "invalid array index!"
- }
- }
- $array1[$ifcount1] = $tmp;
- $array0[$ifcount1] = $i1;
- $ifcount1++;
- }
- else
- {
- }
- }
- $i1++;
- }
- $homogeneous=$ifcount1;
- $success_homogeneous=$ifcount1+1;
- $structured=$ifcount1+2;
- $success_structured=$ifcount1+3;
- close $in1 or die "Can't close $filein: $!";
- open($in1, "<", $filein) or die "Can't open $filein: $!";
- $i1=1;
- while (my $line1 = <$in1>)
- {
- chomp $line1;
- if (($i1>=$myfirstline)&&($i1<=$mylastline))
- {
- if ($array0[$ifcount2] == $i1)
- {
- $array2[$ifcount2]=0;
- $array3[$ifcount2]=0;
- if ($array0[$ifcount2+1] == ($i1+1))
- {
- $array2[$ifcount2]=($ifcount2+1);
- }
- else
- {
- open(my $in2, "<", $filein) or die "Can't open $filein: $!";
- $i2=1;
- while (my $line2 = <$in2>)
- {
- chomp $line2;
- if ($i2 == $i1)
- {
- last;
- }
- $i2++;
- }
- my $line2 = <$in2>;
- chomp $line2;
- if ($line2=~/goto (\w+)/)
- {
- $tmp=$1;
- if ($tmp eq "homogeneous")
- {
- $array2[$ifcount2]=$homogeneous;
- }
- if ($tmp eq "success_homogeneous")
- {
- $array2[$ifcount2]=$success_homogeneous;
- }
- if ($tmp eq "structured")
- {
- $array2[$ifcount2]=$structured;
- }
- if ($tmp eq "success_structured")
- {
- $array2[$ifcount2]=$success_structured;
- }
- }
- else
- {
- die "goto expected: $!";
- }
- close $in2 or die "Can't close $filein: $!";
- }
- #find next else and interpret it
- open(my $in3, "<", $filein) or die "Can't open $filein: $!";
- $i3=1;
- $ifcount3=0;
- $elsecount=0;
- while (my $line3 = <$in3>)
- {
- chomp $line3;
- $i3++;
- if ($i3 == $i1)
- {
- last;
- }
- }
- while (my $line3 = <$in3>)
- {
- chomp $line3;
- $ifcount3++;
- if (($elsecount==0)&&($i3>$i1))
- {
- if ($line3=~/goto (\w+)/)
- {
- $tmp=$1;
- if ($tmp eq "homogeneous")
- {
- $array3[$ifcount2]=$homogeneous;
- }
- if ($tmp eq "success_homogeneous")
- {
- $array3[$ifcount2]=$success_homogeneous;
- }
- if ($tmp eq "structured")
- {
- $array3[$ifcount2]=$structured;
- }
- if ($tmp eq "success_structured")
- {
- $array3[$ifcount2]=$success_structured;
- }
- }
- else
- {
- if ($line3=~/if\(ptr\[offset/)
- {
- $ifcount4=0;
- while ($array0[$ifcount4]!=$i3)
- {
- $ifcount4++;
- if ($ifcount4==$ifcount1)
- {
- die "if else match expected: $!";
- }
- $array3[$ifcount2]=$ifcount4;
- }
- }
- else
- {
- die "elseif or elsegoto match expected: $!";
- }
- }
- last;
- }
- else
- {
- if ($line3=~/if\(ptr\[offset/)
- {
- $elsecount++;
- }
- else
- {
- if ($line3=~/else/)
- {
- $elsecount--;
- }
- }
- }
- $i3++;
- }
- printf("%3d [%3d][0x%08x]\n", $array0[$ifcount2], $ifcount2, (($array1[$ifcount2]&15)<<28)|($array2[$ifcount2]<<16)|(($array1[$ifcount2]&128)<<5)|($array3[$ifcount2]));
- close $in3 or die "Can't close $filein: $!";
- $ifcount2++;
- }
- else
- {
- }
- }
- $i1++;
- }
- printf(" [%3d][0x%08x]\n", $homogeneous, 252);
- printf(" [%3d][0x%08x]\n", $success_homogeneous, 253);
- printf(" [%3d][0x%08x]\n", $structured, 254);
- printf(" [%3d][0x%08x]\n", $success_structured, 255);
- close $in1 or die "Can't close $filein: $!";
- $ifcount0=0;
- $ifcount2=0;
- printf $out " static const unsigned long %s[] = {\n ", $tablename;
- while ($ifcount0 < $ifcount1)
- {
- printf $out "0x%08x, ", (($array1[$ifcount0]&15)<<28)|($array2[$ifcount0]<<16)|(($array1[$ifcount0]&128)<<5)|($array3[$ifcount0]);
- $ifcount0++;
- $ifcount2++;
- if ($ifcount2==8)
- {
- $ifcount2=0;
- printf $out "\n";
- printf $out " ";
- }
- }
- printf $out "0x%08x, ", 252;
- $ifcount0++;
- $ifcount2++;
- if ($ifcount2==8)
- {
- $ifcount2=0;
- printf $out "\n";
- printf $out " ";
- }
- printf $out "0x%08x, ", 253;
- $ifcount0++;
- $ifcount2++;
- if ($ifcount2==8)
- {
- $ifcount2=0;
- printf $out "\n";
- printf $out " ";
- }
- printf $out "0x%08x, ", 254;
- $ifcount0++;
- $ifcount2++;
- if ($ifcount2==8)
- {
- $ifcount2=0;
- printf $out "\n";
- printf $out " ";
- }
- printf $out "0x%08x\n", 255;
- $ifcount0++;
- $ifcount2++;
- printf $out " };\n\n";
- $#array0 = -1;
- $#array1 = -1;
- $#array2 = -1;
- $#array3 = -1;
- close $out or die "Can't close $fileout: $!";
|