[#9627] callargs([nil]) — nobu.nakada@...
なかだです。
8 messages
2000/05/04
[#9642] Re: host.conf は参照しないの? — akira yamada / やまだあきら <akira@...>
15 messages
2000/05/09
[#9643] Thread schedule problem of 1.5.3 (2000-05-09) — Katsuyuki Komatsu <komatsu@...>
小松です。
4 messages
2000/05/09
[#9652] 1.5.3 cleanup — Katsuyuki Komatsu <komatsu@...>
小松です。
13 messages
2000/05/11
[#9653] Re: 1.5.3 cleanup
— matz@... (Yukihiro Matsumoto)
2000/05/11
まつもと ゆきひろです
[#9654] Re: 1.5.3 cleanup
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/11
わたなべです.
[#9660] [PATCH] md5 fix for alpha — Katsuyuki Komatsu <komatsu@...>
小松です。
5 messages
2000/05/11
[#9671] busy loop in `waitpid' — nobu.nakada@...
なかだです。
9 messages
2000/05/13
[#9684] Re: busy loop in `waitpid'
— matz@... (Yukihiro Matsumoto)
2000/05/14
まつもと ゆきひろです
[#9672] IO.popen — Koji Arai <JCA02266@...>
新井です。
22 messages
2000/05/13
[#9673] Re: IO.popen
— Koji Arai <JCA02266@...>
2000/05/13
新井です。
[#9682] Re: IO.popen
— matz@... (Yukihiro Matsumoto)
2000/05/14
まつもと ゆきひろです
[#9685] Re: IO.popen
— Koji Arai <JCA02266@...>
2000/05/14
新井です。
[#9696] Re: IO.popen
— matz@... (Yukihiro Matsumoto)
2000/05/15
まつもと ゆきひろです
[#9676] support mingw32 — WATANABE Hirofumi <eban@...>
わたなべです.
32 messages
2000/05/13
[#9701] Re: support mingw32
— Katsuyuki Komatsu <komatsu@...>
2000/05/16
小松です。
[#9705] Re: support mingw32
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/16
わたなべです.
[#9678] Re: support mingw32
— Masaki Suketa <CQN02273@...>
2000/05/14
助田です.
[#9680] Re: support mingw32
— WATANABE Hirofumi <eban@...>
2000/05/14
わたなべです.
[#9686] Re: support mingw32
— Katsuyuki Komatsu <komatsu@...>
2000/05/15
小松です。
[#9687] Re: support mingw32
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/15
わたなべです.
[#9713] Re: support mingw32
— Katsuyuki Komatsu <komatsu@...>
2000/05/16
小松です。
[#9689] Re: support mingw32
— matz@... (Yukihiro Matsumoto)
2000/05/15
まつもと ゆきひろです
[#9690] Re: support mingw32
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/15
わたなべです.
[#9725] SEGV on thread and socket — WATANABE Hirofumi <Hirofumi.Watanabe@...>
わたなべです.
11 messages
2000/05/17
[#9731] Re: SEGV on thread and socket
— matz@... (Yukihiro Matsumoto)
2000/05/17
まつもと ゆきひろです
[#9732] Re: SEGV on thread and socket
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/17
わたなべです.
[#9756] deadlock detection problem — Katsuyuki Komatsu <komatsu@...>
小松です。
5 messages
2000/05/18
[#9760] date2.rb and cal.rb — Tadayoshi Funaba <tadf@...>
ふなばです。
8 messages
2000/05/18
[#9761] IRIX 6.5 cc -64 support — Katsuyuki Komatsu <komatsu@...>
小松です。
9 messages
2000/05/19
[#9766] Re: IRIX 6.5 cc -64 support
— matz@... (Yukihiro Matsumoto)
2000/05/19
まつもと ゆきひろです
[#9780] No such file to load -- CWD's script — WATANABE Hirofumi <eban@...>
わたなべです.
5 messages
2000/05/20
[#9806] rescue variable syntax — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
40 messages
2000/05/24
[#9808] Re: rescue variable syntax
— OZAWA Sakuro <crouton@...>
2000/05/24
さくです。
[#9811] Re: rescue variable syntax
— ARIMA Yasuhiro <fit0298@...>
2000/05/24
有馬です。
[#9814] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/24
まつもと ゆきひろです
[#9821] Re: rescue variable syntax
— nobu.nakada@...
2000/05/25
なかだです。
[#9823] Re: rescue variable syntax
— ARIMA Yasuhiro <fit0298@...>
2000/05/25
有馬です。
[#9833] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/25
まつもと ゆきひろです
[#9861] Re: rescue variable syntax
— gotoken@... (GOTO Kentaro)
2000/05/25
ごとけんです
[#9866] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/25
まつもと ゆきひろです
[#9870] Re: rescue variable syntax
— nagai@...
2000/05/26
永井@知能.九工大です.
[#9873] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/27
まつもと ゆきひろです
[#9874] Re: rescue variable syntax
— nagai@...
2000/05/27
永井@知能.九工大です.
[#9883] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/28
まつもと ゆきひろです
[#9884] Re: rescue variable syntax
— ARIMA Yasuhiro <fit0298@...>
2000/05/28
有馬です。
[#9888] Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/05/29
まつもと ゆきひろです
[#9968] 例外補足 ( Re: rescue variable syntax
— ARIMA Yasuhiro <fit0298@...>
2000/06/06
有馬です。
[#9969] Re: 例外補足 ( Re: rescue variable syntax
— matz@... (Yukihiro Matsumoto)
2000/06/06
まつもと ゆきひろです
[#9970] Re: 例外補足 ( Re: rescue variable syntax
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/06/06
わたなべです.
[#9812] Forward: Error in NT makefile (PR#7) — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
21 messages
2000/05/24
[#9817] Re: Forward: Error in NT makefile (PR#7)
— KIMURA Koichi <kimura@...>
2000/05/24
[#9820] Re: Forward: Error in NT makefile (PR#7)
— Katsuyuki Komatsu <komatsu@...>
2000/05/25
小松です。
[#9842] Re: Forward: Error in NT makefile (PR#7)
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/25
わたなべです.
[#9855] Re: Forward: Error in NT makefile (PR#7)
— Katsuyuki Komatsu <komatsu@...>
2000/05/25
小松です。
[#9879] Re: Forward: Error in NT makefile (PR#7)
— WATANABE Hirofumi <eban@...>
2000/05/28
わたなべです.
[#9882] Re: Forward: Error in NT makefile (PR#7)
— WATANABE Hirofumi <eban@...>
2000/05/28
わたなべです.
[#9900] Re: Forward: Error in NT makefile (PR#7)
— Katsuyuki Komatsu <komatsu@...>
2000/05/29
小松です。
[#9921] Re: Forward: Error in NT makefile (PR#7)
— Katsuyuki Komatsu <komatsu@...>
2000/05/31
小松です。
[#9922] Re: Forward: Error in NT makefile (PR#7)
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/31
わたなべです.
[#9938] Re: Forward: Error in NT makefile (PR#7)
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/06/01
わたなべです.
[#9941] Re: Forward: Error in NT makefile (PR#7)
— Katsuyuki Komatsu <komatsu@...>
2000/06/01
小松です。
[#9947] Re: Forward: Error in NT makefile (PR#7)
— matz@... (Yukihiro Matsumoto)
2000/06/01
まつもと ゆきひろです
[#9824] [BUG?] regex/scan — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
6 messages
2000/05/25
[#9841] timeout.rb — Wakou Aoyama <wakou@...>
青山です。
14 messages
2000/05/25
[#9844] Re: timeout.rb
— matz@... (Yukihiro Matsumoto)
2000/05/25
まつもと ゆきひろです
[#9846] Re: timeout.rb
— Wakou Aoyama <wakou@...>
2000/05/25
青山です。
[#9848] Re: timeout.rb
— Wakou Aoyama <wakou@...>
2000/05/25
青山です。
[#9857] $0 handling on NT — Katsuyuki Komatsu <komatsu@...>
小松です。
18 messages
2000/05/25
[#9869] Re: $0 handling on NT
— nobu.nakada@...
2000/05/26
なかだです。
[#9880] Re: $0 handling on NT
— WATANABE Hirofumi <eban@...>
2000/05/28
わたなべです.
[#9887] Re: $0 handling on NT
— nobu.nakada@...
2000/05/29
なかだです。
[#9890] Re: $0 handling on NT
— WATANABE Hirofumi <Hirofumi.Watanabe@...>
2000/05/29
わたなべです.
[#9925] — Shin-ichiro Hara <sinara@...>
原です。
8 messages
2000/05/31
[ruby-dev:9875] Re: $0 handling on NT
From:
nobu.nakada@...
Date:
2000-05-27 18:05:26 UTC
List:
ruby-dev #9875
なかだです。
At Fri, 26 May 2000 21:11:51 +0900,
Katsuyuki Komatsu <komatsu@sarion.co.jp> wrote:
> | それと、Windows で(DOS では少なかったような気がする)日本語のファイル
> |名をつける人って結構いるんですが、2byte 目に '\' を含むパス名ってどう
> |したもんでしょうかねぇ。SJIS 決めうちってわけにはいかないし。
>
> win32/win32.cでは、CharPrev()とCharNext()を使ってます。
CharNext() ってなに? とか思ったら Win32 API ですか。
> path++みたいなところを全部マクロか関数にしてWin32だったら
> CharPrev()とCharNext()を使うというような形はどうですか?
こんなでしょうか。ついでに basename, dirname でドライブ付きの
場合も手を加えてみました。
> |--- current/file.c Sun May 14 23:19:21 2000
> |+++ build/file.c Fri May 26 09:16:05 2000
>
> lastsep()の所ですが、pathが増えてないので
> 無限ループになってます。
うぐぅ。(;_;)
あと、一つまずそうなところが。これは 1.4 にもありますね。
File.basename(string.taint, "").tainted? == false
Index: file.c
===================================================================
RCS file: /home/cvs/ruby/file.c,v
retrieving revision 1.25
diff -u -2 -p -r1.25 file.c
--- file.c 2000/05/25 05:55:00 1.25
+++ file.c 2000/05/27 17:54:36
@@ -67,4 +67,19 @@ char *strrchr _((const char*,const char)
#include <sys/stat.h>
+#ifdef WINDOWS
+#include "win32.h"
+#endif
+
+#ifdef CharNext
+#define next_char CharNext
+#else
+#define next_char(p) ((p) + 1)
+#endif
+#ifdef CharPrev
+#define prev_char CharPrev
+#else
+#define prev_char(s, p) ((p) - 1)
+#endif
+
#ifdef __EMX__
#define lstat stat
@@ -1170,5 +1185,5 @@ rb_file_s_expand_path(argc, argv)
{
VALUE fname, dname;
- char *s, *p;
+ char *s, *p, *t;
char buf[MAXPATHLEN+2];
int tainted;
@@ -1196,7 +1211,10 @@ rb_file_s_expand_path(argc, argv)
s++;
#endif
+ t = s;
while (*s && !isdirsep(*s)) {
- *p++ = *s++;
+ s = next_char(s);
}
+ memcpy(p, t, s - t);
+ p += s - t;
*p = '\0';
#ifdef HAVE_PWD_H
@@ -1235,5 +1253,5 @@ rb_file_s_expand_path(argc, argv)
}
p = &buf[strlen(buf)];
- while (p > buf && *(p - 1) == '/') p--;
+ while (p > buf && (t = prev_char(buf, p), isdirsep(*t))) p = t;
}
else {
@@ -1246,30 +1264,35 @@ rb_file_s_expand_path(argc, argv)
*p = '/';
- for ( ; *s; s++) {
+ while (*s) {
switch (*s) {
case '.':
- if (*(s+1)) {
- switch (*++s) {
- case '.':
- 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--;
- }
- else {
- *++p = '.';
- do *++p = '.'; while (*++s == '.');
- --s;
- }
- break;
- case '/':
+ switch (*++s) {
+ case '\0':
+ break;
+ case '.':
+ if (*(s+1) == '\0' || isdirsep(*(s+1))) {
+ /* We must go back to the parent */
+ if (isdirsep(*p) && p > buf) p = prev_char(buf, p);
+ while (p > buf && !isdirsep(*p)) p = prev_char(buf, p);
+ ++s;
+ }
+ else {
+ *(p = next_char(p)) = '.';
+ do *++p = '.'; while (*++s == '.');
+ }
+ break;
+ case '/':
#if defined DOSISH
- case '\\':
+ case '\\':
#endif
- if (!isdirsep(*p)) *++p = '/';
- break;
- default:
- *++p = '.'; *++p = *s; break;
- }
+ if (!isdirsep(*p)) *(p = next_char(p)) = '/';
+ ++s;
+ break;
+ default:
+ *(p = next_char(p)) = '.';
+ t = next_char(s);
+ memcpy(++p, s, t - s);
+ s = t;
+ break;
}
break;
@@ -1278,12 +1301,17 @@ rb_file_s_expand_path(argc, argv)
case '\\':
#endif
- if (!isdirsep(*p)) *++p = '/'; break;
+ if (!isdirsep(*p)) *(p = next_char(p)) = '/';
+ ++s;
+ break;
default:
- *++p = *s;
+ p = next_char(p);
+ t = next_char(s);
+ memcpy(p, s, t - s);
+ s = t;
}
}
/* Place a \0 at end. If path ends with a "/", delete it */
- if (p == buf || !isdirsep(*p)) p++;
+ if (p == buf || !isdirsep(*p)) p = next_char(p);
*p = '\0';
@@ -1316,4 +1344,30 @@ rmext(p, e)
}
+#ifdef DOSISH
+static char* lastsep(path)
+ char *path;
+{
+ char *last = NULL;
+ while (*path) {
+ if (isdirsep(*path))
+ last = path;
+ path = next_char(path);
+ }
+ return last;
+}
+
+static int hasdrive(path)
+ char *path;
+{
+ if (isalpha(path[0]) && path[1] == ':')
+ return Qtrue;
+ else
+ return Qfalse;
+}
+
+#else
+#define lastsep(path) strrchr((path), '/')
+#endif
+
static VALUE
rb_file_s_basename(argc, argv)
@@ -1329,19 +1383,22 @@ rb_file_s_basename(argc, argv)
}
name = STR2CSTR(fname);
- p = strrchr(name, '/');
+#ifdef DOSISH
+ if (hasdrive(name))
+ name += 2;
+#endif
+ p = lastsep(name);
if (!p) {
- if (!NIL_P(fext)) {
- f = rmext(name, ext);
- if (f) return rb_str_new(name, f);
+ if (NIL_P(fext) || !(f = rmext(p, ext)))
+ return fname;
+ basename = rb_str_new(p, f);
+ } else {
+ p++; /* skip last `/' */
+ if (NIL_P(fext) || !(f = rmext(p, ext))) {
+ basename = rb_str_new2(p);
+ } else {
+ basename = rb_str_new(p, f);
}
- return fname;
}
- p++; /* skip last `/' */
- if (!NIL_P(fext)) {
- f = rmext(p, ext);
- if (f) return rb_str_new(p, f);
- }
- basename = rb_str_new2(p);
- if (OBJ_TAINTED(fname)) OBJ_TAINT(basename);
+ OBJ_INFECT(basename, fname);
return basename;
}
@@ -1355,6 +1412,15 @@ rb_file_s_dirname(obj, fname)
name = STR2CSTR(fname);
- p = strrchr(name, '/');
+ p = lastsep(name);
if (!p) {
+#ifdef DOSISH
+ if (hasdrive(name)) {
+ /* when "X:basename.ext" then return "X:." */
+ dirname = rb_str_new(name, 3);
+ RSTRING(dirname)->ptr[2] = '.';
+ OBJ_INFECT(dirname, fname);
+ return dirname;
+ }
+#endif
return rb_str_new2(".");
}
@@ -1362,5 +1428,5 @@ rb_file_s_dirname(obj, fname)
p++;
dirname = rb_str_new(name, p - name);
- if (OBJ_TAINTED(fname)) OBJ_TAINT(dirname);
+ OBJ_INFECT(dirname, fname);
return dirname;
}
@@ -1982,5 +2048,5 @@ path_check_1(path)
return 0;
}
- s = strrchr(path, '/');
+ s = lastsep(path);
if (p) *p = '/';
if (!s || s == path) return 1;
--
そうだ 強気に ちょっと インチキに☆彡
中田 "Bugるくらいがちょうどいいかも;-)" 伸悦