From: "U.Nakamura" Date: 2001-02-18T02:11:33+09:00 Subject: [ruby-list:27988] Re: Dir[pattern] こんにちは、なかむら(う)です。 At Sun, 18 Feb 2001 01:10:04 +0900, "U.Nakamura" wrote in '[ruby-list:27984] Re: Dir[pattern]' > > 2バイト目に「\」を含むファイル名がDir['*']で出てきません。 > > 現在、Dir[](Dir.glob)では、dosishな環境では2バイト目に「\」を > 含むファイル名を正しく処理できていません。 > 1.7も同様。 これについて、1.7へのパッチを末尾につけておきます。 ところで、dosishな環境でのDir[](Dir.glob)には他にもいろいろ問題が あって、*,?,[]を使用した場合、 1. ディレクトリ区切りに\を使用すると何もマッチしない 2. ドライブ名指定+絶対パス指定で、 a. 1.6.2ではカレントディレクトリの中身がマッチしてしまう b. 1.7では何もマッチしない 3. ドライブ名指定+相対パス指定だと何もマッチしない 4. 1.7で、空白を含むディレクトリ名以下を指定した場合、何もマッチ しない 5. ネットワークドライブ直下をド指定した場合( //hostname/folder/* のようなもの)、何もマッチしない。 などなどがあります。 僕もずーっと気にしていて、手元には幾つかの問題を修正したパッチ もあるのですが、ディレクトリ区切りとしての\とエスケープとしての \の絡みでいろいろ問題があって、外に出せる状態ではありません。 Index: dir.c =================================================================== RCS file: /src/ruby/dir.c,v retrieving revision 1.30 diff -u -2 -p -r1.30 dir.c --- dir.c 2001/02/15 06:00:55 1.30 +++ dir.c 2001/02/17 17:06:22 @@ -76,4 +76,10 @@ char *strchr _((char*,char)); #define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c)) +#if defined(DJGPP) +#define CharNext(p) ((p) + mblen((p), MB_CUR_MAX)) +#elif !defined(CharNext) +#define CharNext(p) ((p) + 1) +#endif + #if defined DOSISH #define isdirsep(c) ((c) == '/' || (c) == '\\') @@ -85,5 +91,5 @@ find_dirsep(s) if (isdirsep(*s)) return s; - s++; + s = CharNext(s); } return 0; @@ -147,13 +153,13 @@ fnmatch(pat, string, flags) int nocase = flags & FNM_NOCASE; - while (c = *pat++) { + while (c = *pat, pat = CharNext(pat), c) { switch (c) { case '?': if (!*s || pathname && isdirsep(*s) || PERIOD(s)) return FNM_NOMATCH; - s++; + s = CharNext(s); break; case '*': - while ((c = *pat++) == '*') + while (c = *pat, pat = CharNext(pat), c == '*') ; @@ -183,5 +189,5 @@ fnmatch(pat, string, flags) else if (pathname && isdirsep(*s)) break; - s++; + s = CharNext(s); } return FNM_NOMATCH; @@ -193,5 +199,5 @@ fnmatch(pat, string, flags) if (!pat) return FNM_NOMATCH; - s++; + s = CharNext(s); break; @@ -206,5 +212,5 @@ fnmatch(pat, string, flags) c = '\\'; else - pat++; + pat = CharNext(pat); } /* FALLTHROUGH */ @@ -218,5 +224,5 @@ fnmatch(pat, string, flags) if(downcase(c) != downcase(*s)) return FNM_NOMATCH; - s++; + s = CharNext(s); break; } それでは。 -- U.Nakamura