Commit a44ada61 authored by ksss's avatar ksss

Implement FileTest.size

- File.size delegate to FileTest.size
- File.size more faster by reading i-node value
parent 379c5a6d
...@@ -151,6 +151,10 @@ class File < IO ...@@ -151,6 +151,10 @@ class File < IO
FileTest.pipe?(file) FileTest.pipe?(file)
end end
def self.size(file)
FileTest.size(file)
end
def self.size?(file) def self.size?(file)
FileTest.size?(file) FileTest.size?(file)
end end
......
...@@ -192,34 +192,6 @@ mrb_file_realpath(mrb_state *mrb, mrb_value klass) ...@@ -192,34 +192,6 @@ mrb_file_realpath(mrb_state *mrb, mrb_value klass)
return result; 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_value
mrb_file__getwd(mrb_state *mrb, mrb_value klass) mrb_file__getwd(mrb_state *mrb, mrb_value klass)
{ {
...@@ -269,7 +241,7 @@ mrb_file__gethome(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); return mrb_str_new_cstr(mrb, home);
#else #else
return mrb_nil_value(); return mrb_nil_value();
#endif #endif
} }
...@@ -326,14 +298,13 @@ mrb_init_file(mrb_state *mrb) ...@@ -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, "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, "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, "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, "_getwd", mrb_file__getwd, MRB_ARGS_NONE());
mrb_define_class_method(mrb, file, "_gethome", mrb_file__gethome, MRB_ARGS_OPT(1)); mrb_define_class_method(mrb, file, "_gethome", mrb_file__gethome, MRB_ARGS_OPT(1));
#ifndef _WIN32 #ifndef _WIN32
mrb_define_method(mrb, file, "flock", mrb_file_flock, MRB_ARGS_REQ(1)); mrb_define_method(mrb, file, "flock", mrb_file_flock, MRB_ARGS_REQ(1));
#endif #endif
cnst = mrb_define_module_under(mrb, file, "Constants"); 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_SH", mrb_fixnum_value(LOCK_SH));
mrb_define_const(mrb, cnst, "LOCK_EX", mrb_fixnum_value(LOCK_EX)); mrb_define_const(mrb, cnst, "LOCK_EX", mrb_fixnum_value(LOCK_EX));
......
...@@ -298,6 +298,29 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass) ...@@ -298,6 +298,29 @@ mrb_filetest_s_zero_p(mrb_state *mrb, mrb_value klass)
return mrb_false_value(); return mrb_false_value();
} }
/*
* 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: * call-seq:
* File.size?(file_name) -> Integer or nil * File.size?(file_name) -> Integer or nil
...@@ -322,7 +345,6 @@ mrb_filetest_s_size_p(mrb_state *mrb, mrb_value klass) ...@@ -322,7 +345,6 @@ mrb_filetest_s_size_p(mrb_state *mrb, mrb_value klass)
return mrb_fixnum_value(st.st_size); return mrb_fixnum_value(st.st_size);
} }
void void
mrb_init_file_test(mrb_state *mrb) mrb_init_file_test(mrb_state *mrb)
{ {
...@@ -335,6 +357,7 @@ 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, "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, "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, "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, "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, "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)); mrb_define_class_method(mrb, f, "symlink?", mrb_filetest_s_symlink_p, MRB_ARGS_REQ(1));
......
...@@ -64,12 +64,6 @@ assert('IO#flock') do ...@@ -64,12 +64,6 @@ assert('IO#flock') do
true true
end 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 assert('File.join') do
File.join() == "" and File.join() == "" and
File.join("a") == "a" and File.join("a") == "a" and
......
...@@ -33,6 +33,11 @@ assert("FileTest.pipe?") do ...@@ -33,6 +33,11 @@ assert("FileTest.pipe?") do
assert_equal false, FileTest.pipe?("/tmp") assert_equal false, FileTest.pipe?("/tmp")
end 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("FileTest.size?") do
assert_equal $mrbtest_io_msg.size, FileTest.size?($mrbtest_io_rfname) assert_equal $mrbtest_io_msg.size, FileTest.size?($mrbtest_io_rfname)
assert_equal nil, FileTest.size?($mrbtest_io_wfname) assert_equal nil, FileTest.size?($mrbtest_io_wfname)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment