Implement FileTest.size

- File.size delegate to FileTest.size
- File.size more faster by reading i-node value
This commit is contained in:
ksss
2014-11-16 14:55:45 +09:00
parent 379c5a6d88
commit a44ada616e
5 changed files with 35 additions and 38 deletions
+2 -31
View File
@@ -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
View File
@@ -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));