ruby/goruby.c
Nobuyoshi Nakada ecb58a8d08
Fix prelude to use IBF
Since universal-parser and prism support, prelude code used functions
inaccessible from outside libruby shared library.

```
linking goruby
/usr/bin/ld: goruby.o: in function `prelude_eval':
/home/runner/work/ruby/ruby/build/golf_prelude.c:221: undefined reference to `rb_ruby_prism_ptr'
/usr/bin/ld: goruby.o: in function `pm_prelude_load':
/home/runner/work/ruby/ruby/build/golf_prelude.c:192: undefined reference to `pm_options_line_set'
/usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:193: undefined reference to `pm_parse_string'
/usr/bin/ld: goruby.o: in function `prelude_eval':
/home/runner/work/ruby/ruby/build/golf_prelude.c:224: undefined reference to `pm_iseq_new_with_opt'
/usr/bin/ld: /home/runner/work/ruby/ruby/build/golf_prelude.c:226: undefined reference to `pm_parse_result_free'
/usr/bin/ld: goruby.o: in function `prelude_ast_value':
/home/runner/work/ruby/ruby/build/golf_prelude.c:181: undefined reference to `rb_ruby_ast_data_get'
/usr/bin/ld: goruby.o: in function `prelude_eval':
/home/runner/work/ruby/ruby/build/golf_prelude.c:231: undefined reference to `rb_ruby_ast_data_get'
/usr/bin/ld: goruby.o: in function `pm_prelude_load':
/home/runner/work/ruby/ruby/build/golf_prelude.c:196: undefined reference to `pm_parse_result_free'
collect2: error: ld returned 1 exit status
```
2024-09-08 23:40:17 +09:00

68 lines
1.5 KiB
C

static void Init_golf_prelude(void);
static void *goruby_options(int argc, char **argv);
static int goruby_run_node(void *arg);
#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*);
#include "golf_prelude.rbbin"
static VALUE
init_golf(VALUE arg)
{
Init_golf_prelude();
rb_provide("golf.so");
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) {
close(rw[0]);
close(rw[1]);
goto no_irb;
}
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;
}
no_irb:
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);
}