summaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-16 13:42:17 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-09-16 13:42:17 +0000
commit2ea72482bb0519147b32121f5ebcb625df8e7fe9 (patch)
tree3929dba158b14998ecae8d7fcbefff903d4751c1 /file.c
parente3381e0e3ab324be2046974c4ff5a8a450f19c3b (diff)
downloadruby-2ea72482bb0519147b32121f5ebcb625df8e7fe9.tar.gz
ruby-2ea72482bb0519147b32121f5ebcb625df8e7fe9.tar.xz
ruby-2ea72482bb0519147b32121f5ebcb625df8e7fe9.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@9181 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r--file.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/file.c b/file.c
index 4cd680b60..60c02bf7f 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;
}