#!/afs/sipb/project/perldev/p -w -0777
# compare numbers in two files (simple version)

use strict;
use IO::File;

my ($TRESHOLD) = 1e-14;

die "usage: numdiff fileA fileB\n" unless (@ARGV == 2);

my $ah = new IO::File $ARGV[0], 'r';
my @a = split /([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]\d+)?)/i, <$ah>;
# <$ah> is the entire file, because of -0777

my $bh = new IO::File $ARGV[1], 'r';
my @b = split /([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]\d+)?)/i, <$bh>;
# <$bh> is the entire file, because of -0777

my ($ax, $bx, $diff);

while (1) {
  (@a || @b) || last;
  @a || die "mismatch: EOF A, file B has extra '".join('', @b)."'\n";
  @b || die "mismatch: EOF B, file A has extra '".join('', @a)."'\n";

  $ax = shift(@a);   $ax =~ s/^\s+//;   $ax =~ s/\s+$//;
  $bx = shift(@b);   $bx =~ s/^\s+//;   $bx =~ s/\s+$//;

  ($ax eq $bx) || die "mismatch: non-numbers '$ax' vs '$bx'\n";

  (@a || @b) || last;
  @a || die "mismatch: EOF A, file B has extra '".join('', @b)."'\n";
  @b || die "mismatch: EOF B, file A has extra '".join('', @a)."'\n";

  $ax = shift(@a);
  $bx = shift(@b);

  $diff = abs($ax - $bx);
  ($diff < $TRESHOLD) || die "mismatch: $ax vs $bx (difference = $diff)\n";

  #print "[$ax] [$bx]\n";
}
