namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Q. about mknmz



加藤です.

> 古川@浜松在住です。
		(略)
> この問題は、例えば
> 
>     'a' cmp 'あ'
> 
> という演算が何を返すか、ということに関わるのですが、件の perl では、
> cmp 演算のときに、'あ' の文字コードとして、0xa4 ではなくて、-0x5c と
> 扱われるようです。(つまり signed char)
> 
> そこで、その場合に unsignedcmp を用いて、同じ結果が得られるようにして
> います。

なるほど.勉強になりました.ありがとうございます.


>   > patch を作った後でいうのも変ですが,マニュアルの「動作に必要なソフトウェ
>   > ア」を Perl5.004 にしてしまったら如何? (^_^;;;;
> 
> 遅いだけですから、できたら見捨てないで欲しいです。

お気に悪くされたのなら,ごめんなさいです.

#お仕事柄,「あれやこれやも OK なように動作保証してね」という要求をま
#にうけてすっかりレガシーになってしまったシステムをよくみるので,
#*つい*「この際,条件しぼって設計やりなおしたら」が口ぐせになっている
#のです...(^_^;;;;;

> で、ここで新たな疑問が湧くのですが、私のところでは、1.0.3 のころから
> perl5.003 で運用しているのですが、今回の問題には出会いませんでした。
> 
> なにか、他にも条件があるのでしょうか?それとも、たんに気付かなかった
> だけでしょうか?

ある疑いが頭をかすめたので,ちょっと実験をしてみました.


1.下記のいい加減なスクリプトで,"AGYA" を出力する環境.

    perl version			OS
-----------------------------------------------------------
(1) perl5.003				SunOS4
(2) perl5.001				SunOS4
(3) jperl, version 4.036 + 1.4(EUC)	SunOS4
(4) perl4.036				SunOS4


2."GREAT!" を出力する環境.

    perl version			OS
------------------------------------------------------------
(5) perl5.004_03			SunOS4
(6) perl5.003				Solaris2.4
(7) jperl, version 4.019 + 1.3(EUC)	Solaris2.4
(8) jperl, version 4.019 + 1.3(EUC)	HP-UX10.01
(9) perl5.002				FreeBSD 2.1.5-RELEASE 


うーん,やはり,ケース (5) を除いて,OS 依存な状況を示しているようです.

ということは,perl が cmp するときに呼んでいる (おそらく) bcmp() か 
memcmp() 関数の仕様が違うとみました.そこで,perl5.004_04 のソースをと
りよせて,CHANGES をみてみました.

すると,

---------- CHANGES より抜粋 -------------
  Title:  "Avoid memcmp() for magnitude test if it thinks char is signed"
   From:  Chip Salzenberg
  Files:  Configure config_H config_h.SH doop.c
          ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.h handy.h
          hv.c perl.h pp_hot.c proto.h regexec.c sv.c toke.c util.c
		:		:
Index: doop.c

	No longer prefer bcmp over memcmp when order doesn't matter.
---------- CHANGES より抜粋 -------------

などなど,(英語が苦手な私にとって)怪しい文字の数々が....(^_^;;;;;;


で,以下のような怪しい C プログラム test.c を書いてみました.

OS		bcmp の返却値	memcmp の返却値
-----------------------------------------------
SunOS4		1		189
HP-UX10.01	-67		-67
FreeBSD 2.1.5	1		-67
Solaris2.4	1		-67


どうやら,仮説どおり OS によって,bcmp(),memcmp() の仕様が異なるようです.

#ちなみに,私の他にダメだった OS とその version は何だったのでしょうか?



---------- いい加減なスクリプト ----------

if (('a' cmp 'あ') < 0) {
    printf("GREAT!\n");
} else {
    printf("AGYA\n");
}
---------- いい加減なスクリプト ----------

---------- test.c ----------
#include <stdio.h>

void main()
{
  static unsigned char str1[] = "a";
  static unsigned char str2[] = "あ";

  printf("%d\n",bcmp(str1,str2));
  printf("%d\n",memcmp(str1,str2,sizeof(str2)));
}
---------- test.c ----------

============================================================
	加藤裕史@ NTTDATA 通信 (株)
	    技術開発本部 マルチメディア技術センタ
	    マルチメディア SI 担当  ドキュメント新サービス
			E-mail: tumibito@xxxxxxxxxxxxxxxxxxx
============================================================