[#13727] Thread.critical=true and fork and exec — Kazuhiro NISHIYAMA <zn@...>
このような感じでforkとexecの間に必要のないIOを閉じようと
[#13754] Kconv(NKF) with tainted strings — Tietew <tietew@...>
Tietew といいます。
[#13765] GenerativeHash — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
まつもと ゆきひろです
高橋征義です。
TAKAHASHI Masayoshiさんの
高橋征義です。
[#13767] Dir::glob() — "Akinori MUSHA" <knu@...>
File::fnmatch の提案のときに切り離した、 Dir::glob の拡張を
[#13774] mkmf.rb: cleaning facility — Takaaki Tateishi <ttate@...>
立石です.
まつもと ゆきひろです
At Mon, 9 Jul 2001 15:20:28 +0900,
まつもと ゆきひろです
[#13779] dln.c patch for Mac OS X — Mitsuhiro Kondo <kondo@...>
こんにちは、近藤と申します。
[#13800] Re: [ruby-cvs] ruby: * ruby.h: fix a wrong function name: rb_iglob() -> rb_globi(). — nobu.nakada@...
なかだです。
わたなべです。
まつもと ゆきひろです
わたなべです。
まつもと ゆきひろです
わたなべです。
まつもと ゆきひろです
At Tue, 10 Jul 2001 15:23:04 +0900,
わたなべです。
At Tue, 10 Jul 2001 16:50:52 +0900,
もうひとつあった。
At Tue, 10 Jul 2001 18:04:57 +0900,
まつもと ゆきひろです
At Mon, 16 Jul 2001 01:16:31 +0900,
まつもと ゆきひろです
At Mon, 16 Jul 2001 09:22:46 +0900,
まつもと ゆきひろです
[#13817] Fw: DOSISH file.c changes — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
[#13818] COPYING files — "Akinori MUSHA" <knu@...>
Ruby は GPL のシングルライセンスではないのに、 COPYING という
先日の:
高橋征義です。
[#13821] [BUG] rb_gc_mark(): unknown data type 0x1c(0xbfff3d6c) non object — akira yamada / やまだあきら <akira@...>
[#13824] config.{guess,sub} too old? — akira yamada / やまだあきら <akira@...>
[#13828] supported platforms / K&R — "Akinori MUSHA" <knu@...>
digest モジュールの各プラットフォームでの動作確認をお願いした
新井です。
清水@biglobeです。
新井です。
清水@biglobe です。
なかだです。
新井です。
新井です。
なかだです。
新井です。
なかだです。
新井です。
なかだです。
新井です。
新井です。
[#13833] Net::HTTP#proxy? — WATANABE Hirofumi <eban@...>
わたなべです。
[#13866] yield and proc — Takashi Ikeda <nov28@...>
池田と申します。
[#13870] massign to Hash — nobu.nakada@...
なかだです。
[#13878] Prototype for rb_gc_mark / volatile in ruby.h — Tietew <tietew@...>
Tietew です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
むらけんです.
[#13908] Forward: Seg fault in latest regex.c (PR#154) — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#13924] doc/ — Minero Aoki <aamine@...>
あおきです。
[#13929] error: multiple require of digest/* — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
なかだです。
まつもと ゆきひろです
[#13940] IO#read — "Akinori MUSHA" <knu@...>
IO#read を使って何度もストリームから読み込むような処理をする
なかだです。
まつもと ゆきひろです
At Sat, 21 Jul 2001 03:21:11 +0900,
まつもと ゆきひろです
At Sat, 21 Jul 2001 04:43:06 +0900,
At Sat, 21 Jul 2001 05:03:10 +0900,
[#13943] [REQ] ruby_stop without exit — Tietew <tietew@...>
Tietew です。
[#13959] Re: [ruby-list:30682] Re: overwride method — "Akinori MUSHA" <knu@...>
At Fri, 20 Jul 2001 21:09:36 +0900,
ごとけんです
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
[ruby-dev:13969]>
まつもと ゆきひろです
ごとけんです
なひです。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
なひです。
まつもと ゆきひろです
なひです。
まつもと ゆきひろです
なひです。
まつもと ゆきひろです
ごとけんです
まつもと ゆきひろです
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
あづみです。
まつもと ゆきひろです
In <996211878.306635.31396.nullmailer@ev.netlab.jp>
まつもと ゆきひろです
In <996255758.830993.629.nullmailer@ev.netlab.jp>
まつもと ゆきひろです
In <996282482.936326.1948.nullmailer@ev.netlab.jp>
なひです。
まつもと ゆきひろです
なひです。
あづみです。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
前田です。
まつもと ゆきひろです
前田です。
まつもと ゆきひろです
[#14003] to_int in mathn [Re: overwride method ] — keiju@... (石塚圭樹)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
原です。
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
[#14026] Exception in coerce — Shin-ichiro HARA <sinara@...>
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
原です。
まつもと ゆきひろです
[#14045] load "~/foo" — WATANABE Hirofumi <eban@...>
わたなべです。
[#14097] DOSISH file.c — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)@帰省中です。
[ruby-dev:13847] Re: DOSISH file.c changes
こんにちは、なかむら(う)です。
At Fri, 13 Jul 2001 22:56:10 +0900, nobu.nakada@nifty.ne.jp wrote in
'[ruby-dev:13845] Re: Fw: DOSISH file.c changes'
> (1) is_absolute_path()がc:hogeみたいのに対して偽を返すようになっ
> てるので、require 'c:hoge'なんてのがエラーになりそうな気が
> するんですが、そういうもん? これはどちらかといえば
> is_macos_native_path()と同様の扱いにしたほうがいいようにも
> 思えますが。
c:hogeみたいのがabsoluteなpathじゃないというのは正しいように
私は思うのですが、どうでしょう?
ただし、
> (2) rb_file_s_expand_path()でis_absolute_path()で分岐しているけ
> れど、ドライブレターを考えたときには絶対パスかどうかという
> 分け方はできないと思うので、それぞれのパターンについて分岐
> したほうがいいのでは。
これは当然だと思います。
> (3) パッチが壊れてるとか。
あぅ、壊れてましたか...
道理でパッチがあたらんわけだ。
# 自分の環境がおかしいと思い込んでました
さて、なかださんのパッチですが、コンパイル通らないです。
getdrivecurdir()の引数の数と、driveという引数があるのに同じ
名前のローカル変数があるのがまずいです。
で、これを回避しても、File.dirname('d:hoge')で落ちます。うー
ん。
ところで、僕もCheng氏のパッチをいじってたのですが、とりあえ
ずつけときます。なんか後出しはずるい感じがしますが :-P
で、いずれのパッチでも言えることですが、File.dirname('c:/hoge')
が'c:/'を返すので(これはわざとですけど)、
File.join(File.dirname('c:/hoge'), File.basename('c:/hoge'))
が'c://hoge'になります。むーんむーん。
Index: file.c
===================================================================
RCS file: /src/ruby/file.c,v
retrieving revision 1.58
diff -u -p -r1.58 file.c
--- file.c 2001/06/19 04:35:13 1.58
+++ file.c 2001/07/13 04:08:56
@@ -69,11 +69,13 @@ char *strrchr _((const char*,const char)
#ifndef HAVE_LSTAT
#define lstat(path,st) stat(path,st)
#endif
-
+
VALUE rb_cFile;
VALUE rb_mFileTest;
static VALUE rb_cStat;
+static int is_absolute_path(path);
+
static int
apply2files(func, vargs, arg)
int (*func)();
@@ -1345,14 +1347,62 @@ 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)) {
- *p++ = *s++;
- }
+ else if (ISALPHA(s[0]) && s[1] == ':') {
+ if (isdirsep(s[2])) {
+ /* specified drive letter, and full path */
+ /* skip drive letter */
+ while (*s && !isdirsep(*s)) {
+ *p++ = *s++;
+ }
+ }
+ else {
+ /* specified drive, but not full path */
+ char drive[3];
+ char oldcwd[MAXPATHLEN+1];
+
+ drive[0] = *s++;
+ drive[1] = *s++;
+ 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);
+ chdir(drive);
+
+ tainted = 1;
+ getcwd(buf, MAXPATHLEN);
+ p = &buf[strlen(buf)];
+ if ( *s )
+ {
+ /* need to append '/' before appending the rest of the path */
+ if (! isdirsep(*(p - 1))) *p++ = '/';
+ while (*s && !isdirsep(*s)) {
+ *p++ = *s++;
+ }
+ }
+ chdir(oldcwd);
+ }
}
+#endif
+#if defined DOSISH && ! defined(__CYGWIN__)
+ else if (isdirsep(*s) && !is_absolute_path(s)) {
+ /* specified full path, but not drive letter */
+ /* we need to get the drive letter */
+ tainted = 1;
+#ifdef HAVE_GETCWD
+ getcwd(buf, MAXPATHLEN);
+#else
+ getwd(buf);
#endif
- else if (!isdirsep(*s)) {
+ p = &buf[2];
+ while (*s && !isdirsep(*s)) {
+ *p++ = *s++;
+ }
+ }
+#endif
+ else if (!is_absolute_path(s)) {
if (!NIL_P(dname)) {
dname = rb_file_s_expand_path(1, &dname);
if (OBJ_TAINTED(dname)) tainted = 1;
@@ -1367,7 +1417,7 @@ rb_file_s_expand_path(argc, argv)
#endif
}
p = &buf[strlen(buf)];
- while (p > buf && *(p - 1) == '/') p--;
+ while (p > buf && isdirsep(*(p - 1))) p--;
}
else {
while (*s && isdirsep(*s)) {
@@ -1384,7 +1434,7 @@ rb_file_s_expand_path(argc, argv)
if (*(s+1)) {
switch (*++s) {
case '.':
- if (*(s+1) == '\0' || isdirsep(*(s+1))) {
+ 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--;
@@ -1399,7 +1449,7 @@ rb_file_s_expand_path(argc, argv)
#if defined DOSISH
case '\\':
#endif
- if (!isdirsep(*p)) *++p = '/';
+ if (!isdirsep(*p)) *++p = '/';
break;
default:
*++p = '.'; *++p = *s; break;
@@ -1415,9 +1465,16 @@ rb_file_s_expand_path(argc, argv)
*++p = *s;
}
}
-
+
/* 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';
fname = rb_str_new2(buf);
@@ -1448,6 +1505,20 @@ rmext(p, e)
return 0;
}
+
+static char *
+strrdirsep(name)
+ char *name;
+{
+ char *last = NULL;
+ do {
+ if (isdirsep(*name)) last = name;
+ name++;
+ }
+ while( *name );
+ return last;
+}
+
static VALUE
rb_file_s_basename(argc, argv)
int argc;
@@ -1461,8 +1532,20 @@ rb_file_s_basename(argc, argv)
ext = StringValuePtr(fext);
}
name = StringValuePtr(fname);
- p = strrchr(name, '/');
+ p = strrdirsep(name);
if (!p) {
+#if defined(DOSISH)
+ if (ISALPHA(name[0]) && name[1] == ':') {
+ name += 2;
+ if (NIL_P(fext)) {
+ f = strlen(name);
+ }
+ else {
+ f = rmext(name, ext);
+ }
+ }
+ else
+#endif
if (NIL_P(fext) || !(f = rmext(name, ext)))
return fname;
basename = rb_str_new(name, f);
@@ -1488,12 +1571,23 @@ rb_file_s_dirname(klass, fname)
VALUE dirname;
name = StringValuePtr(fname);
- p = strrchr(name, '/');
+ p = strrdirsep(name);
if (!p) {
+#if defined(DOSISH)
+ if (ISALPHA(name[0]) && name[1] == ':') {
+ dirname = rb_str_new(name, 2);
+ OBJ_INFECT(dirname, fname);
+ return dirname;
+ }
+#endif
return rb_str_new2(".");
}
if (p == name)
p++;
+#if defined(DOSISH)
+ if ( ISALPHA(name[0]) && name[1] == ':' && p == &name[2])
+ p++;
+#endif
dirname = rb_str_new(name, p - name);
if (OBJ_TAINTED(fname)) OBJ_TAINT(dirname);
return dirname;
@@ -1795,15 +1889,15 @@ rb_f_test(argc, argv)
if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino)
return Qtrue;
return Qfalse;
-
+
case '=':
if (st1.st_mtime == st2.st_mtime) return Qtrue;
return Qfalse;
-
+
case '>':
if (st1.st_mtime > st2.st_mtime) return Qtrue;
return Qfalse;
-
+
case '<':
if (st1.st_mtime < st2.st_mtime) return Qtrue;
return Qfalse;
@@ -2121,10 +2215,12 @@ static int
is_absolute_path(path)
const char *path;
{
- if (path[0] == '/') return 1;
+#if ! defined(DOSISH) || defined(__CYGWIN__)
+ if (path[0] == '/') return 1;
+#endif
# if defined DOSISH
- if (path[0] == '\\') return 1;
- if (strlen(path) > 2 && path[1] == ':') return 1;
+ if (strlen(path) > 3 && path[1] == ':' && isdirsep(path[2]) ) return 1;
+ if (strlen(path) > 2 && isdirsep(path[0]) && isdirsep(path[1]) ) return 1;
# endif
return 0;
}
@@ -2155,7 +2251,7 @@ path_check_1(path)
if (p) *p = '/';
return 0;
}
- s = strrchr(path, '/');
+ s = strrdirsep(path);
if (p) *p = '/';
if (!s || s == path) return 1;
p = s;
@@ -2174,7 +2270,7 @@ rb_path_check(path)
p = path;
pend = strchr(path, sep);
-
+
for (;;) {
int safe;
それでは。
--
U.Nakamura <usa@osb.att.ne.jp>