mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Implement FileTest.size
- File.size delegate to FileTest.size - File.size more faster by reading i-node value
This commit is contained in:
@@ -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
|
||||
|
||||
+2
-31
@@ -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));
|
||||
|
||||
+24
-1
@@ -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 <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
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user