correct wrong option flag of BerkeleyDB.
[chise/perl.git] / Chise_utils / Chise_utils.pm
index 2e13949..b03cf0b 100644 (file)
@@ -1,6 +1,6 @@
 package Chise_utils;
 
-require 5.005;
+require 5.008;
 use strict;
 use warnings;
 
@@ -10,7 +10,9 @@ use utf8;
 use BerkeleyDB;
 use vars qw(%db %chardb
            %reverse_db %reverse_chardb
+           %er_alias $er_prefix_re
            $atr $idc
+           $omegadb_path
        );
 
 our @ISA = qw(Exporter);
@@ -26,6 +28,8 @@ our %EXPORT_TAGS = ( 'all' => [ qw(
                                   %db %chardb
                                   %reverse_db %reverse_chardb
                                   $idc
+                                  %er_alias $er_prefix_re
+                                  $omegadb_path
                                   &get_db
                                   &get_reverse_db
                                   &get_char_attribute
@@ -40,19 +44,19 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
 
 our @EXPORT = qw(
 );
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 
 # Preloaded methods go here.
 
+$omegadb_path="/usr/local/lib/chise/omega";
+
 my $DB_HOME="";
 unless($DB_HOME){
-    if(-e '/usr/local/lib/chise/db'){
-       $DB_HOME='/usr/local/lib/chise/db';
-    }elsif(-e '/usr/lib/chise/db'){
-       $DB_HOME='/usr/lib/chise/db';
-    }elsif(-e '/sw/lib/chise/db'){
-       $DB_HOME='/sw/lib/chise/db';
+    if(-e '/usr/local/lib/chise/chise-db'){
+       $DB_HOME='/usr/local/lib/chise/chise-db';
+    }elsif(-e '/usr/lib/chise/chise-db'){
+       $DB_HOME='/usr/lib/chise/chise-db';
     }elsif(-e '/usr/local/lib/chise/char-db'){
        $DB_HOME='/usr/local/lib/chise/char-db';
     }elsif(-e 'd:/work/chise/char-db'){
@@ -66,7 +70,7 @@ unless($DB_HOME){
 
 $idc="\x{2ff0}-\x{2fff}";
 
-my %er_alias =
+%er_alias =
     ('C1','=cns11643-1',
      'C2','=cns11643-2',
      'C3','=cns11643-3',
@@ -100,7 +104,7 @@ my %er_alias =
      'M','=daikanwa',
      );
 
-my $er_prefix_re=join '|', keys %er_alias;
+$er_prefix_re=join '|', keys %er_alias;
 
 if(-d "$DB_HOME/character"){
     for (glob "$DB_HOME/character/feature/*"){
@@ -109,10 +113,10 @@ if(-d "$DB_HOME/character"){
        $atr=~s!$DB_HOME/character/feature/!!;
        $db{$atr}=$_;
     }
-    for (glob "$DB_HOME/character/by-feature/*"){
+    for (glob "$DB_HOME/character/by_feature/*"){
        next if(/\.txt$/);
        $atr=$_;
-       $atr=~s!$DB_HOME/character/feature/!!;
+       $atr=~s!$DB_HOME/character/by_feature/!!;
        $reverse_db{$atr}=$_;
     }
 }elsif(-d "$DB_HOME/system-char-id"){
@@ -139,7 +143,8 @@ sub get_db{
     return 1 if(defined(%{$chardb{$atr}}));
     if(defined($db{$atr}) and -f $db{$atr}){
        tie %{$chardb{$atr}}, "BerkeleyDB::Hash",
-       -Filename => $db{$atr};
+       -Filename => $db{$atr},
+       -Flags => DB_RDONLY;
     }else{
        return undef;
     }
@@ -150,7 +155,8 @@ sub get_reverse_db{
     return 1 if(defined(%{$reverse_chardb{$atr}}));
     if(defined($reverse_db{$atr}) and -f $reverse_db{$atr}){
        tie %{$reverse_chardb{$atr}}, "BerkeleyDB::Hash",
-       -Filename => $reverse_db{$atr};
+       -Filename => $reverse_db{$atr},
+       -Flags => DB_RDONLY;
     }else{
        return undef;
     }
@@ -159,9 +165,11 @@ sub get_reverse_db{
 
 sub get_char_attribute{
     my($char,$atr)=@_;
+    my($res);
     &get_db($atr) or return "";
-    if($chardb{$atr}->{"?$char"}){
-       return $chardb{$atr}->{"?$char"};
+    if($res=$chardb{$atr}->{"?$char"}){
+       utf8::decode($res);
+       return $res;
     }else{
        return "";
     }
@@ -173,6 +181,7 @@ sub get_chars_containing{
     if(&get_db($atr)){
        foreach $char (keys %{$chardb{$atr}}){
            if($chardb{$atr}->{$char}=~/$value/){
+               utf8::decode($char);
                $char=~s/^\?//;
                push @res,$char;
            }
@@ -187,6 +196,7 @@ sub get_chars_matching{
     if(defined($reverse_db{$atr})){
        if(&get_reverse_db($atr)){
            if($char=$reverse_chardb{$atr}->{$value}){
+               utf8::decode($char);
                $char=~s/^\?//;
                push @res,$char;
            }
@@ -199,6 +209,7 @@ sub get_chars_matching{
        if(&get_db($atr)){
            foreach $char (keys %{$chardb{$atr}}){
                if($chardb{$atr}->{$char} eq $value){
+                   utf8::decode($char);
                    $char=~s/^\?//;
                    push @res,$char;
                }
@@ -245,7 +256,9 @@ sub de_er{
        $output_char=pack("U",hex($1));
     }elsif($er=~/^(?:I\-)?($er_prefix_re)\-?([0-9a-fA-F]+)$/){
        ($atr,$value)=($1,$2);
-       unless($er_alias{$atr}=~/daikanwa|gt/){
+       if($er_alias{$atr}=~/daikanwa|gt/){
+           $value+=0;
+       }else{
            $value=hex($value);
        }
        ($output_char)=&get_chars_matching($er_alias{$atr},$value);