diff options
| author | Tomoyuki Sahara <[email protected]> | 2016-06-21 09:49:34 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2016-06-21 09:49:34 +0900 |
| commit | 2af2a4fff838ef7f84a357252ab3afe8d8359b68 (patch) | |
| tree | 08ce40f652051e3bcda7c1563b5000f1228ab56f | |
| parent | 1c4428880b2f0f0fcd81ea2debc5f4459a7ed53c (diff) | |
| download | mruby-2af2a4fff838ef7f84a357252ab3afe8d8359b68.tar.gz mruby-2af2a4fff838ef7f84a357252ab3afe8d8359b68.zip | |
add IO#isatty and IO#tty?
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | mrblib/io.rb | 1 | ||||
| -rw-r--r-- | src/io.c | 65 | ||||
| -rw-r--r-- | test/io.rb | 12 |
4 files changed, 52 insertions, 30 deletions
@@ -1,7 +1,7 @@ mruby-io ======== -IO, File module for mruby +`IO` and `File` classes for mruby ## Installation Add the line below to your `build_config.rb`: @@ -62,7 +62,7 @@ Add the line below to your `build_config.rb`: | IO#gets | o | | | IO#internal_encoding | | | | IO#ioctl | | | -| IO#isatty, IO#tty? | | | +| IO#isatty, IO#tty? | o | | | IO#lineno | | | | IO#lineno= | | | | IO#lines | | obsolete | diff --git a/mrblib/io.rb b/mrblib/io.rb index 755dbbf6d..9644c2396 100644 --- a/mrblib/io.rb +++ b/mrblib/io.rb @@ -367,6 +367,7 @@ class IO end alias_method :to_i, :fileno + alias_method :tty?, :isatty end STDIN = IO.open(0, "r") @@ -40,6 +40,11 @@ #include <string.h> +static void mrb_io_free(mrb_state *mrb, void *ptr); +struct mrb_data_type mrb_io_type = { "IO", mrb_io_free }; + + +static struct mrb_io *io_get_open_fptr(mrb_state *mrb, mrb_value self); static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *modestr); static int mrb_io_flags_to_modenum(mrb_state *mrb, int flags); static void fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int noraise); @@ -52,6 +57,18 @@ mrb_module_get(mrb_state *mrb, const char *name) } #endif +static struct mrb_io * +io_get_open_fptr(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 fptr; +} + static int mrb_io_modestr_to_flags(mrb_state *mrb, const char *mode) { @@ -205,8 +222,6 @@ mrb_io_free(mrb_state *mrb, void *ptr) } } -struct mrb_data_type mrb_io_type = { "IO", mrb_io_free }; - static struct mrb_io * mrb_io_alloc(mrb_state *mrb) { @@ -425,6 +440,17 @@ fptr_finalize(mrb_state *mrb, struct mrb_io *fptr, int noraise) } mrb_value +mrb_io_isatty(mrb_state *mrb, mrb_value self) +{ + struct mrb_io *fptr; + + fptr = io_get_open_fptr(mrb, self); + if (isatty(fptr->fd) == 0) + return mrb_false_value(); + return mrb_true_value(); +} + +mrb_value mrb_io_s_for_fd(mrb_state *mrb, mrb_value klass) { struct RClass *c = mrb_class_ptr(klass); @@ -601,13 +627,10 @@ mrb_io_syswrite(mrb_state *mrb, mrb_value io) } mrb_value -mrb_io_close(mrb_state *mrb, mrb_value io) +mrb_io_close(mrb_state *mrb, mrb_value self) { struct mrb_io *fptr; - fptr = (struct mrb_io *)mrb_get_datatype(mrb, io, &mrb_io_type); - if (fptr && fptr->fd < 0) { - mrb_raise(mrb, E_IO_ERROR, "closed stream."); - } + fptr = io_get_open_fptr(mrb, self); fptr_finalize(mrb, fptr, FALSE); return mrb_nil_value(); } @@ -879,16 +902,13 @@ mrb_io_fileno(mrb_state *mrb, mrb_value io) } mrb_value -mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value io) +mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value self) { #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) struct mrb_io *fptr; int ret; - fptr = (struct mrb_io *)mrb_get_datatype(mrb, io, &mrb_io_type); - if (fptr->fd < 0) { - mrb_raise(mrb, E_IO_ERROR, "closed stream"); - } + fptr = io_get_open_fptr(mrb, self); if (fptr->fd2 >= 0) { if ((ret = fcntl(fptr->fd2, F_GETFD)) == -1) mrb_sys_fail(mrb, "F_GETFD failed"); @@ -906,18 +926,14 @@ mrb_io_close_on_exec_p(mrb_state *mrb, mrb_value io) } mrb_value -mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value io) +mrb_io_set_close_on_exec(mrb_state *mrb, mrb_value self) { #if defined(F_GETFD) && defined(F_SETFD) && defined(FD_CLOEXEC) struct mrb_io *fptr; int flag, ret; mrb_bool b; - fptr = (struct mrb_io *)mrb_get_datatype(mrb, io, &mrb_io_type); - if (fptr->fd < 0) { - mrb_raise(mrb, E_IO_ERROR, "closed stream"); - } - + fptr = io_get_open_fptr(mrb, self); mrb_get_args(mrb, "b", &b); flag = b ? FD_CLOEXEC : 0; @@ -951,11 +967,7 @@ 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."); - } - + fptr = io_get_open_fptr(mrb, self); mrb_get_args(mrb, "b", &b); fptr->sync = b; return mrb_bool_value(b); @@ -965,11 +977,7 @@ 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."); - } + fptr = io_get_open_fptr(mrb, self); return mrb_bool_value(fptr->sync); } @@ -994,6 +1002,7 @@ mrb_init_io(mrb_state *mrb) #endif mrb_define_method(mrb, io, "initialize", mrb_io_initialize, MRB_ARGS_ANY()); /* 15.2.20.5.21 (x)*/ + mrb_define_method(mrb, io, "isatty", mrb_io_isatty, MRB_ARGS_NONE()); 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()); diff --git a/test/io.rb b/test/io.rb index ee0432b14..da94360d7 100644 --- a/test/io.rb +++ b/test/io.rb @@ -262,6 +262,18 @@ assert('IO#_read_buf') do io.closed? end +assert('IO#isatty') do + f1 = File.open("/dev/tty") + f2 = File.open($mrbtest_io_rfname) + + assert_true f1.isatty + assert_false f2.isatty + + f1.close + f2.close + true +end + assert('IO#pos=, IO#seek') do fd = IO.sysopen $mrbtest_io_rfname io = IO.new fd |
