Moved Dir.open
and Dir#initialize
to dir.rb
This commit is contained in:
parent
a58bbd6a51
commit
310054b240
Notes:
git
2020-04-06 22:22:51 +09:00
@ -12,6 +12,7 @@ prelude.rb
|
|||||||
rbconfig.rb
|
rbconfig.rb
|
||||||
array.rb
|
array.rb
|
||||||
ast.rb
|
ast.rb
|
||||||
|
dir.rb
|
||||||
gc.rb
|
gc.rb
|
||||||
io.rb
|
io.rb
|
||||||
kernel.rb
|
kernel.rb
|
||||||
|
@ -1000,6 +1000,7 @@ BUILTIN_RB_SRCS = \
|
|||||||
$(srcdir)/ast.rb \
|
$(srcdir)/ast.rb \
|
||||||
$(srcdir)/gc.rb \
|
$(srcdir)/gc.rb \
|
||||||
$(srcdir)/io.rb \
|
$(srcdir)/io.rb \
|
||||||
|
$(srcdir)/dir.rb \
|
||||||
$(srcdir)/pack.rb \
|
$(srcdir)/pack.rb \
|
||||||
$(srcdir)/trace_point.rb \
|
$(srcdir)/trace_point.rb \
|
||||||
$(srcdir)/warning.rb \
|
$(srcdir)/warning.rb \
|
||||||
@ -2024,9 +2025,11 @@ dir.$(OBJEXT): $(top_srcdir)/internal/string.h
|
|||||||
dir.$(OBJEXT): $(top_srcdir)/internal/vm.h
|
dir.$(OBJEXT): $(top_srcdir)/internal/vm.h
|
||||||
dir.$(OBJEXT): $(top_srcdir)/internal/warnings.h
|
dir.$(OBJEXT): $(top_srcdir)/internal/warnings.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}assert.h
|
dir.$(OBJEXT): {$(VPATH)}assert.h
|
||||||
|
dir.$(OBJEXT): {$(VPATH)}builtin.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}config.h
|
dir.$(OBJEXT): {$(VPATH)}config.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}defines.h
|
dir.$(OBJEXT): {$(VPATH)}defines.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}dir.c
|
dir.$(OBJEXT): {$(VPATH)}dir.c
|
||||||
|
dir.$(OBJEXT): {$(VPATH)}dir.rbinc
|
||||||
dir.$(OBJEXT): {$(VPATH)}encindex.h
|
dir.$(OBJEXT): {$(VPATH)}encindex.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}encoding.h
|
dir.$(OBJEXT): {$(VPATH)}encoding.h
|
||||||
dir.$(OBJEXT): {$(VPATH)}id.h
|
dir.$(OBJEXT): {$(VPATH)}id.h
|
||||||
@ -2840,6 +2843,7 @@ miniinit.$(OBJEXT): {$(VPATH)}ast.rb
|
|||||||
miniinit.$(OBJEXT): {$(VPATH)}builtin.h
|
miniinit.$(OBJEXT): {$(VPATH)}builtin.h
|
||||||
miniinit.$(OBJEXT): {$(VPATH)}config.h
|
miniinit.$(OBJEXT): {$(VPATH)}config.h
|
||||||
miniinit.$(OBJEXT): {$(VPATH)}defines.h
|
miniinit.$(OBJEXT): {$(VPATH)}defines.h
|
||||||
|
miniinit.$(OBJEXT): {$(VPATH)}dir.rb
|
||||||
miniinit.$(OBJEXT): {$(VPATH)}encoding.h
|
miniinit.$(OBJEXT): {$(VPATH)}encoding.h
|
||||||
miniinit.$(OBJEXT): {$(VPATH)}gc.rb
|
miniinit.$(OBJEXT): {$(VPATH)}gc.rb
|
||||||
miniinit.$(OBJEXT): {$(VPATH)}gem_prelude.rb
|
miniinit.$(OBJEXT): {$(VPATH)}gem_prelude.rb
|
||||||
|
66
dir.c
66
dir.c
@ -116,6 +116,7 @@ char *strchr(char*,char);
|
|||||||
#include "ruby/ruby.h"
|
#include "ruby/ruby.h"
|
||||||
#include "ruby/thread.h"
|
#include "ruby/thread.h"
|
||||||
#include "ruby/util.h"
|
#include "ruby/util.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
#ifndef AT_FDCWD
|
#ifndef AT_FDCWD
|
||||||
# define AT_FDCWD -1
|
# define AT_FDCWD -1
|
||||||
@ -520,40 +521,13 @@ opendir_without_gvl(const char *path)
|
|||||||
return opendir(path);
|
return opendir(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* Dir.new( string ) -> aDir
|
|
||||||
* Dir.new( string, encoding: enc ) -> aDir
|
|
||||||
*
|
|
||||||
* Returns a new directory object for the named directory.
|
|
||||||
*
|
|
||||||
* The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
|
|
||||||
* If not specified, the filesystem encoding is used.
|
|
||||||
*/
|
|
||||||
static VALUE
|
static VALUE
|
||||||
dir_initialize(int argc, VALUE *argv, VALUE dir)
|
dir_initialize(rb_execution_context_t *ec, VALUE dir, VALUE dirname, VALUE enc)
|
||||||
{
|
{
|
||||||
struct dir_data *dp;
|
struct dir_data *dp;
|
||||||
rb_encoding *fsenc;
|
VALUE orig;
|
||||||
VALUE dirname, opt, orig;
|
|
||||||
static ID keyword_ids[1];
|
|
||||||
const char *path;
|
const char *path;
|
||||||
|
rb_encoding *fsenc = NIL_P(enc) ? rb_filesystem_encoding() : rb_to_encoding(enc);
|
||||||
if (!keyword_ids[0]) {
|
|
||||||
keyword_ids[0] = rb_id_encoding();
|
|
||||||
}
|
|
||||||
|
|
||||||
fsenc = rb_filesystem_encoding();
|
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "1:", &dirname, &opt);
|
|
||||||
|
|
||||||
if (!NIL_P(opt)) {
|
|
||||||
VALUE enc;
|
|
||||||
rb_get_kwargs(opt, keyword_ids, 0, 1, &enc);
|
|
||||||
if (enc != Qundef && !NIL_P(enc)) {
|
|
||||||
fsenc = rb_to_encoding(enc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FilePathValue(dirname);
|
FilePathValue(dirname);
|
||||||
orig = rb_str_dup_frozen(dirname);
|
orig = rb_str_dup_frozen(dirname);
|
||||||
@ -591,35 +565,23 @@ dir_initialize(int argc, VALUE *argv, VALUE dir)
|
|||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* Dir.open( string ) -> aDir
|
|
||||||
* Dir.open( string, encoding: enc ) -> aDir
|
|
||||||
* Dir.open( string ) {| aDir | block } -> anObject
|
|
||||||
* Dir.open( string, encoding: enc ) {| aDir | block } -> anObject
|
|
||||||
*
|
|
||||||
* The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
|
|
||||||
* If not specified, the filesystem encoding is used.
|
|
||||||
*
|
|
||||||
* With no block, <code>open</code> is a synonym for Dir::new. If a
|
|
||||||
* block is present, it is passed <i>aDir</i> as a parameter. The
|
|
||||||
* directory is closed at the end of the block, and Dir::open returns
|
|
||||||
* the value of the block.
|
|
||||||
*/
|
|
||||||
static VALUE
|
static VALUE
|
||||||
dir_s_open(int argc, VALUE *argv, VALUE klass)
|
dir_s_open(rb_execution_context_t *ec, VALUE klass, VALUE dirname, VALUE enc)
|
||||||
{
|
{
|
||||||
struct dir_data *dp;
|
struct dir_data *dp;
|
||||||
VALUE dir = TypedData_Make_Struct(klass, struct dir_data, &dir_data_type, dp);
|
VALUE dir = TypedData_Make_Struct(klass, struct dir_data, &dir_data_type, dp);
|
||||||
|
|
||||||
dir_initialize(argc, argv, dir);
|
dir_initialize(ec, dir, dirname, enc);
|
||||||
if (rb_block_given_p()) {
|
|
||||||
return rb_ensure(rb_yield, dir, dir_close, dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
dir_s_close(rb_execution_context_t *ec, VALUE klass, VALUE dir)
|
||||||
|
{
|
||||||
|
return dir_close(dir);
|
||||||
|
}
|
||||||
|
|
||||||
NORETURN(static void dir_closed(void));
|
NORETURN(static void dir_closed(void));
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -3599,13 +3561,11 @@ Init_Dir(void)
|
|||||||
rb_include_module(rb_cDir, rb_mEnumerable);
|
rb_include_module(rb_cDir, rb_mEnumerable);
|
||||||
|
|
||||||
rb_define_alloc_func(rb_cDir, dir_s_alloc);
|
rb_define_alloc_func(rb_cDir, dir_s_alloc);
|
||||||
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, "foreach", dir_foreach, -1);
|
||||||
rb_define_singleton_method(rb_cDir, "entries", dir_entries, -1);
|
rb_define_singleton_method(rb_cDir, "entries", dir_entries, -1);
|
||||||
rb_define_singleton_method(rb_cDir, "each_child", dir_s_each_child, -1);
|
rb_define_singleton_method(rb_cDir, "each_child", dir_s_each_child, -1);
|
||||||
rb_define_singleton_method(rb_cDir, "children", dir_s_children, -1);
|
rb_define_singleton_method(rb_cDir, "children", dir_s_children, -1);
|
||||||
|
|
||||||
rb_define_method(rb_cDir,"initialize", dir_initialize, -1);
|
|
||||||
rb_define_method(rb_cDir,"fileno", dir_fileno, 0);
|
rb_define_method(rb_cDir,"fileno", dir_fileno, 0);
|
||||||
rb_define_method(rb_cDir,"path", dir_path, 0);
|
rb_define_method(rb_cDir,"path", dir_path, 0);
|
||||||
rb_define_method(rb_cDir,"to_path", dir_path, 0);
|
rb_define_method(rb_cDir,"to_path", dir_path, 0);
|
||||||
@ -3687,3 +3647,5 @@ Init_Dir(void)
|
|||||||
*/
|
*/
|
||||||
rb_file_const("FNM_SHORTNAME", INT2FIX(FNM_SHORTNAME));
|
rb_file_const("FNM_SHORTNAME", INT2FIX(FNM_SHORTNAME));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include "dir.rbinc"
|
||||||
|
37
dir.rb
Normal file
37
dir.rb
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
class Dir
|
||||||
|
# Dir.open( string ) -> aDir
|
||||||
|
# Dir.open( string, encoding: enc ) -> aDir
|
||||||
|
# Dir.open( string ) {| aDir | block } -> anObject
|
||||||
|
# Dir.open( string, encoding: enc ) {| aDir | block } -> anObject
|
||||||
|
#
|
||||||
|
# The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
|
||||||
|
# If not specified, the filesystem encoding is used.
|
||||||
|
#
|
||||||
|
# With no block, <code>open</code> is a synonym for Dir::new. If a
|
||||||
|
# block is present, it is passed <i>aDir</i> as a parameter. The
|
||||||
|
# directory is closed at the end of the block, and Dir::open returns
|
||||||
|
# the value of the block.
|
||||||
|
def self.open(name, encoding: nil, &block)
|
||||||
|
dir = __builtin_dir_s_open(name, encoding)
|
||||||
|
if block
|
||||||
|
begin
|
||||||
|
yield dir
|
||||||
|
ensure
|
||||||
|
__builtin_dir_s_close(dir)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Dir.new( string ) -> aDir
|
||||||
|
# Dir.new( string, encoding: enc ) -> aDir
|
||||||
|
#
|
||||||
|
# Returns a new directory object for the named directory.
|
||||||
|
#
|
||||||
|
# The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
|
||||||
|
# If not specified, the filesystem encoding is used.
|
||||||
|
def initialize(name, encoding: nil)
|
||||||
|
__builtin_dir_initialize(name, encoding)
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user