Siena. です。

》あと、なかむら(う)さんのパッチと、[ruby-dev:22098] の修正と、あとCompareImpl の strncmp を memcmp に変更したのをまとめて添付ファイルとして送ります。

ようやく試させていただきました。
OS/2 with EMX でも、このパッチで意図したように動いているようです。
ワイルドカードのメタ文字を 2 バイト目に含む文字や 1 バイトカナなどを
含むファイル名でも試しましたが、試した範囲では問題ありませんでした。

なるほど INT_MAX ですか。sizeof(wchar_t) では小さそうだし、パスよりは
短いのだから MAXPATHLEN かな、いやいや、などと考えてました ^^;

mblen() が -1 を返す場合には対処しなくても大丈夫でしょうか。
他ではどうしているのかと思って grep ruby/*.[ch] してみたところ、
{file,ruby,util}.c 辺りでも特に対処していませんでした。

それよりも、これらで MB_CUR_MAX を使っていますが、
C ロケールで MB_CUR_MAX == 1 となるプラットフォームで
[ruby-dev:22089], [ruby-dev:22092] と同じ問題が起きそうです。
山本さんの試みとは別に、変更しておく必要があると思います。
いずれ MBCS 対応の変更をする時に無用になるでしょうが、
それまでの対処として、とりあえず単純に置き換えてみました。


Index: ruby/defines.h =================================================================== RCS file: /src/ruby/defines.h,v retrieving revision 1.35 diff -u -p -2 -r1.35 defines.h --- ruby/defines.h 25 Nov 2003 12:44:26 -0000 1.35 +++ ruby/defines.h 2 Dec 2003 14:24:03 -0000 @@ -198,3 +198,5 @@ flush_register_windows(void) #endif +#define RUBY_MBCHAR_MAXSIZE INT_MAX /* instead of MB_CUR_MAX */ + #endif Index: ruby/dir.c =================================================================== RCS file: /src/ruby/dir.c,v retrieving revision 1.88 diff -u -p -2 -r1.88 dir.c --- ruby/dir.c 22 Nov 2003 03:59:17 -0000 1.88 +++ ruby/dir.c 2 Dec 2003 14:24:05 -0000 @@ -80,5 +80,5 @@ char *strchr _((char*,char)); #ifndef CharNext /* defined as CharNext[AW] on Windows. */ # if defined(DJGPP) -# define CharNext(p) ((p) + mblen(p, MB_CUR_MAX)) +# define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) # else # define CharNext(p) ((p) + 1) Index: ruby/file.c =================================================================== RCS file: /src/ruby/file.c,v retrieving revision 1.164 diff -u -p -2 -r1.164 file.c --- ruby/file.c 28 Nov 2003 14:23:31 -0000 1.164 +++ ruby/file.c 2 Dec 2003 14:24:09 -0000 @@ -1395,5 +1395,5 @@ rb_file_s_umask(argc, argv) #ifndef CharNext /* defined as CharNext[AW] on Windows. */ # if defined(DJGPP) -# define CharNext(p) ((p) + mblen(p, MB_CUR_MAX)) +# define CharNext(p) ((p) + mblen(p, RUBY_MBCHAR_MAXSIZE)) # else # define CharNext(p) ((p) + 1) Index: ruby/ruby.c =================================================================== RCS file: /src/ruby/ruby.c,v retrieving revision 1.83 diff -u -p -2 -r1.83 ruby.c --- ruby/ruby.c 6 Nov 2003 01:17:59 -0000 1.83 +++ ruby/ruby.c 2 Dec 2003 14:24:11 -0000 @@ -227,5 +227,5 @@ translate_char(p, from, to) p = CharNext(p); #else - p += mblen(p, MB_CUR_MAX); + p += mblen(p, RUBY_MBCHAR_MAXSIZE); #endif } Index: ruby/util.c =================================================================== RCS file: /src/ruby/util.c,v retrieving revision 1.38 diff -u -p -2 -r1.38 util.c --- ruby/util.c 22 Nov 2003 03:59:18 -0000 1.38 +++ ruby/util.c 2 Dec 2003 14:24:13 -0000 @@ -348,5 +348,5 @@ __crt0_glob_function(char *path) buf[len] = '\0'; - for (p = buf; *p; p += mblen(p, MB_CUR_MAX)) + for (p = buf; *p; p += mblen(p, RUBY_MBCHAR_MAXSIZE)) if (*p == '\\') *p = '/';
--- Siena. <mailto:siena / faculty.chiba-u.jp>