Project

General

Profile

Feature #6587 ยป 0001-File.rootname.patch

nobu (Nobuyoshi Nakada), 06/14/2012 06:04 PM

View differences:

file.c
}
/*
* call-seq:
* File.rootname(file_name ) -> root_name
*
* Returns root part of the filename given in <i>file_name</i>.
* Returns an empty string if <i>file_name</i> is not an absolute
* path.
*
* * On Unix
* File.rootname("/home/gumby/work/ruby.rb") #=> "/"
* File.rootname("home/gumby/work/ruby.rb") #=> ""
*
* * On Windows
* File.rootname("c:/Users/gumby/work/ruby.rb") #=> "c:/"
* File.rootname("//host/share/gumby/work/ruby.rb") #=> "//host/share/"
* File.rootname("home/gumby/work/ruby.rb") #=> ""
*/
static VALUE
rb_file_s_rootname(VALUE klass, VALUE fname)
{
const char *name, *root, *end;
VALUE rootname;
rb_encoding *enc;
FilePathStringValue(fname);
name = StringValueCStr(fname);
end = name + RSTRING_LEN(fname);
enc = rb_enc_get(fname);
root = skipprefix(name, end, enc);
if (root < end && isdirsep(*root)) root++;
#if defined(DOSISH_UNC) || defined(DOSISH_DRIVE_LETTER)
if (root == name + 1 || (root == name + 2 && name[1] == ':')) {
root = name;
}
#endif
rootname = rb_enc_str_new(name, root - name, enc);
OBJ_INFECT(rootname, fname);
return rootname;
}
/*
* accept a String, and return the pointer of the extension.
* if len is passed, set the length of extension to it.
* returned pointer is in ``name'' or NULL.
......
rb_define_singleton_method(rb_cFile, "basename", rb_file_s_basename, -1);
rb_define_singleton_method(rb_cFile, "dirname", rb_file_s_dirname, 1);
rb_define_singleton_method(rb_cFile, "extname", rb_file_s_extname, 1);
rb_define_singleton_method(rb_cFile, "rootname", rb_file_s_rootname, 1);
rb_define_singleton_method(rb_cFile, "path", rb_file_s_path, 1);
separator = rb_obj_freeze(rb_usascii_str_new2("/"));
test/ruby/test_file_exhaustive.rb
assert_incompatible_encoding {|d| File.extname(d)}
end
def test_rootname
assert_equal("", File.rootname("foo/bar"))
if /cygwin|mswin|bccwin|mingw|emx/ =~ RUBY_PLATFORM
assert_equal("c:/", File.rootname("c:/Users/gumby/work/ruby.rb"))
assert_equal("//host/share/", File.rootname("//host/share/gumby/work/ruby.rb"))
assert_equal("", File.rootname("/Users/gumby/work/ruby.rb"))
assert_equal("", File.rootname("c:gumby/work/ruby.rb"))
else
assert_equal("/", File.rootname("/home/gumby/work/ruby.rb"))
end
assert_equal("", File.rootname("home/gumby/work/ruby.rb"))
end
def test_split
d, b = File.split(@file)
assert_equal(File.dirname(@file), d)
    (1-1/1)