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

use SIL::Shoe::Diffn;
use Getopt::Long;

%opts = ();

@options = ('command|c=s', 'ed|e', 'show-overlap|E', 'show-all|A', 'overlap-only|x', 'X', 
    'easy-only|3', 'merge|m', 'label|L=s@', 'i', 'text|a', 'initial-tab|T',
    'diff-program=s', 'version|v', 'help');

GetOptions(\%opts, @options);

unless (@ARGV)
{
    die <<'EOT';
    shdiff3 [-c diff3_cmd] [diff3 options] file1 base file2
Tests to see whether the files are shoebox files, if so, does a 3-way merge of
them, otherwise passes control to diff3.
EOT
}

$first = shift;
$base = shift;
$count = 0;

open (IN, "< $base") || die "Can't open $base";
$fline = <IN>;
close(IN);

if ($fline =~ m/^\\_sh\s+(\S+)\s+(\S+)\s+(.*?)\s*$/oi)
{
    $fh = \*STDOUT;
    bless $fh, 'IO::File';

    SIL::Shoe::Diffn::shmerge({'-outfh' => $fh, '-ccountref' => \$count}, $base, $first, @ARGV);
    # print SIL::Shoe::Diffn::shmerge({'-debug' => $opt_d}, $base, $first, @ARGV);
    exit ($count != 0);
}
else
{
    foreach $o (@options)
    {
        $o =~ s/\|.*$//o;
        next if ($o eq 'command');
        $cmd .= " --$o $opts{$o}" if (defined $opts{$o});
    }
    $res = system(join(' ',quotemeta($opts{'command'}), $cmd, map {quotemeta($_)} ($first, $base, shift)));
    exit($res >> 8);
}