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
============================================================