зеркало из https://github.com/mozilla/gecko-dev.git
324 строки
7.3 KiB
Perl
Executable File
324 строки
7.3 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
$ID = "mkjpconv.pl @ARGV (Time-stamp: <2001-08-08 18:54:54 shom>)";
|
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
#
|
|
# based on CP932.TXT from unicode.org
|
|
# additional information from SHIFTJIS.TXT from unicode.org
|
|
#
|
|
# mapping policy:
|
|
# jis0208 to unicode : based on CP932
|
|
# unicode to jis0208 : based on CP932
|
|
# the lowest code is used for dual mapping to jis0208
|
|
# ascii region : based on ISO8859-1 ( same as CP932 ) IGNORE?
|
|
# kana region : based on CP932
|
|
# IBM Ext(0xFxxx>) : premap to NEC region ( mappable to JIS )
|
|
|
|
if ($ARGV[0] eq "") {
|
|
print STDERR "usage: mkjpconv.pl SHIFTJIS.TXT <INFILE(ex:CP932.TXT)> [Another check]\n";
|
|
exit 1;
|
|
}
|
|
|
|
open (SI, "SHIFTJIS.TXT") || die;
|
|
while(<SI>) {
|
|
($hi,$lo) = /^0x(..)?(..)\s/;
|
|
if ($lo eq "") { next; }
|
|
if ($hi eq "") { $hi=" " }
|
|
$defined{"0x$hi$lo"} = 1;
|
|
}
|
|
close (SI);
|
|
|
|
shift(@ARGV);
|
|
|
|
$src = $ARGV[0];
|
|
|
|
$gendir = "$src.d";
|
|
mkdir("$src.d");
|
|
|
|
$sufile = "sjis2ucs-$src.map";
|
|
$usfile = "ucs2sjis-$src.map";
|
|
$jufile = "jis2ucs-$src.map";
|
|
$jeufile = "jisext2ucs-$src.map";
|
|
$jaufile = "jisasc2ucs-$src.map";
|
|
$jrkufile = "jiskana2ucs-$src.map";
|
|
$ujfile = "ucs2jis-$src.map";
|
|
$ujefile = "ucs2jisext-$src.map";
|
|
$ujafile = "ucs2jisasc-$src.map";
|
|
$ujrkfile = "ucs2jiskana-$src.map";
|
|
$ibmnecfile = "$gendir/IBMNEC.map";
|
|
$jdxfile = "$gendir/jis0208.ump";
|
|
$jdxextfile = "jis0208ext.ump";
|
|
$commentfile = "comment-$src.txt";
|
|
|
|
open (IN, "NPL.header") || die;
|
|
while(<IN>) {
|
|
$NPL .= $_;
|
|
}
|
|
close (IN);
|
|
|
|
foreach $infile ( @ARGV ) {
|
|
|
|
open (IN, "$infile") || die;
|
|
|
|
while(<IN>) {
|
|
($from, $to, $seq, $dum, $comment) =
|
|
/^\s*(0x[0-9a-fA-F]+)\s+(0x[0-9a-fA-F]+)(\+0x\S+)?(\s+\#\s*(\S.*))?$/;
|
|
if ( $seq ne "" ) {
|
|
print "Warning: Unicode Seq:\t$from\t$to$seq\t# $comment\n";
|
|
}
|
|
|
|
if ( $from eq "" ) { next; }
|
|
|
|
if ( $from =~ /0x(..)$/ ) {
|
|
$from = " 0x$1";
|
|
}
|
|
|
|
if ( $fromto{$from} eq "" ) {
|
|
push(@fromlist, $from);
|
|
$fromto{$from} = $to;
|
|
$commentbody{$from} = $comment;
|
|
$commentseq{$from} = $seq
|
|
} elsif ( $fromto{$from} ne $to ) {
|
|
# another mappint SJIS:UCS2 = 1:N
|
|
print "Another map in $infile\t$from\t$fromto{$from},$to\n";
|
|
}
|
|
|
|
if ($checkanother==1) {
|
|
next;
|
|
}
|
|
|
|
if ( $tofrom{$to} eq "" ) {
|
|
$tofrom{$to} = $from;
|
|
} else {
|
|
if ( $from !~ /$tofrom{$to}/ ){
|
|
$tofrom{$to} = "$tofrom{$to},$from";
|
|
}
|
|
}
|
|
|
|
# print "$from $to\n";
|
|
}
|
|
|
|
close (IN);
|
|
|
|
$checkanother == 1;
|
|
}
|
|
|
|
open (COMMENT, ">$commentfile") || die;
|
|
foreach $from (sort(@fromlist)) {
|
|
print COMMENT "$from\t$fromto{$from}$commentseq{$from}\t$commentbody{$from}\n";
|
|
}
|
|
close (COMMENT);
|
|
|
|
|
|
open(SU, ">$sufile") || die;
|
|
open(US, ">$usfile") || die;
|
|
open(JU, ">$jufile") || die;
|
|
open(JEU, ">$jeufile") || die;
|
|
open(JAU, ">$jaufile") || die;
|
|
open(JRKU, ">$jrkufile") || die;
|
|
open(UJ, ">$ujfile") || die;
|
|
open(UJE, ">$ujefile") || die;
|
|
open(UJA, ">$ujafile") || die;
|
|
open(UJRK, ">$ujrkfile") || die;
|
|
open(IBMNEC, ">$ibmnecfile") || die;
|
|
|
|
# print SU "/* generated from $src : SJIS UCS2 */\n";
|
|
# print US "/* generated from $src : UCS2 SJIS */\n";
|
|
print "Generated from $src\n";
|
|
print "Command: mkjpconv.pl @ARGV\n";
|
|
print "SJIS(JIS)\tUCS2\tSJIS\tS:U:S\tSJIS lower\n";
|
|
|
|
foreach $i (sort(@fromlist)) {
|
|
|
|
$ucs = "";
|
|
|
|
$sjis = $i;
|
|
$sjis =~ s/\s+//;
|
|
$jis = sjistojis($sjis);
|
|
|
|
print "$i($jis)\t$fromto{$i}\t$tofrom{$fromto{$i}}";
|
|
$ucs = $fromto{$i};
|
|
|
|
if ( $i eq $tofrom{$fromto{$i}} ) {
|
|
print "\t1:1:1";
|
|
print "\t$i";
|
|
} else {
|
|
print "\t1:1:N";
|
|
@tolist = split(/,/,$tofrom{$fromto{$i}});
|
|
print "\t$tolist[0]";
|
|
#$ucs = $tolist[0];
|
|
if ( $sjis =~ /0xF[A-D]../ ) {
|
|
$ibmnec{$sjis} = $tolist[0];
|
|
#print IBMNEC "$sjis\t$tolist[0]\n";
|
|
}
|
|
|
|
}
|
|
print SU "$sjis\t$ucs\n";
|
|
push(@uslist, "$ucs\t$sjis\n");
|
|
|
|
#print US "$ucs\t$sjis\n";
|
|
if ( $jis ne "") {
|
|
#if ($sjis =~ /^0x87../ || $sjis =~ /^0xED../ ) {
|
|
# cp932 ext
|
|
if ($sjis =~ /0x..../ && $defined{$sjis} != 1) {
|
|
# jis not define
|
|
print JEU "$jis\t$ucs\n";
|
|
push(@ujelist, "$ucs\t$jis\n");
|
|
$jisextucs{$jis} = $ucs;
|
|
} else {
|
|
print JU "$jis\t$ucs\n";
|
|
push(@ujlist, "$ucs\t$jis\n");
|
|
$jisucs{$jis} = $ucs;
|
|
}
|
|
|
|
#print UJ "$ucs\t$jis\n";
|
|
} elsif ( $sjis =~ /\s*0x([8-9A-D].)/ ) {
|
|
$code = $1;
|
|
print JRKU "0x00$code\t$ucs\n";
|
|
push(@ujrklist, "$ucs\t0x00$code\n");
|
|
} elsif ( $sjis =~ /\s*0x([0-7].)/ ) {
|
|
$code = $1;
|
|
print JAU "0x00$code\t$ucs\n";
|
|
push(@ujalist, "$ucs\t0x00$code\n");
|
|
}
|
|
#print "\t# $comment{$i}\n";
|
|
print "\n";
|
|
}
|
|
|
|
print US sort(@uslist);
|
|
print UJ sort(@ujlist);
|
|
print UJE sort(@ujelist);
|
|
print UJA sort(@ujalist);
|
|
print UJRK sort(@ujrklist);
|
|
|
|
# make ibmnec mapping
|
|
|
|
print IBMNEC $NPL;
|
|
print IBMNEC "/* generated by $ID */\n";
|
|
print IBMNEC "/* IBM ext codes to NEC sel (in CP932) */\n\n";
|
|
|
|
foreach $i (0xFA, 0xFB, 0xFC) {
|
|
for ($j=( ($i==0xFA) ? 0x40 : 0x00 ); $j<=0xFF; $j++) {
|
|
$ibm = sprintf("0x%02X%02X", $i, $j);
|
|
$raw = substr($ibm, 2,6);
|
|
if ("" == $ibmnec{$ibm}) {
|
|
print IBMNEC "/* $raw:UNDEF */ 0, \n";
|
|
} else {
|
|
print IBMNEC "/* $raw */ $ibmnec{$ibm}, \n";
|
|
}
|
|
}
|
|
}
|
|
|
|
close(IBMNEC);
|
|
|
|
# make jdx
|
|
|
|
open (JDX, ">$jdxfile") || die;
|
|
|
|
print JDX $NPL;
|
|
print JDX "/* generated by $ID */\n";
|
|
print JDX "/* JIS X 0208 (with CP932 ext) to Unicode mapping */\n";
|
|
|
|
for ($i=0; $i<94; $i++) {
|
|
printf JDX "/* 0x%2XXX */\n", ($i+0x21);
|
|
printf JDX " ";
|
|
for ($j=0; $j<94; $j++) {
|
|
$jis = sprintf("0x%02X%02X", ($i+0x21), $j+0x21);
|
|
# get JIS
|
|
$ucs = $jisucs{$jis};
|
|
if ("" == $ucs) {
|
|
# try CP932 ext
|
|
# try jis ext
|
|
$ucs = $jisextucs{$jis}
|
|
}
|
|
if ("" == $ucs) {
|
|
# undefined
|
|
print JDX "0xFFFD,";
|
|
} else {
|
|
print JDX "$ucs,";
|
|
}
|
|
if (7 == ( ($j+1) % 8 )) {
|
|
printf JDX "/* 0x%2X%1X%1X*/\n", $i+0x21, 2+($j/16), (6==($j%16))?0:8;
|
|
}
|
|
}
|
|
printf JDX " /* 0x%2X%1X%1X*/\n", $i+0x21, 2+($j/16), (6==($j%16))?0:8;
|
|
}
|
|
|
|
close (JDX);
|
|
|
|
|
|
close(SU);
|
|
close(US);
|
|
close(JU);
|
|
close(JEU);
|
|
close(JAU);
|
|
close(JRKU);
|
|
close(UJ);
|
|
close(UJE);
|
|
close(UJA);
|
|
close(UJRK);
|
|
|
|
# generate uf files
|
|
|
|
sub genuf {
|
|
my ($infile, $outfile) = @_;
|
|
my $com = "cat $infile | ./umaptable -uf > $gendir/$outfile";
|
|
print "Executing $com\n";
|
|
system($com);
|
|
}
|
|
|
|
genuf($sufile, "sjis.uf");
|
|
genuf($jufile, "jis0208.uf");
|
|
if ( $#ujelist > 0 ) {
|
|
genuf($jeufile, "jis0208ext.uf");
|
|
} else {
|
|
print "Extension is not found. jis0208ext.uf is not generated.\n";
|
|
}
|
|
genuf("$jaufile $jrkufile", "jis0201.uf");
|
|
# genuf($jaufile, "jis0201.uf");
|
|
# genuf($jrkufile, "jis0201gl.uf");
|
|
|
|
|
|
# generate test page
|
|
|
|
|
|
exit;
|
|
|
|
sub sjistojis {
|
|
my($sjis) = (@_);
|
|
my($first,$second,$h, $l, $j0208);
|
|
|
|
if ( $sjis !~ /^0x....$/ ) {
|
|
return "";
|
|
}
|
|
|
|
$first = hex(substr($sjis,2,2));
|
|
$second = hex(substr($sjis,4,2));
|
|
$jnum=0;
|
|
|
|
if($first < 0xE0)
|
|
{
|
|
$jnum = ($first - 0x81) * ((0xfd - 0x80)+(0x7f - 0x40));
|
|
} else {
|
|
$jnum = ($first - 0xe0 + (0xa0-0x81)) * ((0xfd - 0x80)+(0x7f - 0x40));
|
|
}
|
|
if($second >= 0x80)
|
|
{
|
|
$jnum += $second - 0x80 + (0x7f-0x40);
|
|
}
|
|
else
|
|
{
|
|
$jnum += $second - 0x40;
|
|
}
|
|
if(($jnum / 94 ) < 94) {
|
|
return sprintf "0x%02X%02X", (($jnum / 94) + 0x21), (($jnum % 94)+0x21);
|
|
} else {
|
|
#return sprintf "# 0x%02X%02X", (($jnum / 94) + 0x21), (($jnum % 94)+0x21);
|
|
return "";
|
|
}
|
|
}
|
|
|