namazu-dev(ring)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
isdigit (Re: Namazu for Win32 binary snap release 20000215)
Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx> wrote:
>>(とりあえず、勘違いしていないかどうかの確認なんですが)
>>これって、
>>if (! isdigit((int)str[i])) {
>>の部分を
>>if (! (str[i] >= '0' && str[i] <= '9')) {
>>とするということですよね?
(snip)
>># ただし、とっても簡単な isdigit のテストは OK なので、理由はわ
>># かりません。(?_?)
>
>たぶん locale がらみの問題なのでしょう。ちょっと根が深そうで
>す。とりあえず (こういう安易な対策よくないのだけど)
>isdigit() を使わないように修正しました。FIXME: の目印をつけ
>てあります。
これ、最初に「localeがらみに違いない」と思い込んでしまったの
だけど、考え直してみると "不明" は 8 bit 文字なので
isdigit((int)str[i])
で isdigit に渡るのは負の値になります。そして、 isdigit の実
装によっては、負の値が渡されると動作がおかしくなる、という可
能性があります。
% echo '不明' |od -t d1
0000000 -55 -44 -52 -64 10
0000005
% echo '7,4@' |od -t d1
0000000 55 44 52 64 10
0000005
% echo '不明' |tr '\200-\377' '\000-\177' |od -t d1
0000000 73 84 76 64 10
0000005
% echo 'ITL@' |od -t d1
0000000 73 84 76 64 10
0000005
もしかしたら、"不明" は "7,4@" として扱われ、 `,' と `@' は
数字の仲間として解釈されたのかもしれません。ただ、 man
isdigit を見ると、
isdigit()
checks for a digit (0 through 9).
とあるので、「`,' と `@' は数字の仲間として解釈」するような
お節介をするとは思えません。
くだんの nmz_isnumstr() は次のように書き換えると isdigit()
が使えるようになるかもしれません。確認してもらえませんか? > 白井さん
int
nmz_isnumstr(const char *str)
{
const unsigned char *p;
if (strlen(str) > 10) { /* Too large number */
return 0;
}
for (p = (const unsigned char *)str; *p != '\0'; p++) {
if (! isdigit((int)*p)) {
return 0;
}
}
return 1;
}
-- Satoru Takabayashi