|
### main.c ###
|
|
|
|
#include <stdio.h>
|
|
#include <dlfcn.h>
|
|
|
|
|
|
/* Call bridge function */
|
|
void call_bridge(const char* filename)
|
|
{
|
|
// Open the library
|
|
const char* libname = "bridge.so";
|
|
printf("Opening library : %s\n", libname);
|
|
void* handle;
|
|
handle = dlopen(libname, RTLD_LAZY);
|
|
handle ? printf("OK\n") : printf("KO\n\t%s\n", dlerror());
|
|
if (handle)
|
|
{
|
|
// Load the symbol
|
|
const char* symname = "ruby";
|
|
printf("Load symbol : %s\n", symname);
|
|
typedef void (*symbol_t)();
|
|
symbol_t my_dlfunc = (symbol_t) dlsym(handle, symname);
|
|
const char *dlsym_error = dlerror();
|
|
!dlsym_error ? printf("OK\n") : printf("KO\n\t%s\n", dlsym_error);
|
|
// Execute the function
|
|
if (!dlsym_error) my_dlfunc(filename);
|
|
// Close the library if opened
|
|
printf("Closing library\n");
|
|
int status = dlclose(handle);
|
|
(status==0) ? printf("OK\n") : printf("KO\n\t%s\n", dlerror());
|
|
}
|
|
}
|
|
|
|
/* Main function */
|
|
int main(int argc, char **argv)
|
|
{
|
|
const int nb_run = 3;
|
|
for (int i=0; i<nb_run; i++) call_bridge(argv[1]);
|
|
return 0;
|
|
}
|
|
|
|
|
|
### bridge.c ###
|
|
|
|
#include "ruby.h"
|
|
|
|
/* Ruby interpreter routine */
|
|
void ruby(const char* filename)
|
|
{
|
|
// INITIALIZATION
|
|
RUBY_INIT_STACK
|
|
ruby_init();
|
|
ruby_init_loadpath();
|
|
ruby_script(filename);
|
|
// EXECUTION
|
|
//VALUE content = rb_funcall(rb_cFile, rb_intern("read"), 1, rb_str_new2(filename));
|
|
VALUE content = rb_str_new2("puts RUBY_VERSION; require 'fileutils'");
|
|
//VALUE content = rb_str_new2("puts RUBY_VERSION");
|
|
rb_define_const(rb_cObject, "RUBY_SCRIPT", content);
|
|
printf("Before rb_eval_string()\n");
|
|
rb_eval_string("eval(RUBY_SCRIPT, nil, $0, 1)");
|
|
printf("After rb_eval_string()\n");
|
|
// FINALIZATION ???
|
|
//ruby_finalize();
|
|
ruby_cleanup(0);
|
|
}
|
|
|
|
### Compilation script ###
|
|
|
|
#!/bin/csh -f
|
|
|
|
# Settings
|
|
set RUBY_H_FILE = <user defined>
|
|
set RUBY_SOLIB = <user defined>
|
|
setenv LD_LIBRARY_PATH ".:$RUBY_SOLIB:$LD_LIBRARY_PATH"
|
|
# Compilation
|
|
gcc -g -fPIC -Wall -std=c99 -I$RUBY_H_FILE -c bridge.c
|
|
ld -shared --export-dynamic -L$RUBY_SOLIB -lruby bridge.o -o bridge.so
|
|
gcc -g -Wall -std=c99 -ldl main.c -o main
|
|
# Simulation
|
|
./main
|