The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# very simple program that mimics librsync's rdiff, using the
# simple file utility functions. see rdiff2 for the same program,
# written using the nonblocking API

use File::Rdiff qw(:trace :file);

trace_level(LOG_INFO);

if ($ARGV[0] eq "signature") {
   open $base, "<$ARGV[1]" or die "$ARGV[1]: $!";
   open $sig,  ">$ARGV[2]" or die "$ARGV[2]: $!";

   File::Rdiff::sig_file $base, $sig;
} elsif ($ARGV[0] eq "delta") {
   open $sig,   "<$ARGV[1]" or die "$ARGV[1]: $!";
   open $new,   "<$ARGV[2]" or die "$ARGV[2]: $!";
   open $delta, ">$ARGV[3]" or die "$ARGV[3]: $!";

   $sig = loadsig_file $sig;

   ref $sig or exit 1;

   $sig->build_hash_table;

   File::Rdiff::delta_file $sig, $new, $delta;
} elsif ($ARGV[0] eq "patch") {
   open $base,  "<$ARGV[1]" or die "$ARGV[1]: $!";
   open $delta, "<$ARGV[2]" or die "$ARGV[2]: $!";
   open $new,   ">$ARGV[3]" or die "$ARGV[3]: $!";

   File::Rdiff::patch_file $base, $delta, $new;
} else {
   print <<EOF;
$0 signature BASE SIGNATURE
$0 delta SIGNATURE NEW DELTA
$0 patch BASE DELTA NEW
EOF
   exit (1);
}