#!/usr/bin/perl
use strict;


open(IN, "<$ARGV[0]") || die "Error: can't input file";

my $inputencoding = "";
if ($ARGV[1]) {
    $inputencoding = $ARGV[1];
}
else {
    # Loop through the input file to find its encoding
    my $registry = "UNKNOWN";
    my $encoding = "0";
    while (<IN>) {
        if (/CHARSET_REGISTRY "(.*)"/) {
            $registry = $1;
        }
        if (/CHARSET_ENCODING "(.*)"/) {
            $encoding = $1;
        }
    }
    $inputencoding = uc(sprintf("%s-%s", $registry, $encoding));
    seek(IN, 0, 0);
}

# Read in the mapping
my %mappingfiles = (
    "DOSCP850-0"   => "MAPPINGS/VENDORS/MICSFT/PC/CP850.TXT",
    "WINDOWS-1251" => "MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT",
    "RAWIN-R"      => "MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT",
    "WINDOWS-1252" => "MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT",
    "ISO8859-1"    => "MAPPINGS/ISO8859/8859-1.TXT",
    "ISO8859-2"    => "MAPPINGS/ISO8859/8859-2.TXT",
);
my %mapping;
my $mappingfile = $mappingfiles{$inputencoding};
open(MAP, "<$mappingfile") || die "Error: can't open mapping file $mappingfile for encoding $inputencoding";
while (<MAP>) {
    if ($_ ne "\x1a" and !($_ =~ /^#/)) {
        my ($from, $to, $name) = split(/\t/);
        $mapping{hex($from)} = hex($to);
    }
}

# Loop through the file again, this time modifying chars, and finally printing
# out a modified file
my $inchar = 0;
my $char = "";
my %chars;
my $output = "";
while (<IN>) {
    if (/^STARTCHAR/) {
        $inchar = 1;
        $char = $_;
    }
    elsif (/^ENDCHAR/) {
        $char .= $_;
        $inchar = 0;
        $char =~ s/ENCODING (\d+)/ENCODING $mapping{$1}/;
        if (defined($mapping{$1})) {
            $chars{$mapping{$1}} = $char;
        }
    }
    elsif ($inchar == 1) {
        $char .= $_;
    }
    elsif (/^ENDFONT/) {
        my $changecount = ($output =~ s/CHARSET_REGISTRY "(.*)"/CHARSET_REGISTRY "ISO10646"/);
        if ($changecount == 0) {
            $output =~ s/STARTPROPERTIES (\d+)/"STARTPROPERTIES " . 1 + $1 . "\nCHARSET_REGISTRY \"ISO10646\""/e;
        }
        $changecount = ($output =~ s/CHARSET_ENCODING "(.*)"/CHARSET_ENCODING "1"/);
        if ($changecount == 0) {
            $output =~ s/STARTPROPERTIES (\d+)/"STARTPROPERTIES " . 1 + $1 . "\nCHARSET_ENCODING \"1\""/e;
        }
        print $output;
        delete($chars{"-1"}); # Remove unprintable characters
        for my $encoding (sort {$a <=> $b} keys %chars) {
            print $chars{$encoding};
        }
        print "ENDFONT\n";
    }
    elsif ($inchar == 0) {
        $output .= $_;
    }
}
close(IN);
