Namazu-devel-ja(旧)


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

Re: solaris の strcasecmp 問題



たかくです。

すみません。
勝手に修正しておきながら、自分でもちょっと混乱し始めています。

<20000622122903L.m-kasahr@xxxxxxxxxxxxxxxxxx>の記事において
m-kasahr@xxxxxxxxxさんは書きました。
> すみません。以前に ML で話題になったときのことは知らないので外し

以前にMLで話題になったのは、
http://search.namazu.org/ml/namazu-users-ja/msg00466.html
からはじまるスレッドです。

> | trcasecmpの実装の問題ではなく、そもそも日本語文字列に対応して
> | いない関数を使っている側の問題だったのでは?
> 
> ということで、寺西さんは strcasecmp() の実装の問題ではない、とい
> うことをおっしゃっているのですよね。
>
> けれども、高久さんが添付されたパッチを拝見すると、新たに
> nmz_strcasecmp() という関数を実装して、strcasecmp() を呼んでいる
> ところを全て nmz_strcasecmp() を呼ぶように変えています。どうも、
> strcasecmp() を問題視した上での修正にしか見えません。

はい、そうなのですが、
私はこの場合、

  「日本語文字列に対応していない関数」= strcasecmp()

だと思ったので、nmz_strcasecmp()で実装しなおしました。
# この前提がひょっとしておかしいのでしょうか。

> そもそも、lib/strcasecmp.c をそのまま使えば良いんですよね?  なぜ
> もう一つ別の実装が要るのでしょうか。

lib/strcasecmp.c を使わなかった理由は、
lib/strcasecmp.c が tolower() を使っていたからです。

昔、tolower() に日本語文字列を渡すと、
文字化けが起こるという現象があって、nmz_tolower() が作られたので、
今回もnmz_tolower() を通した方が良いと思いました。

というか、
今回の strcasecmp() の現象も tolower() が原因かと勝手に思ってました。

# 昔tolower()の話題が出たのは、
# http://search.namazu.org/ml/namazu-dev/msg01038.html
# からはじまるスレッドです。

今試してみたら、
lib/strcasecmp.c は Solaris7 でもちゃんと動いてますね。
やっぱり、lib/strcasecmp.c を使った方が良いのでしょうか。

ちなみに、
> いずれにしても、ソースコード内で nmz_strcasecmp() を使って比較し
> ている文字列は、いずれも日本語の文字列ではないように見受けられま

src/result.c に一ヶ所だけ、日本語文字列を比較する部分があります。

> それから、パッチ内の nmz_strcasecmp() ですが、char が符合有りの
> 環境で MSB が立っている文字を含んだ文字列を比較させると、大小が
> 逆転してしまうような気がします。ちなみに lib/strcasecmp.c では
> 
> |  const unsigned char *p1 = (const unsigned char *) s1;
> |  const unsigned char *p2 = (const unsigned char *) s2;
> 
> としているので、この問題は起きません。

あ、なるほど。気付いていませんでした。すみません。

とりあえず、
今回の修正部分は全部元に戻した方が良いでしょうか。
--
高久 雅生 || Masao Takaku
    mailto:masao@xxxxxxxxxx  http://cosmo.ulis.ac.jp/~masao/