From c8b2171c669c5421fa7c430ee75b902c2b29948d Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 16 Sep 2005 13:42:17 +0000 Subject: [PATCH] * file.c (rb_file_s_extname): empty string for path name ending with a period. fixed: [ruby-core:05651] * file.c (rb_file_join): smarter behavior at edge cases. fixed: [ruby-core:05706] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 +++++++++- file.c | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index d685a460a2..0f83e5f98d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Fri Sep 16 22:41:18 2005 Nobuyoshi Nakada + + * file.c (rb_file_s_extname): empty string for path name ending with a + period. fixed: [ruby-core:05651] + + * file.c (rb_file_join): smarter behavior at edge cases. + fixed: [ruby-core:05706] + Fri Sep 16 18:34:01 2005 Yukihiro Matsumoto * ext/syck/node.c (syck_replace_str): was using return from the @@ -119,7 +127,7 @@ Thu Sep 15 13:54:33 2005 Tanaka Akira Thu Sep 15 11:39:18 2005 Hidetoshi NAGAI - * ext/tk/lib/tk/dialog.rb: If a dialog does not show up yet, + * ext/tk/lib/tk/dialog.rb: If a dialog does not show up yet, TkDialogObj#name raises an exception. [ruby-talk:156109] Thu Sep 15 11:01:58 2005 NAKAMURA Usaku diff --git a/file.c b/file.c index 4cd680b60c..60c02bf7f1 100644 --- a/file.c +++ b/file.c @@ -2646,7 +2646,7 @@ rb_file_s_extname(VALUE klass, VALUE fname) p++; e = strrchr(p, '.'); /* get the last dot of the last component */ - if (!e || e == p) /* no dot, or the only dot is first? */ + if (!e || e == p || !e[1]) /* no dot, or the only dot is first or end? */ return rb_str_new2(""); extname = rb_str_new(e, chompdirsep(e) - e); /* keep the dot, too! */ OBJ_INFECT(extname, fname); @@ -2705,7 +2705,7 @@ rb_file_join(VALUE ary, VALUE sep) long len, i; int taint = 0; VALUE result, tmp; - char *name; + char *name, *tail; if (RARRAY(ary)->len == 0) return rb_str_new(0, 0); if (OBJ_TAINTED(ary)) taint = 1; @@ -2739,11 +2739,18 @@ rb_file_join(VALUE ary, VALUE sep) } break; default: - tmp = rb_obj_as_string(tmp); + StringValueCStr(tmp); } name = StringValueCStr(result); - if (i > 0 && !NIL_P(sep) && !*chompdirsep(name)) - rb_str_buf_append(result, sep); + if (i > 0 && !NIL_P(sep)) { + tail = chompdirsep(name); + if (isdirsep(RSTRING(tmp)->ptr[0])) { + RSTRING(result)->len = tail - name; + } + else if (!*tail) { + rb_str_buf_append(result, sep); + } + } rb_str_buf_append(result, tmp); if (OBJ_TAINTED(tmp)) taint = 1; }