namazu-ml(avocado)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Q. about mknmz
こんにちは.加藤です.
高林さん>
> >(1) SunOS Release 4.1.3-JLE1.1.3_U1
> >(2) perl 5.003 with EMBED built under sunos + suidperl security patch
>
> どうもこの組合わせがアヤシイです :-)。
>
> この組合わせ (というかこの Perl) では文字列の比較で EUCの日本語部
> 分が正しく行えないという問題がありました。char を unsigned で扱う
> か扱わないかの問題だと思われます。
ふむふむ.なるほど.
古川さん >
> unsignedcmp は、
>
> sub unsignedcmp {
> my ($str1, $str2) = ($a, $b);
>
> という形になっているので、これを
(略)
> としないといけないと思います。
アドバイス,どうもありがとうございました.感謝です.
とりあえず,お二方のアドバイスで現行の perl5.003 で幸せになれるかどう
か試してみましたところ,うまくいきました (patch を末尾につけます.
もしよろしければ,お使い下さると幸いです).
<コメント>
1640 行付近の
if ($current_word eq $words[$cnt]) {
も unsignedcmp しないといけないかな?とも思ったのですが,eq 演算子はちゃ
んと機能するようですねぇ...
</コメント>
高林さん&古川さん>
> > と書き替えてしまえば、おそらく動くと思いますが、 Perl を 5.004 に
> > ヴァージョンを上げる方が良いかもしれません。
>
> 速度のことを考えれば、5.004 にしたほうがよいのは確かですね。
patch を作った後でいうのも変ですが,マニュアルの「動作に必要なソフトウェ
ア」を Perl5.004 にしてしまったら如何? (^_^;;;;
私自身は,いずれ,5.004 にするつもりです.
------------ patch ここから -------------
*** mknmz.org Tue Feb 24 10:53:36 1998
--- mknmz Tue Feb 24 12:01:19 1998
***************
*** 1581,1587 ****
# 文字列の unsigned な比較ルーチン。
# このルーチンは古川@ヤマハさんがくださりました
sub unsignedcmp {
! my ($str1, $str2) = ($a, $b);
my ($ord1, $ord2);
while (($ord1 = ord($str1)) == ($ord2 = ord($str2))) {
--- 1581,1589 ----
# 文字列の unsigned な比較ルーチン。
# このルーチンは古川@ヤマハさんがくださりました
sub unsignedcmp {
! # changed by tumibito, 98/02/24
! # my ($str1, $str2) = ($a, $b);
! my ($str1, $str2) = @_;
my ($ord1, $ord2);
while (($ord1 = ord($str1)) == ($ord2 = ord($str2))) {
***************
*** 1605,1611 ****
}
else {
$UnsignedCmp = 1;
! @words = sort unsignedcmp keys(%KeyIndex);
}
return if $#words == -1;
--- 1607,1615 ----
}
else {
$UnsignedCmp = 1;
! # changed by tumibito, 98/02/24
! # @words = sort unsignedcmp keys(%KeyIndex);
! @words = sort {&unsignedcmp($a, $b)} keys(%KeyIndex);
}
return if $#words == -1;
***************
*** 1629,1635 ****
read(INDEX, $baserecord, $INTSIZE * $nn);
<INDEX>;
! for (; $cnt <= $#words && $words[$cnt] le $current_word ; $cnt++) {
$n = &nget($KeyIndex{$words[$cnt]});
$record = substr($KeyIndex{$words[$cnt]}, $INTSIZE);
--- 1633,1642 ----
read(INDEX, $baserecord, $INTSIZE * $nn);
<INDEX>;
! # changed by tumibito, 98/02/24
! # for (; $cnt <= $#words && $words[$cnt] le $current_word ; $cnt++) {
! for (; $cnt <= $#words
! && unsignedcmp($words[$cnt], $current_word) <= 0 ; $cnt++) {
$n = &nget($KeyIndex{$words[$cnt]});
$record = substr($KeyIndex{$words[$cnt]}, $INTSIZE);
------------ patch ここまで -------------
============================================================
加藤裕史@ NTTDATA 通信 (株)
技術開発本部 マルチメディア技術センタ
マルチメディア SI 担当 ドキュメント新サービス
E-mail: tumibito@xxxxxxxxxxxxxxxxxxx
============================================================