From: nobuyoshi nakada Date: 2005-11-18T17:34:53+09:00 Subject: [ruby-dev:27744] Re: File.split("A:a/b") and File.split("A://///") on mswin32 なかだです。 At Fri, 18 Nov 2005 15:41:31 +0900, U.Nakamura wrote in [ruby-dev:27742]: > | ちょっと調べていて気がついたのですが、 > | > | $ ./ruby -ve 'p File.dirname("A:a/b")' > | ruby 1.9.0 (2005-07-22) [i386-mswin32] > | "A:a." > | > | $ ./ruby -ve 'p File.dirname("A://///")' > | ruby 1.9.0 (2005-07-22) [i386-mswin32] > | "A://///" > | > | という挙動で、私としては "A:a" を "A:/" を期待したのですが、 > | この期待は裏切られるのが仕様なのでしょうか? > > その期待を裏切ってしまうのは不具合と思われますので、しばらく > お待ちください。 これでどうでしょうか。ついでに[ruby-core:05076]も思い出してしま いましたが。 Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.223 diff -U2 -p -u -r1.223 file.c --- file.c 15 Nov 2005 14:55:16 -0000 1.223 +++ file.c 18 Nov 2005 08:22:10 -0000 @@ -2627,6 +2627,6 @@ rb_file_s_dirname(VALUE klass, VALUE fna root = skiproot(name); #ifdef DOSISH_UNC - if (root > name + 2 && isdirsep(*name)) - name = root - 2; + if (root > name + 1 && isdirsep(*name)) + root = skipprefix(name = root - 2); #else if (root > name + 1) @@ -2639,9 +2639,16 @@ rb_file_s_dirname(VALUE klass, VALUE fna if (p == name) return rb_str_new2("."); - dirname = rb_str_new(name, p - name); #ifdef DOSISH_DRIVE_LETTER - if (root == name + 2 && name[1] == ':') - rb_str_cat(dirname, ".", 1); + if (has_drive_letter(name) && root != name + 3) { + dirname = rb_str_new(name, 2); + if (root != name + 2) --root; + if (p == root) + rb_str_cat(dirname, ".", 1); + else + rb_str_cat(dirname, root, p - root); + } + else #endif + dirname = rb_str_new(name, p - name); OBJ_INFECT(dirname, fname); return dirname; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦