#!/usr/bin/perl

use Compress::Zlib;

my $version = 0.0.1;
my $version_t = sprintf "%vd", $version;


sub inflate {
  my $x = inflateInit()
     or die "Cannot create a inflation stream\n" ;
  
  my $fh = $_[0];
  my $input = '';
  my ($totalread, $totalwritten);
  my $data;
  
  my ($output, $status) ;
  while (read($fh, $input, 4096))
  {
      ($output, $status) = $x->inflate(\$input) ;
      $totalread += $x->total_in();
      $totalwritten += $x->total_out();
  
      $data .= $output
          if $status == Z_OK or $status == Z_STREAM_END ;
  
      last if $status != Z_OK ;
  }
  
  die "inflation failed\n"
      unless $status == Z_STREAM_END ;

  return ($totalread, $totalwritten, $data);
}


print <<_EOF_;
rSFeXtract version $version_t by PinkFreud
*** Warning!  This utility is extremely experimental!
_EOF_


my $exe = shift;

open (EXE, $exe);
seek (EXE, 0x3c00, 0);

$offset = tell EXE;

while ($offset < (-s $exe)) {
  my $fn = sprintf "0x%x", $offset;
  my ($insize, $outsize, $data) = inflate (*EXE);
  print "$fn: $insize bytes -> $outsize bytes\n";
  open (FILE, "> $fn");
  print FILE $data;
  close (FILE);
  $offset += $insize;
  seek (EXE, $offset, 0);
}

close (EXE);
