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