From b93a624b5f39bb9a7a3d8025da901423cc8cd84a Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 21 Dec 2022 15:11:37 +0900 Subject: [PATCH] mruby-dir/dir.c: add new method `Dir.empty?(path)` --- mrbgems/mruby-dir/src/dir.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mrbgems/mruby-dir/src/dir.c b/mrbgems/mruby-dir/src/dir.c index acfe4d246..499cd0766 100644 --- a/mrbgems/mruby-dir/src/dir.c +++ b/mrbgems/mruby-dir/src/dir.c @@ -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));