From 34c96140f3e767e0a3bd9e82db55e46593d4f3b8 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 17 May 2008 02:29:13 +0000 Subject: * file.c (rb_file_s_extname): first dot is not an extension name. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ file.c | 4 ++-- test/ruby/test_file_exhaustive.rb | 11 +++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 565a20b128..b52fdfe97f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Sat May 17 11:29:11 2008 Nobuyoshi Nakada + + * file.c (rb_file_s_extname): first dot is not an extension name. + Sat May 17 03:21:29 2008 Yukihiro Matsumoto * array.c (rb_ary_sort_bang): stop memory leak. [ruby-dev:34726] diff --git a/file.c b/file.c index f89248b521..1f7b207195 100644 --- a/file.c +++ b/file.c @@ -3104,7 +3104,7 @@ rb_file_s_extname(VALUE klass, VALUE fname) if (!p) p = name; else - p++; + name = ++p; e = 0; while (*p) { @@ -3134,7 +3134,7 @@ rb_file_s_extname(VALUE klass, VALUE fname) break; p = CharNext(p); } - if (!e || e+1 == p) /* no dot, or the only dot is first or end? */ + if (!e || e == name || e+1 == p) /* no dot, or the only dot is first or end? */ return rb_str_new(0, 0); extname = rb_str_new(e, p - e); /* keep the dot, too! */ rb_enc_copy(extname, fname); diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb index be28fc6dd9..274f7bf058 100644 --- a/test/ruby/test_file_exhaustive.rb +++ b/test/ruby/test_file_exhaustive.rb @@ -411,6 +411,17 @@ class TestFileExhaustive < Test::Unit::TestCase def test_extname assert(".test", File.extname(@file)) assert_equal("", File.extname("foo")) + assert_equal("", File.extname("/foo")) + assert_equal("", File.extname(".foo")) + assert_equal("", File.extname("/.foo")) + assert_equal("", File.extname("bar/.foo")) + assert_equal("", File.extname("/bar/.foo")) + assert_equal(".ext", File.extname("foo.ext")) + assert_equal(".ext", File.extname("/foo.ext")) + assert_equal(".ext", File.extname(".foo.ext")) + assert_equal(".ext", File.extname("/.foo.ext")) + assert_equal(".ext", File.extname("bar/.foo.ext")) + assert_equal(".ext", File.extname("/bar/.foo.ext")) assert_equal("", File.extname("")) if /cygwin|mingw|mswin|bccwin/ =~ RUBY_PLATFORM assert_equal("", File.extname("foo ")) -- cgit v1.2.3