summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-10-03 12:18:39 +0900
committerTomoyuki Sahara <[email protected]>2013-10-03 12:18:39 +0900
commit005f01f2fc1b03a142ae04d4c94255fca15ddd33 (patch)
tree6286d238ed8b1280ff8e1983b8df94f4fdc0e412
parentbf4c226232918a97fe607272eb4e3076b4866f32 (diff)
downloadmruby-005f01f2fc1b03a142ae04d4c94255fca15ddd33.tar.gz
mruby-005f01f2fc1b03a142ae04d4c94255fca15ddd33.zip
fix RSTRING_PTR usage.
-rw-r--r--src/file.c59
-rw-r--r--test/file.rb17
2 files changed, 36 insertions, 40 deletions
diff --git a/src/file.c b/src/file.c
index 5c46aa965..ea45b2c0b 100644
--- a/src/file.c
+++ b/src/file.c
@@ -132,35 +132,29 @@ mrb_file_s_rename(mrb_state *mrb, mrb_value obj)
static mrb_value
mrb_file_dirname(mrb_state *mrb, mrb_value klass)
{
- char *cp, *dname;
- mrb_int n;
- mrb_value fname;
+ char *dname, *path;
+ mrb_value s;
- mrb_get_args(mrb, "s", &cp, &n);
- fname = mrb_str_new(mrb, cp, n);
-
- if ((dname = dirname(RSTRING_PTR(fname))) == NULL) {
- mrb_sys_fail(mrb, "mrb_file_dirname failed.");
+ mrb_get_args(mrb, "S", &s);
+ path = mrb_str_to_cstr(mrb, s);
+ if ((dname = dirname(path)) == NULL) {
+ mrb_sys_fail(mrb, "dirname");
}
-
- return mrb_str_new(mrb, dname, strlen(dname));
+ return mrb_str_new_cstr(mrb, dname);
}
static mrb_value
mrb_file_basename(mrb_state *mrb, mrb_value klass)
{
- char *cp, *bname;
- mrb_int n;
- mrb_value fname;
+ char *bname, *path;
+ mrb_value s;
- mrb_get_args(mrb, "s", &cp, &n);
- fname = mrb_str_new(mrb, cp, n);
-
- if ((bname = basename(RSTRING_PTR(fname))) == NULL) {
- mrb_sys_fail(mrb, "mrb_file_basename failed.");
+ mrb_get_args(mrb, "S", &s);
+ path = mrb_str_to_cstr(mrb, s);
+ if ((bname = basename(path)) == NULL) {
+ mrb_sys_fail(mrb, "basename");
}
-
- return mrb_str_new(mrb, bname, strlen(bname));
+ return mrb_str_new_cstr(mrb, bname);
}
static mrb_value
@@ -190,27 +184,26 @@ mrb_file_size(mrb_state *mrb, mrb_value klass)
{
char *cp;
FILE *fp;
- mrb_int n;
mrb_int filesize;
- mrb_value filename;
+ mrb_value s;
+ int saved_errno;
- mrb_get_args(mrb, "s", &cp, &n);
- filename = mrb_str_new(mrb, cp, n);
-
- fp = fopen(RSTRING_PTR(filename), "rb");
+ mrb_get_args(mrb, "S", &s);
+ cp = mrb_str_to_cstr(mrb, s);
+ fp = fopen(cp, "rb");
if (fp == NULL) {
- mrb_sys_fail(mrb, "mrb_file_size failed.");
+ mrb_sys_fail(mrb, "fopen");
return mrb_nil_value();
}
-
if (fseek(fp, 0, SEEK_END) != 0) {
- mrb_sys_fail(mrb, "mrb_file_size failed.");
+ saved_errno = errno;
+ fclose(fp);
+ errno = saved_errno;
+ mrb_sys_fail(mrb, "fseek");
return mrb_nil_value();
}
filesize = (mrb_int) ftell(fp);
-
fclose(fp);
-
return mrb_fixnum_value(filesize);
}
@@ -230,9 +223,7 @@ mrb_file__getwd(mrb_state *mrb, mrb_value klass)
static int
mrb_file_is_absolute_path(const char *path)
{
- if (path[0] == '/')
- return 1;
- return 0;
+ return (path[0] == '/');
}
static mrb_value
diff --git a/test/file.rb b/test/file.rb
index 4b3458d1a..8865a30a9 100644
--- a/test/file.rb
+++ b/test/file.rb
@@ -30,14 +30,19 @@ assert('File#path', '15.2.21.4.2') do
io.closed?
end
-assert('File.dirname') do
- path = File.dirname("filename")
- "." == path
+assert('File.basename') do
+ assert_equal '/', File.basename('//')
+ assert_equal 'a', File.basename('/a/')
+ assert_equal 'b', File.basename('/a/b')
+ assert_equal 'b', File.basename('../a/b')
end
-assert('File.basename') do
- name = File.basename("../somewhere/filename")
- name == "filename"
+assert('File.dirname') do
+ assert_equal '.', File.dirname('')
+ assert_equal '.', File.dirname('a')
+ assert_equal '/', File.dirname('/a')
+ assert_equal 'a', File.dirname('a/b')
+ assert_equal '/a', File.dirname('/a/b')
end
assert('File.extname') do