diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-02-29 08:05:32 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-02-29 08:05:32 +0000 |
commit | 4890f3a684aff94d93a5cc3f68fa8c67c1da6c19 (patch) | |
tree | 3e43148d3114380fff1418aa3ff6d01b157a97e4 /dir.c | |
parent | 0c123a83f0446204d974318b578236c949e5a01f (diff) | |
download | ruby-4890f3a684aff94d93a5cc3f68fa8c67c1da6c19.tar.gz |
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.c | 43 |
1 files changed, 31 insertions, 12 deletions
@@ -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); |