[#12164] patch for ext/gdbm — Koji Arai <JCA02266@...>

新井です。

24 messages 2001/02/04
[#12168] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/05

まつもと ゆきひろです

[#12176] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/05

新井です。

[#12179] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/06

まつもと ゆきひろです

[#12219] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12220] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12256] set_trace_func — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/02/17

[#12293] crash on proc without a block — Kenichi Komiya <kom@...1.accsnet.ne.jp>

15 messages 2001/02/25

[#12323] Re: [ruby-list:28364] class definition extension — "K.Kosako" <kosako@...>

ruby-listから移動しました。

13 messages 2001/02/28
[#12324] Re: [ruby-list:28364] class definition extension — matz@... (Yukihiro Matsumoto) 2001/02/28

まつもと ゆきひろです

[ruby-dev:12231] Re: [PATCH] Dir::glob escape space

From: matz@... (Yukihiro Matsumoto)
Date: 2001-02-13 19:03:07 UTC
List: ruby-dev #12231
まつもと ゆきひろです

In message "[ruby-dev:12215] [PATCH] Dir::glob escape space"
    on 01/02/12, "U.Nakamura" <usa@osb.att.ne.jp> writes:

|ちょっと古い話になっちゃいますが、[ruby-list:26923]の話って
|こういうのでダメですかね?
|# 手抜きですが :-P

どうせやるならメタキャラクタも含めてエスケープできるようにす
べきでしょう。というわけで、ちょっとハックしました。

[ruby-talk:10786]に触発されてglobをブロック付きで呼び出した
ときの高速化コードも含んでます。

--- dir.c~	Mon Nov 20 10:24:22 2000
+++ dir.c	Wed Feb 14 03:29:05 2001
@@ -553,10 +553,28 @@
     return extract_path(path, pend);
 }
 
+static void
+remove_backslases(p)
+    char *p;
+{
+    char *pend = p + strlen(p);
+    char *t = p;
+
+    while (p < pend) {
+	if (*p == '\\') {
+	    *p++;
+	    if (p == pend) break;
+	}
+	*t++ = *p++;
+    }
+    *t = '\0';
+}
+
 #ifndef S_ISDIR
 #   define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
 #endif
 
+
 void
 rb_glob_helper(path, flag, func, arg)
     char *path;
@@ -568,7 +586,8 @@
     char *p, *m;
 
     if (!has_magic(path, 0)) {
-	if (stat(path, &st) == 0) {
+	remove_backslases(path);
+	if (rb_sys_stat(path, &st) == 0) {
 	    (*func)(path, arg);
 	}
 	return;
@@ -601,11 +620,22 @@
 		rb_glob_helper(buf, flag, func, arg);
 		free(buf);
 	    }
-	    dirp = opendir(dir);
-	    if (dirp == NULL) {
-		free(base);
-		break;
+	    if (lstat(dir, &st) < 0) {
+	        free(base);
+	        break;
+	    }
+	    if (S_ISDIR(st.st_mode)) {
+	       dirp = opendir(dir);
+	       if (dirp == NULL) {
+		   free(base);
+		   break;
+	       }
+	    }
+	    else {
+	      free(base);
+	      break;
 	    }
+	    
 #define BASE (*base && !(*base == '/' && !base[1]))
 
 	    for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
@@ -636,7 +666,7 @@
 	    free(base);
 	    free(magic);
 	    while (link) {
-		stat(link->path, &st); /* should success */
+		lstat(link->path, &st); /* should success */
 		if (S_ISDIR(st.st_mode)) {
 		    int len = strlen(link->path);
 		    int mlen = strlen(m);
@@ -679,7 +709,14 @@
     char *path;
     VALUE ary;
 {
-    rb_ary_push(ary, rb_tainted_str_new2(path));
+    VALUE str = rb_tainted_str_new2(path);
+
+    if (ary) {
+	rb_ary_push(ary, str);
+    }
+    else {
+	rb_yield(str);
+    }
 }
 
 static void
@@ -753,10 +790,12 @@
     char buffer[MAXPATHLEN], *buf = buffer;
     char *t;
     int nest;
-    VALUE ary;
+    VALUE ary = 0;
 
     Check_SafeStr(str);
-    ary = rb_ary_new();
+    if (!rb_block_given_p()) {
+	ary = rb_ary_new();
+    }
     if (RSTRING(str)->len >= MAXPATHLEN)
 	buf = xmalloc(RSTRING(str)->len + 1);
 
@@ -770,6 +809,10 @@
 	while (p < pend && !isdelim(*p)) {
 	    if (*p == '{') nest+=2;
 	    if (*p == '}') nest+=3;
+	    if (*p == '\\') {
+		*t++ = *p++;
+		if (p == pend) break;
+	    }
 	    *t++ = *p++;
 	}
 	*t = '\0';
@@ -783,14 +826,6 @@
     }
     if (buf != buffer)
 	free(buf);
-    if (rb_block_given_p()) {
-	long len = RARRAY(ary)->len;
-	VALUE *ptr = RARRAY(ary)->ptr;
-
-	while (len--) {
-	    rb_yield(*ptr++);
-	}
-    }
     return ary;
 }
 

In This Thread