なかだです。

At Wed, 7 Jan 2004 20:28:35 +0900,
Tanaka Akira wrote:
> > |+#define GLOB_DEPTH	0x0100
> >
> > という名前はあんまり良くないのでGLOB_DEPTHFIRSTとかにしても
> > らった方が良さそう。
> 
> えーと、豆知識ですが、find(1) の -depth というオプションは find の挙動
> を深さ優先に変えるものではなく、帰りがけ順に変えるもので、不適切な名前
> です。

なんとなく記憶に引っかかってたんですが、思い出せませんでした。

> なので、DEPTH や DEPTHFIRST じゃなくて POSTORDER のほうがいいんじゃな
> いでしょうか。

ということで[ruby-dev:22534]からの差分です。

あとlinkのループのところでメモリリークしてます。


--- dir.c~ 2004-01-07 19:31:14.000000000 +0900 +++ dir.c 2004-01-07 21:08:33.000000000 +0900 @@ -71,7 +71,7 @@ #define FNM_PATHNAME 0x02 #define FNM_DOTMATCH 0x04 #define FNM_CASEFOLD 0x08 -#define GLOB_DEPTH 0x0100 +#define GLOB_POSTORDER 0x0100 #define FNM_NOMATCH 1 #define FNM_ERROR 2 @@ -1001,8 +1002,8 @@ struct dirent *dp; int recursive = 0; int magical = 1; - int maxlen = 0, buflen; - int n1; + int maxlen = 0; + int n1, mlen; #define ALLOC_BUF(size) do { \ int buflen = size; \ if (!maxlen) { \ @@ -1076,7 +1076,8 @@ n1 = p - path; - if (!magical && !(flags & GLOB_DEPTH)) { + mlen = strlen(m); + if (!magical && !(flags & GLOB_POSTORDER)) { status = glob_helper(path, p, separator, flags, func, arg); } for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { @@ -1097,7 +1098,7 @@ #else if (dp->d_isdir) dirtype = (dp->d_isrep ? symlnk : dir); #endif - if (dirtype == dir && (flags & GLOB_DEPTH)) { + if (dirtype == dir && (flags & GLOB_POSTORDER)) { strcpy(buf+n2, "/**/"); strcpy(buf+n2+4, p); status = glob_helper(buf, buf+n2+1, 1, flags, func, arg); @@ -1129,6 +1130,6 @@ } } - if (dirtype == dir && !(flags & GLOB_DEPTH)) { + if (dirtype == dir && !(flags & GLOB_POSTORDER)) { strcpy(buf+n2, "/**/"); strcpy(buf+n2+4, p); status = glob_helper(buf, buf+n2+1, 1, flags, func, arg); @@ -1140,8 +1141,7 @@ while (link) { if (status == 0) { const int n2 = n1 + strlen(link->name); - buf = ALLOC_N(char, n2+strlen(m)+1); - memcpy(buf, path, n1); + ALLOC_BUF(n2+mlen+1); strcpy(buf+n1, link->name); strcpy(buf+n2, m); status = glob_helper(buf, buf+n2+1, 1, flags, func, arg); @@ -1152,7 +1152,7 @@ free(tmp); } - if (!magical && (flags & GLOB_DEPTH)) { + if (!magical && (flags & GLOB_POSTORDER)) { status = glob_helper(path, p, separator, flags, func, arg); } @@ -1546,5 +1546,5 @@ rb_file_const("FNM_DOTMATCH", INT2FIX(FNM_DOTMATCH)); rb_file_const("FNM_CASEFOLD", INT2FIX(FNM_CASEFOLD)); - rb_define_const(rb_cDir, "GLOB_DEPTH", INT2FIX(GLOB_DEPTH)); + rb_define_const(rb_cDir, "GLOB_POSTORDER", INT2FIX(GLOB_POSTORDER)); }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦