なかだです。

 ワイルドカードを含んだファイルが実際にあると、Dir.glob("*/*")
などがループします。入力のワイルドカードとreaddirした結果を区別
するのに、エスケープする方法も考えられますが、ワイルドカード展
開済みの位置を渡すようにしてみました。


Index: dir.c =================================================================== RCS file: /cvs/ruby/src/ruby/dir.c,v retrieving revision 1.50 diff -u -2 -p -r1.50 dir.c --- dir.c 2001/07/14 15:17:18 1.50 +++ dir.c 2001/08/26 10:49:12 @@ -623,6 +623,7 @@ remove_backslashes(p) static void -glob_helper(path, flags, func, arg) +glob_helper(path, sub, flags, func, arg) char *path; + char *sub; int flags; void (*func) _((const char*, VALUE)); @@ -632,5 +633,6 @@ glob_helper(path, flags, func, arg) char *p, *m; - if (!has_magic(path, 0, flags)) { + p = sub ? sub : path; + if (!has_magic(p, 0, flags)) { remove_backslashes(path); if (stat(path, &st) == 0) { @@ -645,5 +647,4 @@ glob_helper(path, flags, func, arg) } - p = path; while (p) { if (*p == '/') p++; @@ -672,8 +673,9 @@ glob_helper(path, flags, func, arg) if (S_ISDIR(st.st_mode)) { if (m && strcmp(magic, "**") == 0) { + int n = strlen(base); recursive = 1; - buf = ALLOC_N(char, strlen(base)+strlen(m)+3); + buf = ALLOC_N(char, n+strlen(m)+3); sprintf(buf, "%s%s", base, *base ? m : m+1); - glob_helper(buf, flags, func, arg); + glob_helper(buf, buf+n, flags, func, arg); free(buf); } @@ -707,7 +709,8 @@ glob_helper(path, flags, func, arg) } if (S_ISDIR(st.st_mode)) { - strcat(buf, "/**"); - strcat(buf, m); - glob_helper(buf, flags, func, arg); + char *t = buf+strlen(buf); + strcpy(t, "/**"); + strcpy(t+3, m); + glob_helper(buf, t, flags, func, arg); } free(buf); @@ -740,5 +743,5 @@ glob_helper(path, flags, func, arg) sprintf(t, "%s%s", link->path, m); - glob_helper(t, flags, func, arg); + glob_helper(t, t+len, flags, func, arg); free(t); } @@ -765,5 +768,5 @@ rb_glob(path, func, arg) VALUE arg; { - glob_helper(path, FNM_PERIOD, func, arg); + glob_helper(path, 0, FNM_PERIOD, func, arg); } @@ -774,5 +777,5 @@ rb_globi(path, func, arg) VALUE arg; { - glob_helper(path, FNM_PERIOD|FNM_CASEFOLD, func, arg); + glob_helper(path, 0, FNM_PERIOD|FNM_CASEFOLD, func, arg); }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦