98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
#include <iostream>
|
|
#include "ruby.h"
|
|
|
|
#include "Buffer.h"
|
|
#include "BufferWidget.h"
|
|
#include "Font.h"
|
|
#include "GL.h"
|
|
#include "GLProgram.h"
|
|
#include "GLShader.h"
|
|
#include "Widget.h"
|
|
#include "Window.h"
|
|
|
|
using namespace std;
|
|
|
|
RUBY_GLOBAL_SETUP
|
|
|
|
static const char * ruby_string(VALUE obj)
|
|
{
|
|
VALUE s = rb_funcall(obj, rb_intern("to_s"), 0);
|
|
return StringValueCStr(s);
|
|
}
|
|
|
|
static void print_exception(VALUE e)
|
|
{
|
|
VALUE c = rb_funcall(e, rb_intern("class"), 0);
|
|
VALUE m = rb_funcall(e, rb_intern("message"), 0);
|
|
VALUE bt = rb_funcall(e, rb_intern("backtrace"), 0);
|
|
if ((TYPE(bt) == T_ARRAY) && (RARRAY_LEN(bt) > 0))
|
|
{
|
|
fprintf(stderr,
|
|
"%s: %s (%s)\n",
|
|
ruby_string(rb_ary_entry(bt, 0)),
|
|
ruby_string(m),
|
|
ruby_string(c));
|
|
for (int i = 1; i < RARRAY_LEN(bt); i++)
|
|
{
|
|
fprintf(stderr,
|
|
" from %s\n",
|
|
ruby_string(rb_ary_entry(bt, i)));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
fprintf(stderr, "%s (%s)\n", ruby_string(m), ruby_string(c));
|
|
}
|
|
}
|
|
|
|
static void handle_bootstrap_error()
|
|
{
|
|
print_exception(rb_errinfo());
|
|
rb_set_errinfo(Qnil);
|
|
}
|
|
|
|
static int bootstrap()
|
|
{
|
|
int rv = 0;
|
|
int err_state = 0;
|
|
|
|
Buffer_Init();
|
|
BufferWidget_Init();
|
|
Font_Init();
|
|
GL_Init();
|
|
GLProgram_Init();
|
|
GLShader_Init();
|
|
Widget_Init();
|
|
Window_Init();
|
|
|
|
rb_eval_string_protect(
|
|
"load File.expand_path('../../runtime/main.rb', $0)",
|
|
&err_state);
|
|
if (err_state != 0)
|
|
{
|
|
handle_bootstrap_error();
|
|
rv = 1;
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
extern "C" int main(int argc, char *argv[])
|
|
{
|
|
int rv = 0;
|
|
int ruby_argc = 1;
|
|
char prog_name[] = "main";
|
|
char * ruby_argv[] = {&prog_name[0]};
|
|
char ** ruby_argv_p = &ruby_argv[0];
|
|
ruby_sysinit(&ruby_argc, &ruby_argv_p);
|
|
{
|
|
RUBY_INIT_STACK;
|
|
ruby_init();
|
|
ruby_init_loadpath();
|
|
ruby_script(argv[0]);
|
|
ruby_set_argv(argc, argv);
|
|
rv = bootstrap();
|
|
ruby_finalize();
|
|
}
|
|
return rv;
|
|
}
|