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