summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2014-07-29 10:55:02 +0900
committerTomoyuki Sahara <[email protected]>2014-07-29 10:55:02 +0900
commite60951a3052d4e38dea21566feb02cf901b6646a (patch)
tree3057bc3837f46db7adaac0397ba065b2311f40b9
parent1768ee02e5b74c2a54fa312550700ed469f7b7db (diff)
downloadmruby-e60951a3052d4e38dea21566feb02cf901b6646a.tar.gz
mruby-e60951a3052d4e38dea21566feb02cf901b6646a.zip
add IO#sync and IO#sync=
-rw-r--r--README.md4
-rw-r--r--include/mruby/ext/io.h4
-rw-r--r--src/io.c33
-rw-r--r--test/io.rb24
4 files changed, 59 insertions, 6 deletions
diff --git a/README.md b/README.md
index ee7d640eb..e8407a662 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/src/io.c b/src/io.c
index 39e5bc94b..bcf5c8f22 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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))