mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
add IO#sync and IO#sync=
This commit is contained in:
@@ -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 | |
|
||||
|
||||
@@ -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));
|
||||
|
||||
+22
-2
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user