#!/usr/bin/perl

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

$cvs = ':pserver:anonymous@micq.org:/var/lib/cvs';

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

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

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

sub ProcessLine($)
{
    my $line = shift;
    
    if ($line =~ m/^#  EN:/)
    {
        print OUT "#  EN: __.i18n,v $version\n";
    }
    elsif ($line =~ m/^#[0-9][0-9]*:/)
    {
    }
    elsif ($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 (length ($nrval{$neu}))
        {
            if (length ($tain{$neu}))
            {
                print OUT "#-#$line\n";
                print OUT "#+#$last:$tain{$neu}\n";
                print OUT "# #$last:$nrval{$last}\n";
                $tainted++;
            }
            else
            {
                if ($neu != 9999)
                {
                    print OUT "$line\n";
                    $preserved++;
                }
            }
        }
        elsif ($neu != 9999)
        {
            if ($2 != ".")
            {
                print "Dropping $neu: $line.\n";
            }
            print OUT "$1.$3\n";
        }
        $last = $neu;
    }
    else
    {
        print OUT "#$line\n";
        $ignerr++;
    }
}

ReadTrans ("C");

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

    $ver = `grep -a "# *EN:" $uname | sed "s/.*EN://;s/.*,v //;s/ .*//"`;
    chomp $ver;
    if (!length ($ver))
    {
        $ver = `grep ^1003 $uname`;
        $ver =~ s/^1003://;
        chomp $ver;
        $ver = 0 unless length ($ver);
        $ver = "i18n-$ver";
    }
    print "Old version tag: $ver.\n";
    
    stat ".C.$ver" || system "cvs -d $cvs rdiff -u -r $ver -r stable-0-4-10 micq/lang/C.i18n > .C.$ver";
    system "grep \"^-[0-9]\" < .C.$ver | sed \"s,^-,,\" | sort -n -t : -k 1,1 -u -o .$uname.tainted";
    ReadTainted ("$uname");

    $name = $pref . $uname;
    stat "$name~" && next;
    rename ($name, "$name~");
    open (IN, "<:bytes", "$name~") || die;
    open (OUT, ">:bytes", $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";

