#!/usr/bin/perl

use POSIX;

$| = 1;
$testno=0;
$pass=1;
$badtests=();
$nbad=0;
$lc=0;

while($l = <>)
{
  chomp($l);
  if($l =~ /^TEST(\d+)$/)
  {
    $testno = $1;
    if(exists $badtests->{$testno})
    {
      print "$l\t\t\t!\n";
    }
    else
    {
      print "$l\n";
    }
  }
  elsif($l =~ /^\*.*\*$/)
  {
    @t = split /\*/,$l;
    if($pass==1)
    {
      if($t[2] ne $t[3])
      {
	$badtests->{$testno} = 1;
	$nbad++;
	print "$l\t\t\t!\n";
      }
      else
      {
	print "$l\n";
      }
    }
    else
    {
      $layout = $t[1];
      $write = $t[2];
      print "$l\n";
    }
  }
  elsif($l =~ /^#029p/)
  {
    print "$l\n";
    $pass++;
  }
  elsif($l =~ /^#029s/)
  {
    print "$l\n";
    print "SPILL ERROR\n";
    exit(-1);
  }
  elsif($l =~ /^NUMBER:\s+([-0-9.]+)\s*'([-0-9 ]+)$/)
  {
    $n1 = $1;
    $n2 = $2;
    $number = $n1*10**$n2;
    print "$l\n";
    print "NUMBER': $n1 $n2 $number\n";
  }
  elsif($l =~ /^NUMBER:\s+([-0-9.]+)\s+$/)
  {
    $number = $1;
    print "$l\n";
    print "NUMBER: $number\n";
  }
  elsif($l =~ /^([- 0-9]{4})([- 0-9]{4})([- 0-9]{4})([- 0-9]{4})([- 0-9]{4})([- 0-9]{4})$/)
  {
    $b = $1;
    $h = $2;
    $d = $3;
    $ndig = $4;
    print "$l\n";
#   if($layout =~ /'/)
    if(1)
    {
      print "LAYOUT: $b $h $d $ndig $layout $write $number\n";
      $ndig2 = 0;
      $number2 = abs($number);
      if($number2 != 0)
      {
	$ndig2 = -floor(log($number2)/log(10)+1e-14);
      if($ndig2 != $ndig)
      {
	print "NDIG MISMATCH: $ndig $ndig2 $number\n";
      }
      $exponent = 0;
      if($write =~ /'(.*)$/)
      {
	$exponent = $1;
      }
      $ls->{$lc}->{"b"} = $b;
      $ls->{$lc}->{"h"} = $h;
      $ls->{$lc}->{"d"} = $d;
      $ls->{$lc}->{"ndig"} = $ndig2;
      $ls->{$lc}->{"exponent"} = $exponent;
      $ls->{$lc}->{"layout"} = $layout;
      $ls->{$lc}->{"write"} = $write;
      $ls->{$lc}->{"n0"} = $h+$d-$b;
      print "layout: $layout b: $b h: $h d: $d ndig: $ndig2 exponent: $exponent n0: ".$ls->{$lc}->{"n0"}."\n";
      $lc++;
      }
    }
  }
  else
  {
    print "$l\n";
  }
}

open LIST,">0list.asc";
foreach $lc (keys %$ls)
{
  print LIST $ls->{$lc}->{"b"}."\t";
  print LIST $ls->{$lc}->{"h"}."\t";
  print LIST $ls->{$lc}->{"d"}."\t";
  print LIST $ls->{$lc}->{"ndig"}."\t";
  print LIST $ls->{$lc}->{"exponent"}."\t";
  print LIST "\"".$ls->{$lc}->{"layout"}."\"\t";
  print LIST "\"".$ls->{$lc}->{"write"}."\"\n";
}
close LIST;

$minerror = 999999;
$bestnzero=0;
if(1)
{
  for($f1=-1; $f1<=1; $f1++)
  {
  for($f2=-1; $f2<=1; $f2++)
  {
  for($f3=-1; $f3<=1; $f3++)
  {
  for($f4=-1; $f4<=1; $f4++)
  {
  for($f5=-1; $f5<=1; $f5++)
  {
  for($f6=-1; $f6<=1; $f6++)
  {
  for($f7=-1; $f7<=1; $f7++)
  {
  for($f8=-1; $f8<=1; $f8++)
  {
  for($f9=-1; $f9<=1; $f9++)
  {
  for($f10=-1; $f10<=1; $f10++)
  {
  for($f11=-1; $f11<=1; $f11++)
  {
    $sumerr=0;
    foreach $lc (keys %$ls)
    {
      $b = $ls->{$lc}->{"b"};
      $h = $ls->{$lc}->{"h"};
      $d = $ls->{$lc}->{"d"};
      $ndig = $ls->{$lc}->{"ndig"};
      $exponent = $ls->{$lc}->{"exponent"};
      $n0 = $ls->{$lc}->{"n0"};
      $exponent2 = floor(($f1*$b + $f2*$h + $f3*$d + $f4*$ndig + $f5)/($n0+1))*($n0+1)*$f11 +
	            $f6*$b + $f7*$h + $f8*$d + $f9*$ndig + $f10;
      $err = abs($exponent-$exponent2);
      $sumerr+=$err;
    }
    if($sumerr <= $minerror)
    {
      $bestnzero=0 if($sumerr<$minerror);
      $nzero=0;
      $nzero++ if($f1==0);
      $nzero++ if($f2==0);
      $nzero++ if($f3==0);
      $nzero++ if($f4==0);
      $nzero++ if($f5==0);
      $nzero++ if($f6==0);
      $nzero++ if($f7==0);
      $nzero++ if($f8==0);
      $nzero++ if($f9==0);
      $nzero++ if($f10==0);
      $nzero++ if($f11==0);
      if($nzero > $bestnzero || $sumerr<$minerror)
      {
	print "$f1 $f2 $f3 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11  $sumerr\n";
	$b1 = $f1;
	$b2 = $f2;
	$b3 = $f3;
	$b4 = $f4;
	$b5 = $f5;
	$b6 = $f6;
	$b7 = $f7;
	$b8 = $f8;
	$b9 = $f9;
	$b10 = $f10;
	$b11 = $f11;
	$bestnzero=$nzero;
      }
      $minerror = $sumerr;
    }
  }
  }
  }
  }
  }
  }
  }
  }
  }
  }
  }
}
else
{
$b1 = -1;
$b2 = 0;
$b3 = 1;
$b4 = -1;
$b5 = 1;
$b6 = 0;
$b7 = 0;
$b8 = 0;
$b9 = 0;
$b10 = 0;
$b11 = 1;
$minerror=0;
}

foreach $lc (keys %$ls)
{
  $b = $ls->{$lc}->{"b"};
  $h = $ls->{$lc}->{"h"};
  $d = $ls->{$lc}->{"d"};
  $ndig = $ls->{$lc}->{"ndig"};
  $exponent = $ls->{$lc}->{"exponent"};
  $layout = $ls->{$lc}->{"layout"};
  $write = $ls->{$lc}->{"write"};
  $n0 = $ls->{$lc}->{"n0"};
  $exponent2 = floor(($b1*$b + $b2*$h + $b3*$d + $b4*$ndig + $b5)/($n0+1))*($n0+1)*$b11 +
		$b6*$b + $b7*$h + $b8*$d + $b9*$ndig + $b10;
  $err = abs($exponent-$exponent2);
  $minerror += $err;
  print "$layout $write $exponent $exponent2 $err\n";
}
print "\nnbad: $nbad minerror: $minerror\n";
print STDERR "\nnbad: $nbad minerror: $minerror\n";

