[#13765] GenerativeHash — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

17 messages 2001/07/08
[#13769] Re: GenerativeHash — matz@... (Yukihiro Matsumoto) 2001/07/09

まつもと ゆきひろです

[#13774] mkmf.rb: cleaning facility — Takaaki Tateishi <ttate@...>

立石です.

14 messages 2001/07/09

[#13800] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — nobu.nakada@...

なかだです。

20 messages 2001/07/10
[#13801] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — WATANABE Hirofumi <eban@...> 2001/07/10

わたなべです。

[#13802] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — matz@... (Yukihiro Matsumoto) 2001/07/10

まつもと ゆきひろです

[#13804] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — WATANABE Hirofumi <eban@...> 2001/07/10

わたなべです。

[#13805] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — matz@... (Yukihiro Matsumoto) 2001/07/10

まつもと ゆきひろです

[#13806] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — WATANABE Hirofumi <eban@...> 2001/07/10

わたなべです。

[#13807] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — matz@... (Yukihiro Matsumoto) 2001/07/10

まつもと ゆきひろです

[#13808] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — "Akinori MUSHA" <knu@...> 2001/07/10

At Tue, 10 Jul 2001 15:23:04 +0900,

[#13809] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — WATANABE Hirofumi <eban@...> 2001/07/10

わたなべです。

[#13810] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — "Akinori MUSHA" <knu@...> 2001/07/10

At Tue, 10 Jul 2001 16:50:52 +0900,

[#13811] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — "Akinori MUSHA" <knu@...> 2001/07/10

 もうひとつあった。

[#13828] supported platforms / K&R — "Akinori MUSHA" <knu@...>

 digest モジュールの各プラットフォームでの動作確認をお願いした

39 messages 2001/07/13
[#14389] Re: supported platforms / K&R — Koji Arai <JCA02266@...> 2001/08/08

新井です。

[#14399] Re: supported platforms / K&R — Takashi Shimizu <simtak@...> 2001/08/09

清水@biglobeです。

[#14404] Re: supported platforms / K&R — Koji Arai <JCA02266@...> 2001/08/09

新井です。

[#14461] Re: supported platforms / K&R — Takashi Shimizu <simtak@...> 2001/08/14

清水@biglobe です。

[#14466] Re: supported platforms / K&R — nobu.nakada@... 2001/08/14

なかだです。

[#14468] Re: supported platforms / K&R — Koji Arai <JCA02266@...> 2001/08/14

新井です。

[#14477] recursive malloc (Re: supported platforms / K&R) — Koji Arai <JCA02266@...> 2001/08/15

新井です。

[#14482] Re: recursive malloc (Re: supported platforms / K&R) — nobu.nakada@... 2001/08/15

なかだです。

[#14486] Re: recursive malloc (Re: supported platforms / K&R) — Koji Arai <JCA02266@...> 2001/08/15

新井です。

[#14490] Re: recursive malloc (Re: supported platforms/ K&R) — nobu.nakada@... 2001/08/15

なかだです。

[#14492] Re: recursive malloc (Re: supported platforms/ K&R) — Koji Arai <JCA02266@...> 2001/08/15

新井です。

[#14493] Re: recursive malloc (Re: supportedplatforms/ K&R) — nobu.nakada@... 2001/08/15

なかだです。

[#13878] Prototype for rb_gc_mark / volatile in ruby.h — Tietew <tietew@...>

Tietew です。

18 messages 2001/07/15
[#13880] Re: Prototype for rb_gc_mark / volatile in ruby.h — matz@... (Yukihiro Matsumoto) 2001/07/16

まつもと ゆきひろです

[#13940] IO#read — "Akinori MUSHA" <knu@...>

 IO#read を使って何度もストリームから読み込むような処理をする

20 messages 2001/07/19

[#13959] Re: [ruby-list:30682] Re: overwride method — "Akinori MUSHA" <knu@...>

At Fri, 20 Jul 2001 21:09:36 +0900,

95 messages 2001/07/20
[#13963] Re: [ruby-list:30682] Re: overwride method — GOTO Kentaro <gotoken@...> 2001/07/20

ごとけんです

[#13965] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/21

まつもと ゆきひろです

[#13967] Re: [ruby-list:30682] Re: overwride method — GOTO Kentaro <gotoken@...> 2001/07/21

ごとけんです

[#13969] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/21

まつもと ゆきひろです

[#13980] Re: [ruby-list:30682] Re: overwride method — GOTO Kentaro <gotoken@...> 2001/07/21

[ruby-dev:13969]>

[#13981] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/21

まつもと ゆきひろです

[#13984] Re: [ruby-list:30682] Re: overwride method — GOTO Kentaro <gotoken@...> 2001/07/22

ごとけんです

[#13993] Re: [ruby-list:30682] Re: overwride method — "NAKAMURA, Hiroshi" <nakahiro@...> 2001/07/23

なひです。

[#13994] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/23

まつもと ゆきひろです

[#13995] Re: [ruby-list:30682] Re: overwride method — keiju@... (石塚圭樹) 2001/07/23

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

[#13996] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/23

まつもと ゆきひろです

[#13997] Re: [ruby-list:30682] Re: overwride method — keiju@... (石塚圭樹) 2001/07/23

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

[#13998] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/23

まつもと ゆきひろです

[#14000] Re: [ruby-list:30682] Re: overwride method — "NAKAMURA, Hiroshi" <nakahiro@...> 2001/07/23

なひです。

[#14005] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/23

まつもと ゆきひろです

[#14016] Re: [ruby-list:30682] Re: overwride method — "NAKAMURA, Hiroshi" <nakahiro@...> 2001/07/24

なひです。

[#14021] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14022] Re: [ruby-list:30682] Re: overwride method — "NAKAMURA, Hiroshi" <nakahiro@...> 2001/07/24

なひです。

[#14023] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14037] Re: [ruby-list:30682] Re: overwride method — GOTO Kentaro <gotoken@...> 2001/07/24

ごとけんです

[#14039] Re: [ruby-list:30682] Re: overwride method — Masatoshi SEKI <m_seki@...> 2001/07/24

[#14040] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14043] Re: [ruby-list:30682] Re: overwride method — m_seki@... 2001/07/24

[#14053] Re: [ruby-list:30682] Re: overwride method — matz@... (Yukihiro Matsumoto) 2001/07/25

まつもと ゆきひろです

[#14082] private instance variable と _dump/_load — Masatoshi SEKI <m_seki@...> 2001/07/25

[#14084] Re: private instance variable と _dump/_load — keiju@... (石塚圭樹) 2001/07/25

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

[#14087] Re: private instance variable と _dump/_load — matz@... (Yukihiro Matsumoto) 2001/07/25

まつもと ゆきひろです

[#14089] Re: private instance variable と _dump/_load — keiju@... (石塚圭樹) 2001/07/25

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

[#14094] Re: private instance variable と _dump/_load — matz@... (Yukihiro Matsumoto) 2001/07/26

まつもと ゆきひろです

[#14133] Re: private instance variable と _dump/_load — "Shin'ya Adzumi" <adzumi@...> 2001/07/27

あづみです。

[#14134] Re: private instance variable と _dump/_load — matz@... (Yukihiro Matsumoto) 2001/07/27

まつもと ゆきひろです

[#14140] Re: private instance variable と _dump/_load — Kazuhiro NISHIYAMA <zn@...> 2001/07/27

In <996211878.306635.31396.nullmailer@ev.netlab.jp>

[#14143] Re: private instance variable と _dump/_load — matz@... (Yukihiro Matsumoto) 2001/07/27

まつもと ゆきひろです

[#14144] Re: private instance variable と _dump/_load — Kazuhiro NISHIYAMA <zn@...> 2001/07/27

In <996255758.830993.629.nullmailer@ev.netlab.jp>

[#14066] Re: [ruby-list:30682] Re: overwride method — "Shin'ya Adzumi" <adzumi@...> 2001/07/25

あづみです。

[#14068] private instance variable (Re: Re: overwride method) — matz@... (Yukihiro Matsumoto) 2001/07/25

まつもと ゆきひろです

[#14099] Is private instance variable really needed? — Shugo Maeda <shugo@...> 2001/07/26

前田です。

[#14104] Re: Is private instance variable really needed? — matz@... (Yukihiro Matsumoto) 2001/07/26

まつもと ゆきひろです

[#14026] Exception in coerce — Shin-ichiro HARA <sinara@...>

原です。

21 messages 2001/07/24
[#14027] Re: Exception in coerce — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14028] Re: Exception in coerce — Shin-ichiro HARA <sinara@...> 2001/07/24

原です。

[#14029] Re: Exception in coerce — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14030] Re: Exception in coerce — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[#14031] Re: Exception in coerce — Shin-ichiro HARA <sinara@...> 2001/07/24

原です。

[#14032] Re: Exception in coerce — matz@... (Yukihiro Matsumoto) 2001/07/24

まつもと ゆきひろです

[ruby-dev:13845] Re: Fw: DOSISH file.c changes

From: nobu.nakada@...
Date: 2001-07-13 13:56:10 UTC
List: ruby-dev #13845
なかだです。

なかだです。

At Wed, 11 Jul 2001 20:37:33 +0900,
U.Nakamura <usa@osb.att.ne.jp> wrote:
> Patrick Cheng氏から下記のようなパッチを頂いているので転送し
> ます。

  ちょっと気になったのが…。

(1) is_absolute_path()がc:hogeみたいのに対して偽を返すようになっ
    てるので、require 'c:hoge'なんてのがエラーになりそうな気が
    するんですが、そういうもん? これはどちらかといえば
    is_macos_native_path()と同様の扱いにしたほうがいいようにも
    思えますが。

(2) rb_file_s_expand_path()でis_absolute_path()で分岐しているけ
    れど、ドライブレターを考えたときには絶対パスかどうかという
    分け方はできないと思うので、それぞれのパターンについて分岐
    したほうがいいのでは。

(3) パッチが壊れてるとか。

> あとUNC対応が必要?
> # マルチバイト対応は... まぁ「置き」ですかねぇ。

  ちょっとやってみましたが、まぁたぶんダメダメでしょう。


Index: file.c
===================================================================
RCS file: /cvs/ruby/src/ruby/file.c,v
retrieving revision 1.58
diff -u -2 -p -r1.58 file.c
--- file.c	2001/06/19 04:35:13	1.58
+++ file.c	2001/07/13 13:30:29
@@ -1291,10 +1291,106 @@ rb_file_s_umask(argc, argv)
 }
 
+#ifndef HAVE_GETCWD
+#define getcwd(buf, len) getwd(buf)
+#endif
+
 #if defined DOSISH
 #define isdirsep(x) ((x) == '/' || (x) == '\\')
+static inline int
+has_drive_letter(path)
+    const char *path;
+{
+    if (ISALPHA(path[0]) && path[1] == ':') return 1;
+    return 0;
+}
+
+static void
+getdrivecurdir(char *buf, int len, int drive)
+{
+    char drive[4];
+    char oldcwd[MAXPATHLEN+1];
+
+    drive[0] = drive;
+    drive[1] = ':';
+    drive[2] = '\0';
+
+    /* the only way that I know to get the current directory
+       of a particular drive is to change chdir() to that drive,
+       so save the old cwd before chdir()
+    */
+    getcwd(oldcwd, MAXPATHLEN);
+    if (chdir(drive) == 0) {
+	getcwd(buf, len);
+	chdir(oldcwd);
+    }
+    else {
+	drive[2] = '/';
+	drive[3] = '\0';
+	strncpy(buf, drive, len);
+    }
+}
+
+static char*
+skipprefix(char *path)
+{
+    if (has_drive_letter(path)) {
+	path += 2;
+    }
+    else if (isdirsep(path[0]) && isdirsep(path[1])) {
+	while (isdirsep(*path)) path++;
+	while (*path && !isdirsep(*path)) path = CharNext(path); /* skip host */
+	if (*path) {
+	    path++;
+	    while (*path && !isdirsep(*path)) path = CharNext(path); /* skip share */
+	}
+    }
+    return path;
+}
 #else
 #define isdirsep(x) ((x) == '/')
 #endif
+#ifndef CharNext
+# if defined(DJGPP)
+#    define CharNext(p) ((p) + mblen(p, MB_CUR_MAX))
+# else
+#    define CharNext(p) ((p) + 1)
+# endif
+#endif
+
+static char *
+strrdirsep(name)
+    char *name;
+{
+    char *last = NULL;
+    do {
+        if (isdirsep(*name)) {
+	    last = name++;
+	}
+	else {
+	    name = CharNext(name);
+	}
+    } while (*name);
+    return last;
+}
 
+static char *
+endofdir(name)
+    char *name;
+{
+    char *last = NULL;
+
+    do {
+        if (isdirsep(*name)) {
+	    last = name++;
+	}
+	else {
+	    name = CharNext(name);
+	}
+    } while (*name);
+    if (last == name - 1)
+	--name;
+    return name;
+}
+
 VALUE
 rb_file_s_expand_path(argc, argv)
@@ -1320,5 +1416,5 @@ rb_file_s_expand_path(argc, argv)
 	    }
 	    strcpy(buf, dir);
-	    p = &buf[strlen(buf)];
+	    p = endofdir(buf);
 	    s++;
 	    tainted = 1;
@@ -1340,5 +1436,5 @@ rb_file_s_expand_path(argc, argv)
 	    }
 	    strcpy(buf, pwPtr->pw_dir);
-	    p = &buf[strlen(buf)];
+	    p = endofdir(buf);
 	    endpwent();
 #endif
@@ -1346,8 +1442,17 @@ rb_file_s_expand_path(argc, argv)
     }
 #if defined DOSISH
-    /* skip drive letter */
-    else if (ISALPHA(s[0]) && s[1] == ':' && isdirsep(s[2])) {
-	while (*s && !isdirsep(*s)) {
+    else if (has_drive_letter(s)) {
+	if (isdirsep(s[2])) {
+	    /* specified drive letter, and full path */
+	    /* skip drive letter */
+	    *p++ = *s++;
 	    *p++ = *s++;
+	    s++;
+	}
+	else {
+	    /* specified drive, but not full path */
+	    getdrivecurdir(buf, *s);
+	    tainted = 1;
+	    p = endofdir(buf);
 	}
     }
@@ -1361,19 +1466,28 @@ rb_file_s_expand_path(argc, argv)
 	else {
 	    tainted = 1;
-#ifdef HAVE_GETCWD
 	    getcwd(buf, MAXPATHLEN);
-#else
-	    getwd(buf);
-#endif
 	}
-	p = &buf[strlen(buf)];
-	while (p > buf && *(p - 1) == '/') p--;
+	p = endofdir(buf);
+    }
+#if defined DOSISH
+    else if (!isdirsep(s[1])) {
+	/* specified full path, but not drive letter */
+	/* we need to get the drive letter */
+	tainted = 1;
+	getcwd(buf, MAXPATHLEN);
+	p = skipprefix(buf);
+	s++;
     }
+#endif
     else {
-	while (*s && isdirsep(*s)) {
+	while (isdirsep(*s)) {
 	    *p++ = '/';
 	    s++;
 	}
+#ifdef DOSISH
+	if (p > buf + 1 && *s) p--;
+#else
 	if (p > buf && *s) p--;
+#endif
     }
     *p = '/';
@@ -1387,6 +1501,6 @@ rb_file_s_expand_path(argc, argv)
 		    if (*(s+1) == '\0' || isdirsep(*(s+1))) { 
 			/* We must go back to the parent */
-			if (isdirsep(*p) && p > buf) p--;
-			while (p > buf && !isdirsep(*p)) p--;
+			*p = '\0';
+			p = strrdirsep(buf);
 		    }
 		    else {
@@ -1419,4 +1533,11 @@ rb_file_s_expand_path(argc, argv)
     /* Place a \0 at end. If path ends with a "/", delete it */
     if (p == buf || !isdirsep(*p)) p++;
+#if defined(DOSISH)
+    if (ISALPHA(buf[0]) && buf[1] == ':' && isdirsep(buf[2])) {
+	/* root directory needs a trailing backslash,
+	   otherwise it mean the current directory of the drive */
+	if (p == (buf+2)) p++;
+    }
+#endif
     *p = '\0';
 
@@ -1462,5 +1583,5 @@ rb_file_s_basename(argc, argv)
     }
     name = StringValuePtr(fname);
-    p = strrchr(name, '/');
+    p = strrdirsep(name);
     if (!p) {
 	if (NIL_P(fext) || !(f = rmext(name, ext)))
@@ -1489,10 +1610,20 @@ rb_file_s_dirname(klass, fname)
 
     name = StringValuePtr(fname);
-    p = strrchr(name, '/');
+#if defined(DOSISH)
+    if (ISALPHA(name[0]) && name[1] == ':')
+	name += 2;
+#endif
+    p = strrdirsep(name);
     if (!p) {
-	return rb_str_new2(".");
+#if defined(DOSISH)
+	if (name == RSTRING(fname)->ptr)
+#endif
+	    return rb_str_new2(".");
     }
     if (p == name)
 	p++;
+#if defined(DOSISH)
+    name = RSTRING(fname)->ptr;
+#endif
     dirname = rb_str_new(name, p - name);
     if (OBJ_TAINTED(fname)) OBJ_TAINT(dirname);
@@ -2122,9 +2253,10 @@ is_absolute_path(path)
     const char *path;
 {
+#ifndef DOSISH
     if (path[0] == '/') return 1;
-# if defined DOSISH
-    if (path[0] == '\\') return 1;
-    if (strlen(path) > 2 && path[1] == ':') return 1;
-# endif
+#else
+    if (isdirsep(path[0]) && isdirsep(path[1])) return 1;
+    if (ISALPHA(path[0]) && path[1] == ':' && isdirsep(path[2])) return 1;
+#endif
     return 0;
 }
@@ -2135,28 +2267,46 @@ path_check_1(path)
 {
     struct stat st;
+    char buf[MAXPATHLEN+1];
     char *p = 0;
     char *s;
 
-    if (!is_absolute_path(path)) {
-	char buf[MAXPATHLEN+1];
-
-#ifdef HAVE_GETCWD
+#ifdef DOSISH
+    if (has_drive_letter(path)) {
+	if (!isdirsep(path[2])) {
+	    /* specified drive, but not full path */
+	    getdrivecurdir(buf, *path);
+	    *endofdir(buf) = '\0';
+	    goto cat;
+	}
+    }
+    else if (!isdirsep(path[0]) || !isdirsep(path[1])) {
 	if (getcwd(buf, MAXPATHLEN) == 0) return 0;
+	if (isdirsep(path[0])) *skipprefix(buf) = '\0';
+      cat:
+	strncat(buf, "/", MAXPATHLEN);
+	strncat(buf, path, MAXPATHLEN);
+	buf[MAXPATHLEN] = '\0';
+	path = buf;
+    }
 #else
-	if (getwd(buf) == 0) return 0;
-#endif
+    if (!is_absolute_path(path)) {
+	if (getcwd(buf, MAXPATHLEN) == 0) return 0;
 	strncat(buf, "/", MAXPATHLEN);
 	strncat(buf, path, MAXPATHLEN);
 	buf[MAXPATHLEN] = '\0';
-	return path_check_1(buf);
+	path = buf;
     }
+#endif
     for (;;) {
 	if (stat(path, &st) == 0 && (st.st_mode & 002)) {
-           if (p) *p = '/';
+	    if (p) *p = '/';
 	    return 0;
 	}
-	s = strrchr(path, '/');
+	s = strrdirsep(path);
 	if (p) *p = '/';
 	if (!s || s == path) return 1;
+#ifdef DOSISH
+	if (s == path + 2) return 1;
+#endif
 	p = s;
 	*p = '\0';
@@ -2181,8 +2331,8 @@ rb_path_check(path)
 	if (pend) *pend = '\0';
 	safe = path_check_1(p);
-       if (!safe) {
-           if (pend) *pend = sep;
-           return 0;
-       }
+	if (!safe) {
+	    if (pend) *pend = sep;
+	    return 0;
+	}
 	if (!pend) break;
 	*pend = sep;
@@ -2201,4 +2351,9 @@ is_macos_native_path(path)
     return 0;
 }
+#define is_native_path(path) is_macos_native_path(path)
+#elif defined(DOSISH)
+#define is_native_path(path) has_drive_letter(path)
+#else
+#define is_native_path(path) 0
 #endif
 
@@ -2240,5 +2395,5 @@ rb_find_file_noext(file)
     }
 
-    if (is_absolute_path(file)) {
+    if (is_native_path(file) || is_absolute_path(file)) {
 	for (i=0; ext[i]; i++) {
 	    strcpy(fend, ext[i]);
@@ -2281,15 +2436,6 @@ rb_find_file(file)
 	file = StringValuePtr(fname);
     }
-
-#if defined(__MACOS__) || defined(riscos)
-    if (is_macos_native_path(file)) {
-	if (rb_safe_level() >= 2 && !rb_path_check(file)) {
-	    rb_raise(rb_eSecurityError, "loading from unsafe file %s", file);
-	}
-	return file_load_ok(file);
-    }
-#endif
 
-    if (is_absolute_path(file)) {
+    if (is_native_path(file) || is_absolute_path(file)) {
 	if (rb_safe_level() >= 2 && !rb_path_check(file)) {
 	    rb_raise(rb_eSecurityError, "loading from unsafe file %s", file);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread