summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-29 08:05:32 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-02-29 08:05:32 +0000
commit4890f3a684aff94d93a5cc3f68fa8c67c1da6c19 (patch)
tree3e43148d3114380fff1418aa3ff6d01b157a97e4 /dir.c
parent0c123a83f0446204d974318b578236c949e5a01f (diff)
2000-02-29
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@629 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/dir.c b/dir.c
index 291c243a45..a5409a304d 100644
--- a/dir.c
+++ b/dir.c
@@ -233,14 +233,31 @@ free_dir(dir)
static VALUE dir_close _((VALUE));
static VALUE
-dir_s_open(dir_class, dirname)
- VALUE dir_class, dirname;
+dir_s_new(argc, argv, klass)
+ int argc;
+ VALUE *argv;
+ VALUE klass;
+{
+ VALUE obj = Data_Wrap_Struct(klass, 0, free_dir, 0);
+
+ rb_obj_call_init(obj, argc, argv);
+
+ if (rb_iterator_p()) {
+ rb_ensure(rb_yield, obj, dir_close, obj);
+ }
+
+ return obj;
+}
+
+static VALUE
+dir_initialize(dir, dirname)
+ VALUE dir, dirname;
{
- VALUE obj;
DIR *dirp;
Check_SafeStr(dirname);
-
+ if (DATA_PTR(dir)) closedir(DATA_PTR(dir));
+ DATA_PTR(dir) = NULL;
dirp = opendir(RSTRING(dirname)->ptr);
if (dirp == NULL) {
if (errno == EMFILE || errno == ENFILE) {
@@ -251,14 +268,15 @@ dir_s_open(dir_class, dirname)
rb_sys_fail(RSTRING(dirname)->ptr);
}
}
+ DATA_PTR(dir) = dirp;
+ return dir;
+}
- obj = Data_Wrap_Struct(dir_class, 0, free_dir, dirp);
-
- if (rb_iterator_p()) {
- return rb_ensure(rb_yield, obj, dir_close, obj);
- }
-
- return obj;
+static VALUE
+dir_s_open(klass, dirname)
+ VALUE klass, dirname;
+{
+ return dir_s_new(1, &dirname, klass);
}
static void
@@ -781,11 +799,12 @@ Init_Dir()
rb_include_module(rb_cDir, rb_mEnumerable);
- rb_define_singleton_method(rb_cDir, "new", dir_s_open, 1);
+ rb_define_singleton_method(rb_cDir, "new", dir_s_new, -1);
rb_define_singleton_method(rb_cDir, "open", dir_s_open, 1);
rb_define_singleton_method(rb_cDir, "foreach", dir_foreach, 1);
rb_define_singleton_method(rb_cDir, "entries", dir_entries, 1);
+ rb_define_method(rb_cDir,"initialize", dir_initialize, 1);
rb_define_method(rb_cDir,"read", dir_read, 0);
rb_define_method(rb_cDir,"each", dir_each, 0);
rb_define_method(rb_cDir,"rewind", dir_rewind, 0);