From: nobuyoshi nakada Date: 2005-11-18T18:45:19+09:00 Subject: [ruby-dev:27749] Re: FNM_CASEFOLD on case-sensitive system なかだです。 At Fri, 18 Nov 2005 15:31:33 +0900, H.Yamamoto wrote in [ruby-dev:27741]: > >ずいぶん前の実装で、私も良く覚えていないのですが、確か > >ファイルシステムの case sensitivity と fnmatch の > >case sensitivity は一致してることを前提にした実装だった > >と思います。 > > 何か、だんだん思い出してきたので、後で BeOS で試してみます。 > 要するに、"a" とかワイルドカードを含まないパターン要素は > 特別扱いして高速化を図っているのですが、Unix + FNM_CASEFOLD > のときは PLAIN に行かずに MAGIC に行けばいいのです。 > (つまり、すべてワイルドカード扱い) なるほど。 Index: dir.c =================================================================== RCS file: /cvs/ruby/src/ruby/dir.c,v retrieving revision 1.148 diff -U2 -p -u -r1.148 dir.c --- dir.c 16 Sep 2005 13:46:03 -0000 1.148 +++ dir.c 18 Nov 2005 09:44:29 -0000 @@ -932,4 +932,5 @@ has_magic(const char *s, int flags) { const int escape = !(flags & FNM_NOESCAPE); + const int nocase = flags & FNM_CASEFOLD; register const char *p = s; @@ -947,4 +948,9 @@ has_magic(const char *s, int flags) return 0; continue; +#if !defined DOSISH /* case-sensitive system */ + default: + if (ISALPHA(c) && nocase) + return 1; +#endif } @@ -1299,6 +1305,4 @@ ruby_glob0(const char *path, int flags, flags |= FNM_CASEFOLD; root = rb_path_skip_prefix(root); -#else - flags &= ~FNM_CASEFOLD; #endif @@ -1343,7 +1347,9 @@ rb_glob2(const char *path, int flags, vo args.value = arg; +#ifdef DOSISH if (flags & FNM_CASEFOLD) { - rb_warn("Dir.glob() ignores File::FNM_CASEFOLD"); + rb_warning("Dir.glob() ignores File::FNM_CASEFOLD"); } +#endif return ruby_glob0(path, flags | GLOB_VERBOSE, rb_glob_caller, (VALUE)&args); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦