#!/usr/bin/perl

my %nrval, %tain, $max, $tainted, $ignored, $preserved, $added, $ignerr, $uname, $name, $pref;

sub ReadTrans($)
{
    my $nr, $val, $found, $name;
    
    $found = 0;
    $name = shift;
    $name .= ".i18n";

    open TMPL, "<$name" || die "Could not open file $name.";
    while (<TMPL>)
    {
        if (m/^([0-9]{1,4}):(.*)/)
        {
            $nr = sprintf ("%04d", $1);
            $max = $nr;
            $val = $2;
            $nrval{$nr}=$val;
            $found++;
        }
        elsif (m/^#/)
        {
        }
        else
        {
            print "Can't understand: $_\n";
        }
    }
    print "Updating translation to $found strings.\n";
}

sub ReadTainted($)
{
    my $name = shift;
    
    %tain = {};
    $name .= ".tainted";
    open IN, "<$name" || return;
    while (<IN>)
    {
        if (m/^([0-9]{4}):/)
        {
            $tain{$1} = 1;
        }
    }
}

sub ProcessLine($)
{
    my $line = shift;
    
    if ($line =~ m/^#[0-9][0-9]*:/)
    {
    }
    elsif ($line =~ m/^#/)
    {
       print OUT "$line\n";
       $ignored++;
    }
    elsif ($line =~ m/^([0-9][0-9]*):/)
    {
        $neu = sprintf ("%04d", $1);
        for ($last++ ; $last < $neu; $last++)
        {
            $last = sprintf ("%04d", $last);
            next unless defined $nrval{$last};
            print OUT "#$last:$nrval{$last}\n";
            $added++;
        }
        $last = sprintf ("%04d", $last);
        if ($tain{$neu})
        {
            print OUT "#-#$line\n";
            print OUT "#$last:$nrval{$last}\n";
            $tainted++;
        }
        else
        {
            if ($neu != 9999)
            {
                print OUT "$line\n";
                $preserved++;
            }
        }
        $last = $neu;
    }
    else
    {
        print OUT "#$line\n";
        $ignerr++;
    }
}

if (stat "lang/en.i18n")
{
    chdir "lang";
    $pref = "../";
}

if (stat "../lang/en.i18n" and not stat "en.i18n")
{
    chdir "../lang";
    $pref = "../src/";
}

if ($#ARGV == -1)
{
    @ARGV = glob "*.i18n";
    $pref = "";
}

ReadTrans ("build");

print "File		Comments Junk	Old	Changed	New\n";
while ($uname = shift)
{
    next unless $uname cmp "build.i18n";

    $ver = `grep ^1003 $uname`;
    $ver =~ s/^1003://;
    chomp $ver;
    $ver = $ver + 0;
    
    system "cvs diff -u0 -r i18n-$ver build.i18n | grep \"^-[0-9]\" | sed \"s,^-,,\" | sort -n -t : -k 1,1 -u -o build.tainted";
    ReadTainted ("build");

    $name = $pref . $uname;
    stat "$name~" && next;
    rename ($name, "$name~");
    open IN, "<$name~" || die;
    open OUT, ">$name" || die;
    
    $ignored = 0;
    $preserved = 0;
    $added = 0;
    $ignerr = 0;
    $tainted = 0;
    $last = -1;
    while (<IN>)
    {
        chomp;
        ProcessLine ($_);
    }
    ProcessLine ("9999:");
    print "$name 	$ignored	 $ignerr	$preserved	$tainted	$added\n";
}
print "Finished.\n";

