#!perl
#
# This mkheader script makes two C header files, "fmcp932.h" and "tocp932.h".
# These files are used to build ShiftJIS::CP932::MapUTF
#
use 5.006;
use strict;
use warnings;

my $Dir = '.';

do "cp932map";

my $wc = 'U16';

my(%sbcs, %dbcs, %ucs);
use vars qw(%CP932_UNI %UNI_CP932);

die "no \%CP932_UNI!" unless %CP932_UNI; # avoid "once used"

while (my($cp,$u) = each %CP932_UNI) {
    if ($cp < 0x100) {
	$sbcs{$cp} = $u;
    } else {
	my($le,$tr) = unpack('CC', pack 'n', $cp);
	$dbcs{ $le }{ $tr } = $u;
    }
}

open FH, ">$Dir/fmcp932.h" or die "fmcp932.h $!";
binmode FH;
select FH;

print "struct leading { $wc sbc; $wc* tbl; };\n\n";

foreach my $le (sort { $a <=> $b } keys %dbcs) {
    print "$wc fmcp932_$le [256] = {\n";
    for (my $i = 0; $i < 256; $i++) {
	printf "\t%d", defined $dbcs{$le}{$i} ? $dbcs{$le}{$i} : 0;
	print ','  if $i != 255;
	print "\n" if $i % 8 == 7;
    }
    print "};\n\n";
}

{
    print "struct leading fmcp932_tbl [] = {\n";
    for (my $i = 0; $i < 256; $i++) {
	printf "\t{ %5d, %s }",
	    defined $sbcs{$i} ? $sbcs{$i} : 0,
	    defined $dbcs{$i} ? "fmcp932_$i" : "NULL";
	print ','  if $i != 255;
	print "\n";
    }
    print "};\n\n";
}

close FH;

die "no \%UNI_CP932!" unless %UNI_CP932; # avoid "once used"

while (my($u,$cp) = each %UNI_CP932) {
    my ($a,$b) = unpack('CC', pack 'n', $u);
    $ucs{$a}{$b} = $cp;
}

open FH, ">$Dir/tocp932.h" or die "tocp932.h $!";
binmode FH; select FH;

foreach my $le (sort { $a <=> $b } keys %ucs) {
    print "$wc tocp932_$le [256] = {\n";
    for (my $i = 0; $i < 256; $i++) {
	printf "\t%d", defined $ucs{$le}{$i} ? $ucs{$le}{$i} : 0;
	print ','  if $i != 255;
	print "\n" if $i % 8 == 7;
    }
    print "};\n\n";
}

{
    print "$wc* tocp932_tbl [] = {\n";
    for (my $i = 0; $i < 256; $i++) {
	print "\t", defined $ucs{$i} ? "tocp932_$i" : "NULL";
	print ','  if $i != 255;
	print "\n";
    }
    print "};\n\n";
}

close FH;

1;
__END__
