Project

General

Profile

Bug #2719 ยป testcase.txt

marchaland (David MARCHALAND), 02/07/2010 11:50 PM

 
### 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
    (1-1/1)