From: matz@... (Yukihiro Matsumoto) Date: 2003-02-11T22:24:28+09:00 Subject: [ruby-dev:19549] Re: [PATCH] file.c for (PR#389) and (PR#390) まつもと ゆきひろです In message "[ruby-dev:19548] [PATCH] file.c for (PR#389) and (PR#390)" on 03/02/11, nobu.nakada@nifty.ne.jp writes: |まつもとさんのほうで直してるかも知れませんが、 |File.dirname("a///b") => "a//"となるのも気になったので直してみ |ました。 直してます。わたしのはドライブレターとか見てないので、なかだ さんの修正のほうがよいのかもしれません。私の修正はこんな感じ です。今ちょっと気力がないので(いつものことですが)、見比べて よさそうなのをコミットしてくださると助かります。 Tue Feb 11 02:15:21 2003 Yukihiro Matsumoto * file.c (strrdirsep): ignore trailing '/' characters. * file.c (rb_file_s_basename): remove trailing '/' characters. Mon Feb 10 23:05:06 2003 Yukihiro Matsumoto * file.c (rb_file_s_expand_path): File.expand_path(".","/") should return "/". (ruby-bugs-ja PR#389) Index: file.c =================================================================== RCS file: /src/ruby/file.c,v retrieving revision 1.131 diff -p -u -1 -r1.131 file.c --- file.c 31 Jan 2003 04:00:14 -0000 1.131 +++ file.c 11 Feb 2003 13:22:56 -0000 @@ -1415,3 +1415,9 @@ strrdirsep(path) if (isdirsep(*path)) { - last = path++; + char *tmp = path+1; + while (*tmp && isdirsep(*tmp)) { + tmp++; + } + if (!*tmp) break; + last = path; + path = tmp; } @@ -1580,2 +1586,3 @@ rb_file_s_expand_path(argc, argv) while (p > buf && strrdirsep(buf) == p - 1) p--; + if (p == buf) p++; } @@ -1711,3 +1718,3 @@ rb_file_s_basename(argc, argv) f = rmext(name, ext); - } + } } @@ -1722,7 +1729,7 @@ rb_file_s_basename(argc, argv) if (NIL_P(fext) || !(f = rmext(p, ext))) { - basename = rb_str_new2(p); - } - else { - basename = rb_str_new(p, f); + f = strlen(p) - 1; /* remove trailing / */ + while (f > 0 && p[f] == '/') f--; + f++; } + basename = rb_str_new(p, f); }