From a44ada616ee32b993f40e50b7e5d45f54ce846d2 Mon Sep 17 00:00:00 2001 From: ksss Date: Sun, 16 Nov 2014 14:55:45 +0900 Subject: Implement FileTest.size - File.size delegate to FileTest.size - File.size more faster by reading i-node value --- src/file_test.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/file_test.c') 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 @@ -298,6 +298,29 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass) return mrb_false_value(); } +/* + * call-seq: + * File.size(file_name) -> integer + * + * Returns the size of file_name. + * + * _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 @@ -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)); -- cgit v1.2.3