From 526608c8a23f24c69a7474b78f24984785f81bad Mon Sep 17 00:00:00 2001 From: MATSUMOTO Ryosuke Date: Sat, 8 Feb 2014 17:38:41 +0900 Subject: Support mrb_module_ge --- src/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/io.c b/src/io.c index 79f72d386..68a50a8d2 100644 --- a/src/io.c +++ b/src/io.c @@ -745,7 +745,7 @@ mrb_init_io(mrb_state *mrb) io = mrb_define_class(mrb, "IO", mrb->object_class); MRB_SET_INSTANCE_TT(io, MRB_TT_DATA); - mrb_include_module(mrb, io, mrb_class_get(mrb, "Enumerable")); /* 15.2.20.3 */ + mrb_include_module(mrb, io, mrb_module_get(mrb, "Enumerable")); /* 15.2.20.3 */ mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(2)); -- cgit v1.2.3 From b74458a486042f4863fa6362057e25f0997694f5 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Mon, 10 Feb 2014 09:49:37 +0900 Subject: remove _bless trick. closes #8. --- mrblib/file.rb | 1 - src/io.c | 16 ---------------- 2 files changed, 17 deletions(-) (limited to 'src') diff --git a/mrblib/file.rb b/mrblib/file.rb index aaa88616f..4087593a5 100644 --- a/mrblib/file.rb +++ b/mrblib/file.rb @@ -9,7 +9,6 @@ class File < IO attr_accessor :path def initialize(fd_or_path, mode = "r", perm = 0666) - self._bless if fd_or_path.kind_of? Fixnum super(fd_or_path, mode) else diff --git a/src/io.c b/src/io.c index 79f72d386..4453f2d6d 100644 --- a/src/io.c +++ b/src/io.c @@ -356,21 +356,6 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int noraise) } } -mrb_value -mrb_io_bless(mrb_state *mrb, mrb_value io) -{ - if (mrb_type(io) != MRB_TT_DATA) { - mrb_raise(mrb, E_TYPE_ERROR, "expected IO object"); - return mrb_nil_value(); - } - - DATA_TYPE(io) = &mrb_io_type; - DATA_PTR(io) = NULL; - DATA_PTR(io) = mrb_io_alloc(mrb); - - return io; -} - mrb_value mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass) { @@ -752,7 +737,6 @@ mrb_init_io(mrb_state *mrb) mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ANY()); - mrb_define_method(mrb, io, "_bless", mrb_io_bless, MRB_ARGS_NONE()); mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/ mrb_define_method(mrb, io, "sysread", mrb_io_sysread, MRB_ARGS_ANY()); mrb_define_method(mrb, io, "sysseek", mrb_io_sysseek, MRB_ARGS_REQ(1)); -- cgit v1.2.3 From 7fd585bae174751e69b3a5e3a65e18eabaf7b1bd Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Fri, 14 Feb 2014 10:36:37 +0900 Subject: support older version. --- src/io.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src') diff --git a/src/io.c b/src/io.c index fc343984a..78a04f8af 100644 --- a/src/io.c +++ b/src/io.c @@ -18,6 +18,14 @@ static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr); static int mrb_io_modenum_to_flags(mrb_state *mrb, int modenum); static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags); +#if MRUBY_RELEASE_NO < 10000 +static struct RClass * +mrb_module_get(mrb_state *mrb, const char *name) +{ + return mrb_class_get(mrb, name); +} +#endif + static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode) { -- cgit v1.2.3 From d28f0421180b34f9f3fc3ae4e9b5c55ecae2e8f1 Mon Sep 17 00:00:00 2001 From: Akira Yumiyama Date: Sat, 22 Feb 2014 20:45:07 +0900 Subject: compatibility support (mruby/mruby, iij/mruby and 1.0.0) - refs https://github.com/mruby/mruby/commit/36e234aa377d50d8ee425c7868e0651cf78e85cf --- src/file.c | 5 +++++ src/file_test.c | 5 +++++ src/io.c | 5 +++++ 3 files changed, 15 insertions(+) (limited to 'src') diff --git a/src/file.c b/src/file.c index ea45b2c0b..eb4534168 100644 --- a/src/file.c +++ b/src/file.c @@ -8,7 +8,12 @@ #include "mruby/class.h" #include "mruby/data.h" #include "mruby/string.h" + +#if MRUBY_RELEASE_NO < 10000 #include "error.h" +#else +#include "mruby/error.h" +#endif #include #include diff --git a/src/file_test.c b/src/file_test.c index 872f7aebc..cb1f6229d 100644 --- a/src/file_test.c +++ b/src/file_test.c @@ -8,7 +8,12 @@ #include "mruby/class.h" #include "mruby/data.h" #include "mruby/string.h" + +#if MRUBY_RELEASE_NO < 10000 #include "error.h" +#else +#include "mruby/error.h" +#endif #include #include diff --git a/src/io.c b/src/io.c index 78a04f8af..e9b6c3d83 100644 --- a/src/io.c +++ b/src/io.c @@ -12,7 +12,12 @@ #include "mruby/string.h" #include "mruby/variable.h" #include "mruby/ext/io.h" + +#if MRUBY_RELEASE_NO < 10000 #include "error.h" +#else +#include "mruby/error.h" +#endif static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr); static int mrb_io_modenum_to_flags(mrb_state *mrb, int modenum); -- cgit v1.2.3 From 56a8c592dd02cc603a57669b37035f4b8054c587 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 25 Feb 2014 12:19:52 +0900 Subject: add IO.read --- README.md | 2 +- mrblib/io.rb | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- src/io.c | 15 +++++++++++++-- test/io.rb | 25 ++++++++++++++++++++++++- 4 files changed, 87 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/README.md b/README.md index 9cfdabbe8..ee7d640eb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ IO, File module for mruby | IO.foreach | | | | IO.pipe | | | | IO.popen | o | | -| IO.read | | | +| IO.read | o | | | IO.readlines | | | | IO.select | | | | IO.sysopen | o | | diff --git a/mrblib/io.rb b/mrblib/io.rb index 63a1bb714..4c69a4b99 100644 --- a/mrblib/io.rb +++ b/mrblib/io.rb @@ -41,6 +41,54 @@ class IO end end + + def self.read(path, length=nil, offset=nil, opt=nil) + if not opt.nil? # 4 arguments + offset ||= 0 + elsif not offset.nil? # 3 arguments + if offset.is_a? Hash + opt = offset + offset = 0 + else + opt = {} + end + elsif not length.nil? # 2 arguments + if length.is_a? Hash + opt = length + offset = 0 + length = nil + else + offset = 0 + opt = {} + end + else # only 1 argument + opt = {} + offset = 0 + length = nil + end + + str = "" + fd = -1 + io = nil + begin + if path[0] == "|" + io = IO.popen(path[1..-1], (opt[:mode] || "r")) + else + fd = IO.sysopen(path) + io = IO.open(fd, opt[:mode] || "r") + end + io.seek(offset) if offset > 0 + str = io.read(length) + ensure + if io + io.close + elsif fd != -1 + IO._sysclose(fd) + end + end + str + end + def flush # mruby-io always writes immediately (no output buffer). self @@ -130,7 +178,7 @@ class IO begin _read_buf rescue EOFError => e - str = nil if str.empty? + str = nil if str.empty? and (not length.nil?) and length != 0 break end diff --git a/src/io.c b/src/io.c index 78a04f8af..8c9de3667 100644 --- a/src/io.c +++ b/src/io.c @@ -3,7 +3,6 @@ */ #include "mruby.h" - #include "mruby/hash.h" #include "mruby/data.h" #include "mruby/khash.h" @@ -372,6 +371,17 @@ mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass) return mrb_io_initialize(mrb, io); } +mrb_value +mrb_io_s_sysclose(mrb_state *mrb, mrb_value klass) +{ + mrb_int fd; + mrb_get_args(mrb, "i", &fd); + if (close(fd) == -1) { + mrb_sys_fail(mrb, "close"); + } + return mrb_fixnum_value(0); +} + mrb_value mrb_io_s_sysopen(mrb_state *mrb, mrb_value klass) { @@ -741,9 +751,10 @@ mrb_init_io(mrb_state *mrb) mrb_include_module(mrb, io, mrb_module_get(mrb, "Enumerable")); /* 15.2.20.3 */ mrb_define_class_method(mrb, io, "_popen", mrb_io_s_popen, MRB_ARGS_ANY()); + mrb_define_class_method(mrb, io, "_sysclose", mrb_io_s_sysclose, MRB_ARGS_REQ(1)); mrb_define_class_method(mrb, io, "for_fd", mrb_io_s_for_fd, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(2)); - mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); mrb_define_class_method(mrb, io, "select", mrb_io_s_select, MRB_ARGS_ANY()); + mrb_define_class_method(mrb, io, "sysopen", mrb_io_s_sysopen, MRB_ARGS_ANY()); mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/ mrb_define_method(mrb, io, "sysread", mrb_io_sysread, MRB_ARGS_ANY()); diff --git a/test/io.rb b/test/io.rb index 49a2a3f97..02507a9d4 100644 --- a/test/io.rb +++ b/test/io.rb @@ -130,7 +130,7 @@ assert('IO#read') do io = IO.new fd assert_equal 'mruby', io.read(5) assert_equal $mrbtest_io_msg[5,100] + "\n", io.read - assert_equal nil, io.read + assert_equal "", io.read io.close io.closed? end @@ -251,6 +251,29 @@ assert('IO.popen') do io.closed? end +assert('IO.read') do + # empty file + fd = IO.sysopen $mrbtest_io_wfname, "w" + io = IO.new fd, "w" + io.close + assert_equal "", IO.read($mrbtest_io_wfname) + assert_equal nil, IO.read($mrbtest_io_wfname, 1) + + # one byte file + fd = IO.sysopen $mrbtest_io_wfname, "w" + io = IO.new fd, "w" + io.write "123" + io.close + assert_equal "123", IO.read($mrbtest_io_wfname) + assert_equal "", IO.read($mrbtest_io_wfname, 0) + assert_equal "1", IO.read($mrbtest_io_wfname, 1) + assert_equal "", IO.read($mrbtest_io_wfname, 0, 10) + assert_equal "23", IO.read($mrbtest_io_wfname, 2, 1) + assert_equal "23", IO.read($mrbtest_io_wfname, 10, 1) + assert_equal "", IO.read($mrbtest_io_wfname, nil, 10) + assert_equal nil, IO.read($mrbtest_io_wfname, 1, 10) +end + assert('IO#fileno') do fd = IO.sysopen $mrbtest_io_rfname io = IO.new fd -- cgit v1.2.3 From e8706d4ee7e9b04fc48f0f6ab66c32f90fb2edf0 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 25 Feb 2014 12:23:15 +0900 Subject: remove unused. --- src/io.c | 39 +-------------------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) (limited to 'src') diff --git a/src/io.c b/src/io.c index 933078870..69b567db7 100644 --- a/src/io.c +++ b/src/io.c @@ -4,10 +4,9 @@ #include "mruby.h" #include "mruby/hash.h" -#include "mruby/data.h" -#include "mruby/khash.h" #include "mruby/array.h" #include "mruby/class.h" +#include "mruby/data.h" #include "mruby/string.h" #include "mruby/variable.h" #include "mruby/ext/io.h" @@ -19,7 +18,6 @@ #endif static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr); -static int mrb_io_modenum_to_flags(mrb_state *mrb, int modenum); static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags); #if MRUBY_RELEASE_NO < 10000 @@ -68,41 +66,6 @@ mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode) return flags; } -static int -mrb_io_modenum_to_flags(mrb_state *mrb, int modenum) -{ - int flags = 0; - - switch (modenum & (O_RDONLY|O_WRONLY|O_RDWR)) { - case O_RDONLY: - flags = FMODE_READABLE; - break; - case O_WRONLY: - flags = FMODE_WRITABLE; - break; - case O_RDWR: - flags = FMODE_READWRITE; - break; - } - - if (modenum & O_APPEND) { - flags |= FMODE_APPEND; - } - if (modenum & O_TRUNC) { - flags |= FMODE_TRUNC; - } - if (modenum & O_CREAT) { - flags |= FMODE_CREATE; - } -#ifdef O_BINARY - if (modenum & O_BINARY) { - flags |= FMODE_BINMODE; - } -#endif - - return flags; -} - static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags) { -- cgit v1.2.3 From f7c054bd39f0809641ab474771f0f85a5282c72e Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Tue, 25 Feb 2014 12:28:34 +0900 Subject: quiet compiler. --- src/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/io.c b/src/io.c index 69b567db7..7047fdf88 100644 --- a/src/io.c +++ b/src/io.c @@ -506,7 +506,7 @@ mrb_io_pid(mrb_state *mrb, mrb_value io) static struct timeval time2timeval(mrb_state *mrb, mrb_value time) { - struct timeval t; + struct timeval t = { 0, 0 }; switch (mrb_type(time)) { case MRB_TT_FIXNUM: -- cgit v1.2.3