#!/usr/bin/perl
use strict;
#use warnings; # produces warnings like: Hexadecimal number > 0xffffffff non-portable at ./project2-postScript.pl line 64.
my $DEBUG = 0;
sub fileToString{
my $file_ = $_[0];
my $msg = "Input file '" . $file_ . "' failed to open.\n" . "Died";
my $terminator = $/;
undef $/;
open INPUT, "<$file_" or die $msg;
my $str = ; # terminator undefined : $str is the whole file.
close INPUT;
$/ = $terminator; # Restore for normal behavior later
return $str;
}
sub stringToFile{
my ($str, $filename) = @_;
open OUTPUT, ">$filename" or die("ERROR: Unable to create $filename: $!");
print OUTPUT "$str";
close OUTPUT;
}
if( $#ARGV + 1 < 1){
die("Usage $0: [answer_key_filename]");
}
my $commandLineArgsFilename = shift;
my $stdinFilename = shift;
my $resultsFilename = shift;
my $answerKeyFilename = shift;
if( ! defined( $answerKeyFilename)){
$answerKeyFilename = "";
}
if( $DEBUG == 1){
print STDERR "commandLineArgsFilename: $commandLineArgsFilename\n";
print STDERR "stdinFilename: $stdinFilename\n";
print STDERR "resultsFilename: $resultsFilename\n";
print STDERR "answerKeyFilename: $answerKeyFilename\n";
}
my $fileContents = fileToString( $resultsFilename);
if( $fileContents !~ m/Free chunk at (0x[0-9A-Fa-f]+)/){
print "Unable to find base address using 'Free chunk at 0x' as an anchor!\n";
if( $fileContents !~ m/(0x[0-9A-Fa-f]+)/){
print "Unable to find base address using '0x' as an anchor!\n";
}
}
my $baseAddress = hex($1);
# printf( "baseAddress: $baseAddress (0x%X)\n", $baseAddress);
my $offset = $baseAddress - hex('0x100000000');
# printf( "offset: $offset (0x%X)\n", $offset);
my @fileContents = split( /0x/, $fileContents);
for( my $i = 1; $i <= $#fileContents; $i++){
if( $fileContents[ $i] !~ m/^([0-9A-Fa-f]+)/){
print "ERROR: Unable to parse address from $fileContents[$i]!\n";
die();
}
if( $1 == "0"){
# skip over 0x0
next;
}
my $addr = $1;
my $addrAdjusted = sprintf("%x", hex($addr) - $offset);
# printf( "$addrAdjusted = hex($addr) - $offset\n");
# print "fileContents[$i] (before): $fileContents[$i]\n";
$fileContents[$i] =~ s/^$addr/$addrAdjusted/;
# print "fileContents[$i] (after): $fileContents[$i]\n";
}
my $fileContentsAdjusted = join('0x', @fileContents);
stringToFile( $fileContentsAdjusted, $resultsFilename );
# echo output
printf("Output (adjusted addresses by -0x%x (-$offset)):\n", $offset);
print "-----------------------------------------------------------------------------\n";
print $fileContentsAdjusted;
print "\n";
my $tmpDiffFile="tmp-$$.diff";
my $tmpDiffSidesFile="tmp-$$-sides.diff";
my $cmd = "diff --text -bd $answerKeyFilename $resultsFilename > $tmpDiffFile";
system( $cmd );
print("\n"); # echo ""
if ( -s "$tmpDiffFile" ){
print "Diff of answer key (left column) and user program (right column) (side-by-side):\n";
print "-----------------------------------------------------------------------------\n";
#diff --text -bd --side-by-side --width=95 $stdoutKeyFilename $stdoutFile > $tmpDiffSidesFile
$cmd = "diff --text -bd --side-by-side --width=89 $answerKeyFilename $resultsFilename > $tmpDiffSidesFile"; # Mac OS X enscript default characters per line
system( $cmd );
#system( "truncateFile $tmpDiffSidesFile; cat $tmpDiffSidesFile");
system( "cat $tmpDiffSidesFile");
print "\n";
print "Diff of answer key and user program (traditional format):\n";
print "-----------------------------------------------------------------------------\n";
#system( "truncateFile $tmpDiffFile; cat $tmpDiffFile");
system( "cat $tmpDiffFile");
system( "rm -f $tmpDiffFile $tmpDiffSidesFile");
}
exit(0);