3 # Produce a codepage matching table. For each 8-bit character, list
4 # a primary and an alternate match (the latter used for case-insensitive
8 # cptable.pl UnicodeData cpXXX.txt cpXXX.bin
11 ($ucd, $cpin, $cpout) = @ARGV;
15 open(UCD
, '<', $ucd) or die;
16 while (defined($line = <UCD
>)) {
18 @f = split(/;/, $line);
20 $altcase{hex $f[0]} = hex $f[12]; # Upper case equivalent
21 } elsif ($f[13] ne '') {
22 $altcase{hex $f[0]} = hex $f[13]; # Lower case equivalent
23 } elsif ($f[14] ne '') {
24 $altcase{hex $f[0]} = hex $f[14]; # Title case, would be unusual
26 $altcase{hex $f[0]} = hex $f[0];
31 @xtab = (undef) x
256;
33 open(CPIN
, '<', $cpin) or die;
34 while (defined($line = <CPIN
>)) {
35 $line =~ s/\s*(\#.*|)$//;
36 @f = split(/\s+/, $line);
37 next if (scalar @f != 2);
38 next if (hex $f[0] > 255);
39 $xtab[hex $f[0]] = hex $f[1];
43 open(CPOUT
, '>', $cpout) or die;
44 for ($i = 0; $i < 256; $i++) {
45 if (!defined($xtab[$i])) {
49 $p1 = defined($altcase{$p0}) ?
$altcase{$p0} : $p0;
51 # Only the BMP is supported...
52 $p0 = 0xffff if ($p0 > 0xffff);
53 $p1 = 0xffff if ($p1 > 0xffff);
54 print CPOUT
pack("vv", $p0, $p1);