created.
[chise/omega.git] / chise2otf / add_adobecid.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($perl56 $perl58
5             $cmapfile $db_home $encoding
6             $ucs $cid $last
7             $ciddb_filename $ciddb
8             );
9 use BerkeleyDB;
10 use Chise_utils ':all';
11
12 if($^V and $^V ge v5.8){
13     $perl58=1;
14 }elsif($^V and $^V ge v5.6){
15     $perl56=1;
16 }else{
17     print STDERR "This versin is not supported.";
18 }
19 if($perl58){
20     eval "use Encode";
21     binmode(STDIN, ':encoding(utf8)');
22     binmode(STDOUT, ':encoding(utf8)');
23 }
24
25 # if using with Mac.
26 if($^O=~/darwin/){
27     print STDERR "Using ^M as delimiter.\n";
28     $/="\r";
29 }
30
31 my $usage=<<EOF;
32 Usage: perl $0 <CMAP file> <CHISE DB dir>
33     <CMAP file> UniJIS-UCS2-H, etc. available in Adobe Reader Directory.
34     <CHISE DB dir> is the directory to store BDB data.
35 EOF
36
37 #my $db_home="./omegadb";
38
39 if(@ARGV==2){
40     $cmapfile=shift;
41     $db_home=shift;
42     $db_home=~s!/$!!;
43 }
44
45 ($ciddb_filename=$cmapfile)=~s!^.*/(.*)$!"adobe-".lc($1)!e;
46 ($encoding=$cmapfile)=~s!.*/Uni(\w+).*$!"\=ucs\@".lc($1)!e;
47
48 if(not -f $cmapfile
49    or not $encoding=~/^=ucs\@(cns|gb|jis|ks)$/
50    or not -d $db_home){
51     print $usage;
52     exit 1;
53 }
54
55 if(-f "$db_home/system-char-id/$ciddb_filename"){
56     print STDERR "Removing old DB $db_home/system-char-id/$ciddb_filename.\n";
57     unlink "$db_home/system-char-id/$ciddb_filename";
58 }
59 $ciddb=new BerkeleyDB::Hash
60     -Filename => "$db_home/system-char-id/$ciddb_filename", -Flags => DB_CREATE
61     or die $!;
62
63 my $in_cidrange=0;
64 my $in_cidchar=0;
65 print STDERR "Reading $cmapfile...";
66 open(CMAP,"<$cmapfile") or die $!;
67 # taken from expandcmap.pl by taiji.
68 while(<CMAP>){
69     if(/begincidrange/){
70         $in_cidrange=1;
71     }elsif(/endcidrange/){
72         $in_cidrange=0;
73     }elsif(/begincidchar/){
74         $in_cidchar=0;
75     }elsif(/endcidchar/){
76         $in_cidchar=0;
77     }elsif($in_cidchar){
78         if(/<([\da-fA-F]+)>\s*(\d+)/){
79             ($ucs,$cid)=(hex($1),$2);
80             &store_cid($ucs,$cid,$encoding);
81         }
82     }elsif($in_cidrange){
83         if(/<([\da-fA-F]+)>\s*<([\da-fA-F]+)>\s*(\d+)/){
84             ($ucs, $last, $cid) = (hex($1), hex($2), $3);
85             while ($ucs <= $last) {
86                 &store_cid($ucs,$cid,$encoding);
87                 $cid++,$ucs++;
88             }
89         }
90     }
91 }
92 close(CMAP);
93 print STDERR "done!\n";
94
95 exit 0;
96
97 sub store_cid{
98     my($ucs,$cid,$encoding)=@_;
99     my($char);
100     unless($char=&replace_char($ucs,$encoding)){
101         $char=pack("U",$ucs);
102     }
103     unless($ciddb->db_put("?".$char,$cid)==0){
104         die $!;
105     }
106 }
107
108 sub replace_char{
109     my($ucs,$encoding)=@_;
110     my($output_char);
111
112     if(&get_reverse_db($encoding)){
113         if($output_char=$reverse_chardb{$encoding}->{$ucs}){
114             $output_char=decode('utf8', $output_char) if($perl58);
115             $output_char=~s/^\?//;
116             return $output_char;
117         }
118     }else{
119         return undef;
120     }
121 }