reducer.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use File::Temp qw/ tempdir /;
  4. my $prog = "reducer";
  5. die "$prog <code file> <error string> [optional command]\n" if ($#ARGV < 0);
  6. my $file = shift @ARGV;
  7. die "$prog: [error] cannot read file $file\n" if (! -r $file);
  8. my $magic = shift @ARGV;
  9. die "$prog: [error] no error string specified\n" if (! defined $magic);
  10. # Create a backup of the file.
  11. my $dir = tempdir( CLEANUP => 1 );
  12. print "$prog: created temporary directory '$dir'\n";
  13. my $srcFile = "$dir/$file";
  14. `cp $file $srcFile`;
  15. # Create the script.
  16. my $scriptFile = "$dir/script";
  17. open(OUT, ">$scriptFile") or die "$prog: cannot create '$scriptFile'\n";
  18. my $reduceOut = "$dir/reduceOut";
  19. my $command;
  20. if (scalar(@ARGV) > 0) { $command = \@ARGV; }
  21. else {
  22. my $compiler = "clang";
  23. $command = [$compiler, "-fsyntax-only", "-Wfatal-errors", "-Wno-deprecated-declarations", "-Wimplicit-function-declaration"];
  24. }
  25. push @$command, $srcFile;
  26. my $commandStr = "@$command";
  27. print OUT <<ENDTEXT;
  28. #!/usr/bin/perl -w
  29. use strict;
  30. my \$BAD = 1;
  31. my \$GOOD = 0;
  32. `rm -f $reduceOut`;
  33. my \$command = "$commandStr > $reduceOut 2>&1";
  34. system(\$command);
  35. open(IN, "$reduceOut") or exit(\$BAD);
  36. my \$found = 0;
  37. while(<IN>) {
  38. if (/$magic/) { exit \$GOOD; }
  39. }
  40. exit \$BAD;
  41. ENDTEXT
  42. close(OUT);
  43. `chmod +x $scriptFile`;
  44. print "$prog: starting reduction\n";
  45. sub multidelta($) {
  46. my ($level) = @_;
  47. system("multidelta -level=$level $scriptFile $srcFile");
  48. }
  49. for (my $i = 1 ; $i <= 5; $i++) {
  50. foreach my $level (0,0,1,1,2,2,10) {
  51. multidelta($level);
  52. }
  53. }
  54. # Copy the final file.
  55. `cp $srcFile $file.reduced`;
  56. print "$prog: generated '$file.reduced";