mruby-dir/dir.c: add new method Dir.empty?(path)

This commit is contained in:
Yukihiro "Matz" Matsumoto
2022-12-21 15:11:37 +09:00
parent e4b80cc282
commit b93a624b5f
+35
View File
@@ -202,6 +202,40 @@ mrb_dir_chroot(mrb_state *mrb, mrb_value self)
#endif
}
static mrb_bool
skip_name_p(const char *name)
{
if (name[0] != '.') return FALSE;
if (name[1] == '\0') return TRUE;
if (name[1] != '.') return FALSE;
if (name[2] == '\0') return TRUE;
return FALSE;
}
mrb_value
mrb_dir_empty(mrb_state *mrb, mrb_value self)
{
mrb_value path;
DIR *dir;
struct dirent *dp;
char *cpath;
mrb_value result = mrb_true_value();
mrb_get_args(mrb, "S", &path);
cpath = mrb_str_to_cstr(mrb, path);
if ((dir = opendir(cpath)) == NULL) {
mrb_sys_fail(mrb, cpath);
}
while ((dp = readdir(dir))) {
if (!skip_name_p(dp->d_name)) {
result = mrb_false_value();
break;
}
}
closedir(dir);
return result;
}
mrb_value
mrb_dir_read(mrb_state *mrb, mrb_value self)
{
@@ -289,6 +323,7 @@ mrb_mruby_dir_gem_init(mrb_state *mrb)
mrb_define_class_method(mrb, d, "mkdir", mrb_dir_mkdir, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
mrb_define_class_method(mrb, d, "_chdir", mrb_dir_chdir, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, d, "chroot", mrb_dir_chroot, MRB_ARGS_REQ(1));
mrb_define_class_method(mrb, d, "empty?", mrb_dir_empty, MRB_ARGS_REQ(1));
mrb_define_method(mrb, d, "close", mrb_dir_close, MRB_ARGS_NONE());
mrb_define_method(mrb, d, "initialize", mrb_dir_init, MRB_ARGS_REQ(1));