summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrblib/file.rb4
-rw-r--r--src/file.c33
-rw-r--r--src/file_test.c25
-rw-r--r--test/file.rb6
-rw-r--r--test/file_test.rb5
5 files changed, 35 insertions, 38 deletions
diff --git a/mrblib/file.rb b/mrblib/file.rb
index 5a2716a66..18383f303 100644
--- a/mrblib/file.rb
+++ b/mrblib/file.rb
@@ -151,6 +151,10 @@ class File < IO
FileTest.pipe?(file)
end
+ def self.size(file)
+ FileTest.size(file)
+ end
+
def self.size?(file)
FileTest.size?(file)
end
diff --git a/src/file.c b/src/file.c
index 2402a3060..f8a0fb2c0 100644
--- a/src/file.c
+++ b/src/file.c
@@ -192,34 +192,6 @@ mrb_file_realpath(mrb_state *mrb, mrb_value klass)
return result;
}
-static mrb_value
-mrb_file_size(mrb_state *mrb, mrb_value klass)
-{
- char *cp;
- FILE *fp;
- mrb_int filesize;
- mrb_value s;
- int saved_errno;
-
- mrb_get_args(mrb, "S", &s);
- cp = mrb_str_to_cstr(mrb, s);
- fp = fopen(cp, "rb");
- if (fp == NULL) {
- mrb_sys_fail(mrb, "fopen");
- return mrb_nil_value();
- }
- if (fseek(fp, 0, SEEK_END) != 0) {
- 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);
-}
-
mrb_value
mrb_file__getwd(mrb_state *mrb, mrb_value klass)
{
@@ -269,7 +241,7 @@ mrb_file__gethome(mrb_state *mrb, mrb_value klass)
}
return mrb_str_new_cstr(mrb, home);
#else
-
+
return mrb_nil_value();
#endif
}
@@ -326,14 +298,13 @@ mrb_init_file(mrb_state *mrb)
mrb_define_class_method(mrb, file, "dirname", mrb_file_dirname, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, file, "basename", mrb_file_basename, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, file, "realpath", mrb_file_realpath, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
- mrb_define_class_method(mrb, file, "size", mrb_file_size, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, file, "_getwd", mrb_file__getwd, MRB_ARGS_NONE());
mrb_define_class_method(mrb, file, "_gethome", mrb_file__gethome, MRB_ARGS_OPT(1));
#ifndef _WIN32
mrb_define_method(mrb, file, "flock", mrb_file_flock, MRB_ARGS_REQ(1));
#endif
-
+
cnst = mrb_define_module_under(mrb, file, "Constants");
mrb_define_const(mrb, cnst, "LOCK_SH", mrb_fixnum_value(LOCK_SH));
mrb_define_const(mrb, cnst, "LOCK_EX", mrb_fixnum_value(LOCK_EX));
diff --git a/src/file_test.c b/src/file_test.c
index d3dfb15ba..6c380c4a5 100644
--- a/src/file_test.c
+++ b/src/file_test.c
@@ -300,6 +300,29 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
/*
* call-seq:
+ * File.size(file_name) -> integer
+ *
+ * Returns the size of <code>file_name</code>.
+ *
+ * _file_name_ can be an IO object.
+ */
+
+mrb_value
+mrb_filetest_s_size(mrb_state *mrb, mrb_value klass)
+{
+ struct stat st;
+ mrb_value obj;
+
+ mrb_get_args(mrb, "o", &obj);
+
+ if (mrb_stat(mrb, obj, &st) < 0)
+ mrb_sys_fail(mrb, "mrb_stat");
+
+ return mrb_fixnum_value(st.st_size);
+}
+
+/*
+ * call-seq:
* File.size?(file_name) -> Integer or nil
*
* Returns +nil+ if +file_name+ doesn't exist or has zero size, the size of the
@@ -322,7 +345,6 @@ mrb_filetest_s_size_p(mrb_state *mrb, mrb_value klass)
return mrb_fixnum_value(st.st_size);
}
-
void
mrb_init_file_test(mrb_state *mrb)
{
@@ -335,6 +357,7 @@ mrb_init_file_test(mrb_state *mrb)
mrb_define_class_method(mrb, f, "exists?", mrb_filetest_s_exist_p, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, f, "file?", mrb_filetest_s_file_p, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, f, "pipe?", mrb_filetest_s_pipe_p, MRB_ARGS_REQ(1));
+ mrb_define_class_method(mrb, f, "size", mrb_filetest_s_size, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, f, "size?", mrb_filetest_s_size_p, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, f, "socket?", mrb_filetest_s_socket_p, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, f, "symlink?", mrb_filetest_s_symlink_p, MRB_ARGS_REQ(1));
diff --git a/test/file.rb b/test/file.rb
index c8df85e89..d6f39ceb1 100644
--- a/test/file.rb
+++ b/test/file.rb
@@ -64,12 +64,6 @@ assert('IO#flock') do
true
end
-
-assert('File.size') do
- File.size($mrbtest_io_rfname) == $mrbtest_io_msg.size and
- File.size($mrbtest_io_wfname) == 0
-end
-
assert('File.join') do
File.join() == "" and
File.join("a") == "a" and
diff --git a/test/file_test.rb b/test/file_test.rb
index 1fe6a8fd8..11742f2db 100644
--- a/test/file_test.rb
+++ b/test/file_test.rb
@@ -33,6 +33,11 @@ assert("FileTest.pipe?") do
assert_equal false, FileTest.pipe?("/tmp")
end
+assert('FileTest.size') do
+ assert_equal FileTest.size($mrbtest_io_rfname), $mrbtest_io_msg.size
+ assert_equal FileTest.size($mrbtest_io_wfname), 0
+end
+
assert("FileTest.size?") do
assert_equal $mrbtest_io_msg.size, FileTest.size?($mrbtest_io_rfname)
assert_equal nil, FileTest.size?($mrbtest_io_wfname)