Commit e60951a3 authored by Tomoyuki Sahara's avatar Tomoyuki Sahara

add IO#sync and IO#sync=

parent 1768ee02
...@@ -79,8 +79,8 @@ IO, File module for mruby ...@@ -79,8 +79,8 @@ IO, File module for mruby
| IO#seek | o | | | IO#seek | o | |
| IO#set_encoding | | | | IO#set_encoding | | |
| IO#stat | | | | IO#stat | | |
| IO#sync | | | | IO#sync | o | |
| IO#sync= | | | | IO#sync= | o | |
| IO#sysread | o | | | IO#sysread | o | |
| IO#sysseek | o | | | IO#sysseek | o | |
| IO#syswrite | o | | | IO#syswrite | o | |
......
...@@ -13,14 +13,14 @@ struct mrb_io { ...@@ -13,14 +13,14 @@ struct mrb_io {
int fd; /* file descriptor, or -1 */ int fd; /* file descriptor, or -1 */
int fd2; /* file descriptor to write if it's different from fd, or -1 */ int fd2; /* file descriptor to write if it's different from fd, or -1 */
int pid; /* child's pid (for pipes) */ int pid; /* child's pid (for pipes) */
unsigned int writable:1; unsigned int writable:1,
sync:1;
}; };
#define FMODE_READABLE 0x00000001 #define FMODE_READABLE 0x00000001
#define FMODE_WRITABLE 0x00000002 #define FMODE_WRITABLE 0x00000002
#define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE) #define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE)
#define FMODE_BINMODE 0x00000004 #define FMODE_BINMODE 0x00000004
#define FMODE_SYNC 0x00000008
#define FMODE_APPEND 0x00000040 #define FMODE_APPEND 0x00000040
#define FMODE_CREATE 0x00000080 #define FMODE_CREATE 0x00000080
#define FMODE_TRUNC 0x00000800 #define FMODE_TRUNC 0x00000800
......
...@@ -167,6 +167,7 @@ mrb_io_alloc(mrb_state *mrb) ...@@ -167,6 +167,7 @@ mrb_io_alloc(mrb_state *mrb)
fptr->fd2 = -1; fptr->fd2 = -1;
fptr->pid = 0; fptr->pid = 0;
fptr->writable = 0; fptr->writable = 0;
fptr->sync = 0;
return fptr; return fptr;
} }
...@@ -264,6 +265,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass) ...@@ -264,6 +265,7 @@ mrb_io_s_popen(mrb_state *mrb, mrb_value klass)
fptr->fd2 = write_fd; fptr->fd2 = write_fd;
fptr->pid = pid; fptr->pid = pid;
fptr->writable = ((flags & FMODE_WRITABLE) != 0); fptr->writable = ((flags & FMODE_WRITABLE) != 0);
fptr->sync = 0;
DATA_TYPE(io) = &mrb_io_type; DATA_TYPE(io) = &mrb_io_type;
DATA_PTR(io) = fptr; DATA_PTR(io) = fptr;
...@@ -323,6 +325,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io) ...@@ -323,6 +325,7 @@ mrb_io_initialize(mrb_state *mrb, mrb_value io)
fptr->fd = fd; fptr->fd = fd;
fptr->writable = ((flags & FMODE_WRITABLE) != 0); fptr->writable = ((flags & FMODE_WRITABLE) != 0);
fptr->sync = 0;
return io; return io;
} }
...@@ -793,6 +796,34 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value io) ...@@ -793,6 +796,34 @@ mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value io)
#endif #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 void
mrb_init_io(mrb_state *mrb) mrb_init_io(mrb_state *mrb)
{ {
...@@ -810,6 +841,8 @@ 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_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, "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, "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, "sysseek", mrb_io_sysseek, MRB_ARGS_REQ(1));
mrb_define_method(mrb, io, "syswrite", mrb_io_syswrite, MRB_ARGS_REQ(1)); mrb_define_method(mrb, io, "syswrite", mrb_io_syswrite, MRB_ARGS_REQ(1));
......
...@@ -120,8 +120,28 @@ end ...@@ -120,8 +120,28 @@ end
#assert('IO#readline', '15.2.20.5.16') do #assert('IO#readline', '15.2.20.5.16') do
#assert('IO#readlines', '15.2.20.5.17') 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 assert('IO#write', '15.2.20.5.20') do
io = IO.open(IO.sysopen($mrbtest_io_wfname)) io = IO.open(IO.sysopen($mrbtest_io_wfname))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment