285 lines
8.4 KiB
Perl
285 lines
8.4 KiB
Perl
#!/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: $!";
|