From: nobu.nakada@... Date: 2000-05-29T19:42:43+09:00 Subject: [ruby-dev:9895] Re: $0 handling on NT なかだです。 At Mon, 29 May 2000 14:34:29 +0900, matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > |あまり合意が取れてないかもしれないけど, Ruby 内では / が > |path の区切りです(と思っている). > |だから \ を / に変換するのが筋でしょう. > > 私もそう思ってます。'\'や'::'を使う人はそのリスクも一緒に負っ > ていると認識してます。 Ruby 内での区切りについては了解してるんですが、外部でのファイ ル名とのギャップをどこで吸収するのかなと。file.c の中でやろうと してるのかと思ったんですが、すべて「at your own risk」であると いうことならそれも納得です。 ということであれば、$0 の処理というのはどこに持っていったもん でしょうか。今 main() では NtInitialize() というのがありますが、 これだと NT だけでしょうから、システム依存の初期化というのを設 けてそこに持って行くというのでどうでしょうか。Metrowerks 用の初 期化もそっちですることにして。 > |あと, locale はもっと考えて入れないと. > |いままではある意味使うのを却下してたわけですし. > > です。今後もlocaleの採用は拒否します。ちゃんとM17Nの結論が出 > るまでは。 すいません、早計でした。いやまずいかなとは思ったんですが。 # でもやっちゃうやつ > おバカ。 それと File.basename で taint が消えないようにするパッチです。 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/29 10:41:10 @@ -1331,17 +1331,16 @@ rb_file_s_basename(argc, argv) p = strrchr(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; } -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦