#!/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);