From 3e4f5d2f6c8892e32c09953b93b24a72170811b1 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 12 Jan 2018 11:57:16 -0500 Subject: [PATCH] update example and simplify a bit --- Makefile | 2 ++ Rakefile.rb | 22 ------------------ main.c | 65 +++++++++++++++++++++++++++++++---------------------- 3 files changed, 40 insertions(+), 49 deletions(-) create mode 100644 Makefile delete mode 100644 Rakefile.rb diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..357a72a --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +main: main.c + gcc -o $@ $^ $$(pkg-config --cflags --libs ruby) diff --git a/Rakefile.rb b/Rakefile.rb deleted file mode 100644 index a7cadb1..0000000 --- a/Rakefile.rb +++ /dev/null @@ -1,22 +0,0 @@ -require "rscons" - -WINDOWS_RUBY_PATH = "/cygdrive/c/Ruby193" - -task :default do - Rscons::Environment.new do |env| - if RUBY_PLATFORM =~ /cygwin/ - env["CC"] = "i686-pc-mingw32-gcc" - env["CPPPATH"] += [ - "#{WINDOWS_RUBY_PATH}/include/ruby-1.9.1", - "#{WINDOWS_RUBY_PATH}/include/ruby-1.9.1/i386-mingw32", - ] - env["LIBS"] += ["msvcrt-ruby191"] - env["LDFLAGS"] += ["-L#{WINDOWS_RUBY_PATH}/lib"] - else - env.parse_flags!("!pkg-config --cflags --libs ruby-1.9") - end - env["CFLAGS"] += ["-Wall"] - sources = Dir["*.c"] - env.Program("main", sources) - end -end diff --git a/main.c b/main.c index e0083b8..e6c1572 100644 --- a/main.c +++ b/main.c @@ -1,39 +1,50 @@ #include -#include "ruby.h" +#include +#include -RUBY_GLOBAL_SETUP - -static VALUE eval(const char * string) +VALUE ruby_protect_eval_string_rescue(VALUE exception, VALUE exception_object) { - int state; - VALUE v = rb_eval_string_protect(string, &state); - if (state != 0) - { -// fprintf(stderr, "rb_eval_string_protect() returned state %d!\n", state); - VALUE e = rb_errinfo(); - VALUE s = rb_funcall(e, rb_intern("message"), 0); - fprintf(stderr, "%s\n", StringValueCStr(s)); - rb_set_errinfo(Qnil); - } - return v; + *(bool *)exception = true; + fprintf(stderr, "exception: %s\n", + rb_obj_classname(exception_object)); + return Qnil; } -int main(int argc, char *argv[]) +VALUE ruby_protect_eval_string(const char * ruby_expression, bool * exception) { - int _argc = 1; - char *_argv[] = {"main"}; - char **_argv_p = &_argv[0]; - ruby_sysinit(&_argc, &_argv_p); + *exception = false; + return rb_rescue(rb_eval_string, (VALUE)ruby_expression, + ruby_protect_eval_string_rescue, (VALUE)exception); +} + +int main(int argc, char **argv) +{ + if (argc < 2) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return -1; + } + VALUE v = INT2FIX(0); + bool exception; { RUBY_INIT_STACK; ruby_init(); - ruby_init_loadpath(); - VALUE v = eval("3 + 8"); - printf("v: %d\n", FIX2INT(v)); - eval("yoda"); - eval("File.open('out.txt', 'w') {|fh| fh.puts 'hello!'}"); - eval("puts 'Hello, World!'"); - ruby_finalize(); + v = ruby_protect_eval_string(argv[1], &exception); + } + if (exception) + { + fprintf(stderr, "Exception!\n"); + } + else + { + if (FIXNUM_P(v)) + { + printf("Success! Result is %d\n", FIX2INT(v)); + } + else + { + printf("Success! Non-Fixnum result\n"); + } } return 0; }