Add support for creating codepage/Unicode mapping tables
[people/xl0/syslinux-lua.git] / codepage / cptable.pl
1 #!/usr/bin/perl
2 #
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
5 # matching.)
6 #
7 # Usage:
8 #       cptable.pl UnicodeData cpXXX.txt cpXXX.bin
9 #
10
11 ($ucd, $cpin, $cpout) = @ARGV;
12
13 %altcase = ();
14
15 open(UCD, '<', $ucd) or die;
16 while (defined($line = <UCD>)) {
17     chomp $line;
18     @f = split(/;/, $line);
19     if ($f[12] ne '') {
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
25     } else {
26         $altcase{hex $f[0]} = hex $f[0];
27     }
28 }
29 close(UCD);
30
31 @xtab = (undef) x 256;
32
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];
40 }
41 close(CPIN);
42
43 open(CPOUT, '>', $cpout) or die;
44 for ($i = 0; $i < 256; $i++) {
45     if (!defined($xtab[$i])) {
46         $p0 = $p1 = 0xffff;
47     } else {
48         $p0 = $xtab[$i];
49         $p1 = defined($altcase{$p0}) ? $altcase{$p0} : $p0;
50     }
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);
55 }
56 close (CPOUT);
57
58