delete UTF2000.pm and add CHISE.pm. / bug-fix.
authormoro <moro>
Sun, 2 Feb 2003 12:25:10 +0000 (12:25 +0000)
committermoro <moro>
Sun, 2 Feb 2003 12:25:10 +0000 (12:25 +0000)
CHISE.pm [new file with mode: 0644]
UTF2000.pm [deleted file]

diff --git a/CHISE.pm b/CHISE.pm
new file mode 100644 (file)
index 0000000..f4eca2f
--- /dev/null
+++ b/CHISE.pm
@@ -0,0 +1,216 @@
+#
+# CHISE.pm by Shigeki Moro
+# $Id: CHISE.pm,v 1.1 2003-02-02 12:25:10 moro Exp $
+#
+package CHISE;
+
+use strict;
+use BerkeleyDB;
+
+my $DB_HOME = '/usr/local/lib/xemacs-21.4.10/i686-pc-linux/char-db';
+
+my %alias = ();
+my %alias_reverse = ();
+for (glob "$DB_HOME/system-char-id/*") {
+  s/^.*\/([^\/]+)$/$1/;
+  my $i = $_;
+  s/\->/to_/;
+  s/<\-/from_/;
+  s/=>/map_/;
+  s/\-/_/g;
+  $alias{$_} = $i;
+  $alias_reverse{$i} = $_;
+}
+%alias = (
+         %alias,
+         'radical','ideographic-radical',
+         'strokes','total-strokes',
+);
+
+#--------------------------------------------------------#
+
+sub new {
+  # 既存の字オブジェクトの生成
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my $self  = { @_ };
+  bless $self, $class;
+  my $key = ($self->chars)[0]; # 要エラーチェック
+  my($value, $result);
+  for my $dbname (glob "$DB_HOME/system-char-id/*") {
+    $value = &getvalue($dbname, $key);
+    if ($value) {
+      $dbname =~ s/^.*\/([^\/]+)$/$1/;
+      $result->{$alias_reverse{$dbname}} = $value;
+    }
+  }
+  return bless $result, $class;
+}
+
+sub define_char {
+  # しい字オブジェクトの生成
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my $self = {@_};
+  my $result = ();
+  for my $i (keys %$self) {
+    $result->{$alias_reverse{$alias{$i}}} = $$self{$i};
+  }
+  return bless $result, $class;
+}
+
+sub dumpAttr {
+  # 字オブジェクトが持っている全属性を表示
+  my $self = shift;
+  for my $i (keys %$self) {
+    print "$i => $$self{$i}\n";
+  }
+}
+
+sub addAttr {
+  # 字オブジェクトに属性を追加
+  my $model = shift;
+  my $self = $model->define_char(%$model, @_);
+  return $self;
+}
+
+sub delAttr (@) {
+  # 字オブジェクトから属性を削除
+  my $model = shift;
+  delete $$model{$_} foreach (@_);
+  my $self = $model->define_char(%$model);
+  return $self;
+}
+
+# 属性名で属性値をす
+# 例: $s->morohashi_daikanwa
+for my $attrname (keys %alias) {
+  my $slot = __PACKAGE__ . "::$attrname";
+  no strict "refs";
+  *$slot = sub {
+    my $self = shift;
+    my $dbname = exists $alias{$attrname}
+      ? $alias_reverse{$alias{$attrname}}
+      : $attrname;
+    return $self->{$dbname};
+  }
+}
+#for my $attrname (keys %alias) {
+#  my $slot = __PACKAGE__ . "::$attrname";
+#  no strict "refs";
+#  *$slot = sub {
+#    my $self = shift;
+#    my @result;
+#    for my $i ($self->chars) {
+#      my $j = &getvalue("$DB_HOME/system-char-id/$alias{$attrname}", $i);
+#      push @result, $j if $j;
+#    }
+#    return @result;
+#  }
+#}
+
+sub utf8 {
+  # UTF-8をす
+  my $self = shift;
+  my @result;
+  for my $i ($self->chars) {
+    $i =~ s/^\?//;
+    # To Do: 私用域のはさないようにしないと。
+    push @result, $i;
+  }
+  return @result;
+}
+
+sub compare {
+  my($a, $b) = @_;
+  my($all_attr, $common_attr) = (0, 0);
+  for my $i (&cup(keys %$a, keys %$b)) {
+    if ($a->{$i} eq $b->{$i}) {
+      $all_attr++;
+      $common_attr++;
+    } else {
+      $all_attr++ if (exists $a->{$i});
+      $all_attr++ if (exists $b->{$i});
+    }
+  }
+  return $all_attr ? ($common_attr / $all_attr) : 0;
+}
+
+#--------------------------------------------------------#
+
+sub chars {
+  # ?... の配列をす
+  my $self = shift;
+  my @result = ('*');
+  for my $attrname (keys %$self) {
+    my @tmp = ();
+    my $dbname = exists $alias{$attrname} ? $alias{$attrname} : $attrname;
+    if (-f "$DB_HOME/$dbname/system-char-id") {
+      @tmp = (&getvalue("$DB_HOME/$dbname/system-char-id", $$self{$attrname}));
+      @result = &cap(\@result, \@tmp);
+    } elsif (-f "$DB_HOME/system-char-id/$dbname") {
+      @tmp = &getkeys("$DB_HOME/system-char-id/$dbname", $$self{$attrname});
+      @result = &cap(\@result, \@tmp);
+    } else {
+      die "cannot find $attrname: $! $BerkeleyDB::Error\n";
+    }
+  }
+  return @result;
+}
+
+sub getvalue ($$) {
+  # キーから値をり出す
+  my($dbname, $key) = @_;
+  tie my %h, "BerkeleyDB::Hash",
+    -Filename => $dbname;
+  my $value = $h{$key};
+  untie %h;
+  return $value;
+}
+
+sub getkeys ($$) {
+  # 値からキーの配列をり出す
+  my($dbname, $value) = @_;
+  tie my %h, "BerkeleyDB::Hash",
+    -Filename => $dbname;
+  my @keys = ();
+  for my $key (keys %h) {
+    push @keys, $key if ($h{$key} eq $value);
+  }
+  untie %h;
+  return @keys;
+}
+
+sub cap {
+  # 2つの配列の積合を求める
+  my($a, $b) = @_;
+  if (!@$a or !@$b) {
+    return ();
+  } elsif ($$a[0] eq '*') { # '*'は全体合
+    return @$b;
+  } elsif ($$b[0] eq '*') {
+    return @$a;
+  } else {
+    my %result = ();
+    my @result = ();
+    for my $i (@$a, @$b) {
+      $result{$i}++;
+      push @result, $i if ($result{$i} == 2);
+    }
+    return @result;
+    #return grep {
+    #  my $c = $_;
+    #  grep /^$c$/, @$b;
+    #} @$a;
+  }
+}
+
+sub cup {
+  # 2つの配列の和合を求める
+  my %result = ();
+  for my $i (@_) { $result{$i}++; }
+  return keys %result;
+}
+
+#--------------------------------------------------------#
+1;
diff --git a/UTF2000.pm b/UTF2000.pm
deleted file mode 100644 (file)
index fb430a1..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-#
-# UTF2000.pm by Shigeki Moro
-# UTF2000.pm,v 1.6 2003/01/31 18:25:24 moro Exp
-#
-package UTF2000;
-
-use strict;
-use BerkeleyDB;
-
-my $DB_HOME = '/usr/local/lib/xemacs-21.4.10/i686-pc-linux/char-db';
-
-my %alias = ();
-my %alias_reverse = ();
-for (glob "$DB_HOME/system-char-id/*") {
-  s/^.*\/([^\/]+)$/$1/;
-  my $i = $_;
-  s/\->/to_/;
-  s/<\-/from_/;
-  s/=>/map_/;
-  s/\-/_/g;
-  $alias{$_} = $i;
-  $alias_reverse{$i} = $_;
-}
-%alias = (
-         %alias,
-         'radical','ideographic-radical',
-         'strokes','total-strokes',
-);
-
-#--------------------------------------------------------#
-
-sub new {
-  # 既存の字オブジェクトの生成
-  my $invocant = shift;
-  my $class = ref($invocant) || $invocant;
-  my $self  = { @_ };
-  bless $self, $class;
-  my $key = ($self->chars)[0]; # 要エラーチェック
-  my($value, $result);
-  for my $dbname (glob "$DB_HOME/system-char-id/*") {
-    $value = &getvalue($dbname, $key);
-    if ($value) {
-      $dbname =~ s/^.*\/([^\/]+)$/$1/;
-      $result->{$alias_reverse{$dbname}} = $value;
-    }
-  }
-  return bless $result, $class;
-}
-
-sub define_char {
-  # しい字オブジェクトの生成
-  my $invocant = shift;
-  my $class = ref($invocant) || $invocant;
-  my $self  = { @_ };
-  return bless $self, $class;
-}
-
-sub dumpAttr {
-  # 字オブジェクトが持っている全属性を表示
-  my $self = shift;
-  for my $i (keys %$self) {
-    print "$i => $$self{$i}\n";
-  }
-}
-
-sub addAttr {
-  # 字オブジェクトに属性を追加
-  my $model = shift;
-  my $self = $model->define_char(%$model, @_);
-  return $self;
-}
-
-sub delAttr (@) {
-  # 字オブジェクトから属性を削除
-  my $model = shift;
-  delete $$model{$_} foreach (@_);
-  my $self = $model->define_char(%$model);
-  return $self;
-}
-
-# 属性名で属性値をす
-# 例: $s->morohashi_daikanwa
-for my $attrname (keys %alias) {
-  my $slot = __PACKAGE__ . "::$attrname";
-  no strict "refs";
-  *$slot = sub {
-    my $self = shift;
-    my $dbname = exists $alias{$attrname}
-      ? $alias_reverse{$alias{$attrname}}
-       : $attrname;
-    return $self->{$dbname};
-  }
-}
-#for my $attrname (keys %alias) {
-#  my $slot = __PACKAGE__ . "::$attrname";
-#  no strict "refs";
-#  *$slot = sub {
-#    my $self = shift;
-#    my @result;
-#    for my $i ($self->chars) {
-#      my $j = &getvalue("$DB_HOME/system-char-id/$alias{$attrname}", $i);
-#      push @result, $j if $j;
-#    }
-#    return @result;
-#  }
-#}
-
-sub utf8 {
-  # UTF-8をす
-  my $self = shift;
-  my @result;
-  for my $i ($self->chars) {
-    $i =~ s/^\?//;
-    # To Do: 私用域のはさないようにしないと。
-    push @result, $i;
-  }
-  return @result;
-}
-
-sub compare {
-  my($a, $b) = @_;
-  my($all_attr, $common_attr) = (0, 0);
-  for my $i (&cup(keys %$a, keys %$b)) {
-    if ($a->{$i} eq $b->{$i}) {
-      $all_attr++;
-      $common_attr++;
-    } else {
-      $all_attr++ if (exists $a->{$i});
-      $all_attr++ if (exists $b->{$i});
-    }
-  }
-  return $all_attr ? ($common_attr / $all_attr) : 0;
-}
-
-#--------------------------------------------------------#
-
-sub chars {
-  # ?... の配列をす
-  my $self = shift;
-  my @result = ('*');
-  for my $attrname (keys %$self) {
-    my @tmp = ();
-    my $dbname = exists $alias{$attrname} ? $alias{$attrname} : $attrname;
-    if (-f "$DB_HOME/$dbname/system-char-id") {
-      @tmp = (&getvalue("$DB_HOME/$dbname/system-char-id", $$self{$attrname}));
-      @result = &cap(\@result, \@tmp);
-    } elsif (-f "$DB_HOME/system-char-id/$dbname") {
-      @tmp = &getkeys("$DB_HOME/system-char-id/$dbname", $$self{$attrname});
-      @result = &cap(\@result, \@tmp);
-    } else {
-      die "cannot find $attrname: $! $BerkeleyDB::Error\n";
-    }
-  }
-  return @result;
-}
-
-sub getvalue ($$) {
-  # キーから値をり出す
-  my($dbname, $key) = @_;
-  tie my %h, "BerkeleyDB::Hash",
-    -Filename => $dbname;
-  my $value = $h{$key};
-  untie %h;
-  return $value;
-}
-
-sub getkeys ($$) {
-  # 値からキーの配列をり出す
-  my($dbname, $value) = @_;
-  tie my %h, "BerkeleyDB::Hash",
-    -Filename => $dbname;
-  my @keys = ();
-  for my $key (keys %h) {
-    push @keys, $key if ($h{$key} eq $value);
-  }
-  untie %h;
-  return @keys;
-}
-
-sub cap {
-  # 2つの配列の積合を求める
-  my($a, $b) = @_;
-  if (!@$a or !@$b) {
-    return ();
-  } elsif ($$a[0] eq '*') { # '*'は全体合
-    return @$b;
-  } elsif ($$b[0] eq '*') {
-    return @$a;
-  } else {
-    my %result = ();
-    my @result = ();
-    for my $i (@$a, @$b) {
-      $result{$i}++;
-      push @result, $i if ($result{$i} == 2);
-    }
-    return @result;
-    #return grep {
-    #  my $c = $_;
-    #  grep /^$c$/, @$b;
-    #} @$a;
-  }
-}
-
-sub cup {
-  # 2つの配列の和合を求める
-  my %result = ();
-  for my $i (@_) { $result{$i}++; }
-  return keys %result;
-}
-
-#--------------------------------------------------------#
-1;