diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-12-14 15:09:35 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-12-14 15:09:35 +0000 |
commit | 1a74fa4b04da04bd2bb33103dd3cf431438df38e (patch) | |
tree | f4a1d6c2961339e0c1d653c0f8427a53315080f0 /ruby_2_2/goruby.c | |
parent | a5b755e50e2d9aabf28ba24bf58644ca22b01a4f (diff) |
add tag v2_2_9
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v2_2_9@61257 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby_2_2/goruby.c')
-rw-r--r-- | ruby_2_2/goruby.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/ruby_2_2/goruby.c b/ruby_2_2/goruby.c new file mode 100644 index 0000000000..99042f8440 --- /dev/null +++ b/ruby_2_2/goruby.c @@ -0,0 +1,60 @@ +void Init_golf(void); +#define ruby_options goruby_options +#define ruby_run_node goruby_run_node +#include "main.c" +#undef ruby_options +#undef ruby_run_node + +#if defined _WIN32 +#include <io.h> +#include <fcntl.h> +#define pipe(p) _pipe(p, 32L, _O_NOINHERIT) +#elif defined HAVE_UNISTD_H +#include <unistd.h> +#endif + +RUBY_EXTERN void *ruby_options(int argc, char **argv); +RUBY_EXTERN int ruby_run_node(void*); +RUBY_EXTERN void ruby_init_ext(const char *name, void (*init)(void)); + +static VALUE +init_golf(VALUE arg) +{ + ruby_init_ext("golf.so", Init_golf); + return arg; +} + +void * +goruby_options(int argc, char **argv) +{ + static const char cmd[] = "END{require 'irb';IRB.start}"; + int rw[2], infd; + void *ret; + + if ((isatty(0) && isatty(1) && isatty(2)) && (pipe(rw) == 0)) { + ssize_t n; + infd = dup(0); + if (infd < 0) return NULL; + dup2(rw[0], 0); + close(rw[0]); + n = write(rw[1], cmd, sizeof(cmd) - 1); + close(rw[1]); + ret = n > 0 ? ruby_options(argc, argv) : NULL; + dup2(infd, 0); + close(infd); + return ret; + } + else { + return ruby_options(argc, argv); + } +} + +int +goruby_run_node(void *arg) +{ + int state; + if (NIL_P(rb_protect(init_golf, Qtrue, &state))) { + return state == EXIT_SUCCESS ? EXIT_FAILURE : state; + } + return ruby_run_node(arg); +} |