[ruby/irb] Improve help message for no meta commands
[ruby.git] / goruby.c
blob5d452772075a316147dd8c4f8206e41cfb176454
1 static void Init_golf(void);
2 static void *goruby_options(int argc, char **argv);
3 static int goruby_run_node(void *arg);
4 #define ruby_options goruby_options
5 #define ruby_run_node goruby_run_node
6 #include "main.c"
7 #undef ruby_options
8 #undef ruby_run_node
10 #if defined _WIN32
11 #include <io.h>
12 #include <fcntl.h>
13 #define pipe(p) _pipe(p, 32L, _O_NOINHERIT)
14 #elif defined HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif
18 RUBY_EXTERN void *ruby_options(int argc, char **argv);
19 RUBY_EXTERN int ruby_run_node(void*);
20 RUBY_EXTERN void ruby_init_ext(const char *name, void (*init)(void));
22 #include "golf_prelude.c"
24 static VALUE
25 init_golf(VALUE arg)
27 Init_golf();
28 rb_provide("golf.so");
29 return arg;
32 void *
33 goruby_options(int argc, char **argv)
35 static const char cmd[] = "END{require 'irb';IRB.start}";
36 int rw[2], infd;
37 void *ret;
39 if ((isatty(0) && isatty(1) && isatty(2)) && (pipe(rw) == 0)) {
40 ssize_t n;
41 infd = dup(0);
42 if (infd < 0) {
43 close(rw[0]);
44 close(rw[1]);
45 goto no_irb;
47 dup2(rw[0], 0);
48 close(rw[0]);
49 n = write(rw[1], cmd, sizeof(cmd) - 1);
50 close(rw[1]);
51 ret = n > 0 ? ruby_options(argc, argv) : NULL;
52 dup2(infd, 0);
53 close(infd);
54 return ret;
56 no_irb:
57 return ruby_options(argc, argv);
60 int
61 goruby_run_node(void *arg)
63 int state;
64 if (NIL_P(rb_protect(init_golf, Qtrue, &state))) {
65 return state == EXIT_SUCCESS ? EXIT_FAILURE : state;
67 return ruby_run_node(arg);