diff options
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | include/mruby/ext/io.h | 4 | ||||
| -rw-r--r-- | src/io.c | 33 | ||||
| -rw-r--r-- | test/io.rb | 24 |
4 files changed, 59 insertions, 6 deletions
@@ -79,8 +79,8 @@ IO, File module for mruby | IO#seek | o | | | IO#set_encoding | | | | IO#stat | | | -| IO#sync | | | -| IO#sync= | | | +| IO#sync | o | | +| IO#sync= | o | | | IO#sysread | o | | | IO#sysseek | o | | | IO#syswrite | o | | diff --git a/include/mruby/ext/io.h b/include/mruby/ext/io.h index 7d61ba267..3107f1053 100644 --- a/include/mruby/ext/io.h +++ b/include/mruby/ext/io.h @@ -13,14 +13,14 @@ struct mrb_io { int fd; /* file descriptor, or -1 */ int fd2; /* file descriptor to write if it's different from fd, or -1 */ int pid; /* child's pid (for pipes) */ - unsigned int writable:1; + unsigned int writable:1, + sync:1; }; #define FMODE_READABLE 0x00000001 #define FMODE_WRITABLE 0x00000002 #define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE) #define FMODE_BINMODE 0x00000004 -#define FMODE_SYNC 0x00000008 #define FMODE_APPEND 0x00000040 #define FMODE_CREATE 0x00000080 #define FMODE_TRUNC 0x00000800 @@ -167,6 +167,7 @@ mrb_io_alloc(mrb_state *mrb) fptr->fd2 = -1; fptr->pid = 0; fptr->writable = 0; + fptr->sync = 0; return fptr; } @@ -264,6 +265,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) fptr->fd2 = write_fd; fptr->pid = pid; fptr->writable = ((flags & FMODE_WRITABLE) != 0); + fptr->sync = 0; DATA_TYPE(io) = &mrb_io_type; DATA_PTR(io) = fptr; @@ -323,6 +325,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io) fptr->fd = fd; fptr->writable = ((flags & FMODE_WRITABLE) != 0); + fptr->sync = 0; return io; } @@ -793,6 +796,34 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value io) #endif } +mrb_value +mrb_io_set_sync(mrb_state *mrb, mrb_value self) +{ + struct mrb_io *fptr; + mrb_bool b; + + fptr = (struct mrb_io *)mrb_get_datatype(mrb, self, &mrb_io_type); + if (fptr->fd < 0) { + mrb_raise(mrb, E_IO_ERROR, "closed stream."); + } + + mrb_get_args(mrb, "b", &b); + fptr->sync = b; + return mrb_bool_value(b); +} + +mrb_value +mrb_io_sync(mrb_state *mrb, mrb_value self) +{ + struct mrb_io *fptr; + + fptr = (struct mrb_io *)mrb_get_datatype(mrb, self, &mrb_io_type); + if (fptr->fd < 0) { + mrb_raise(mrb, E_IO_ERROR, "closed stream."); + } + return mrb_bool_value(fptr->sync); +} + void mrb_init_io(mrb_state *mrb) { @@ -810,6 +841,8 @@ mrb_init_io(mrb_state *mrb) 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, "sync", mrb_io_sync, MRB_ARGS_NONE()); + mrb_define_method(mrb, io, "sync=", mrb_io_set_sync, MRB_ARGS_REQ(1)); 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)); mrb_define_method(mrb, io, "syswrite", mrb_io_syswrite, MRB_ARGS_REQ(1)); diff --git a/test/io.rb b/test/io.rb index cbe3cd2b0..006c7cc8d 100644 --- a/test/io.rb +++ b/test/io.rb @@ -120,8 +120,28 @@ end #assert('IO#readline', '15.2.20.5.16') do #assert('IO#readlines', '15.2.20.5.17') do -#assert('IO#sync', '15.2.20.5.18') do -#assert('IO#sync=', '15.2.20.5.19') do + +assert('IO#sync', '15.2.20.5.18') do + io = IO.new(IO.sysopen($mrbtest_io_rfname)) + s = io.sync + assert_true(s == true || s == false) + io.close + assert_raise(IOError) do + io.sync + end +end + +assert('IO#sync=', '15.2.20.5.19') do + io = IO.new(IO.sysopen($mrbtest_io_rfname)) + io.sync = true + assert_true io.sync + io.sync = false + assert_false io.sync + io.close + assert_raise(IOError) do + io.sync = true + end +end assert('IO#write', '15.2.20.5.20') do io = IO.open(IO.sysopen($mrbtest_io_wfname)) |
