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 interprete 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: $!";
 | 
