Embedded Ruby into C

Anyone got any good resources on embedding C into Ruby? The ones I
found were a couple years old (i.e. for 1.6).

What I'd like to do is be able to call Ruby functions from the C code
(don't care about return value here), and be able to call C functions
(and get the return data) from the Ruby code.

Thanks,
Joe

Anyone got any good resources on embedding C into Ruby? The ones I
found were a couple years old (i.e. for 1.6).

Chapter 21 in Programming Ruby, Second Edition covers it for Ruby 1.8.
I haven't tried it but it looks like a reasonably complete
explanation.

···

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

What I'd like to do is be able to call Ruby functions from the C code
(don't care about return value here), and be able to call C functions
(and get the return data) from the Ruby code.

Thanks,
Joe

--
Jon Smirl
jonsmirl@gmail.com

I created a Ruby extension in C called 'functions.so'. My ruby script
is require'ing it.

When I launch the Ruby script via ruby_run() in C, I get 'no such file
to load -- functions' error.

Any ideas?

···

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

Anyone got any good resources on embedding C into Ruby? The ones I
found were a couple years old (i.e. for 1.6).

What I'd like to do is be able to call Ruby functions from the C code
(don't care about return value here), and be able to call C functions
(and get the return data) from the Ruby code.

> Anyone got any good resources on embedding C into Ruby? The ones I
> found were a couple years old (i.e. for 1.6).
>
> What I'd like to do is be able to call Ruby functions from the C code
> (don't care about return value here), and be able to call C functions
> (and get the return data) from the Ruby code.

I created a Ruby extension in C called 'functions.so'. My ruby script
is require'ing it.

When I launch the Ruby script via ruby_run() in C, I get 'no such file
to load -- functions' error.

The source code from the book is here:
http://www.pragmaticprogrammer.com/titles/ruby/code/index.html
The examples from "Extending Ruby" may help.

···

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

Any ideas?

--
Jon Smirl
jonsmirl@gmail.com

Aha, calling ruby_init_loadpath() did the trick.

Essentially, I have a C program. I want to create a GUI (using
ruby-gnome2) that can call the C program's functions and process and
report its data.

Originally, I added a small UDP server to the C program that would
listen for UDP messages from the Ruby GUI and that's how they
exchanged information. The process of creating all the message
formats for the UDP messages was a pain in the butt though. So I'm
thinking of a different approach (embedding a Ruby program in the C
executable and create Ruby extensions for calling the C functions).

Joe

···

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> Anyone got any good resources on embedding C into Ruby? The ones I
> found were a couple years old (i.e. for 1.6).
>
> What I'd like to do is be able to call Ruby functions from the C code
> (don't care about return value here), and be able to call C functions
> (and get the return data) from the Ruby code.

I created a Ruby extension in C called 'functions.so'. My ruby script
is require'ing it.

When I launch the Ruby script via ruby_run() in C, I get 'no such file
to load -- functions' error.

Is this a reasonable approach:

int main()
{
  initialize ruby stuff

  create glib thread (or maybe pthread)
  {
     run ruby script that starts the GUI
  }
}

···

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:

On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> On 12/11/05, Joe Van Dyk <joevandyk@gmail.com> wrote:
> > Anyone got any good resources on embedding C into Ruby? The ones I
> > found were a couple years old (i.e. for 1.6).
> >
> > What I'd like to do is be able to call Ruby functions from the C code
> > (don't care about return value here), and be able to call C functions
> > (and get the return data) from the Ruby code.
>
> I created a Ruby extension in C called 'functions.so'. My ruby script
> is require'ing it.
>
> When I launch the Ruby script via ruby_run() in C, I get 'no such file
> to load -- functions' error.

Aha, calling ruby_init_loadpath() did the trick.

Essentially, I have a C program. I want to create a GUI (using
ruby-gnome2) that can call the C program's functions and process and
report its data.

Originally, I added a small UDP server to the C program that would
listen for UDP messages from the Ruby GUI and that's how they
exchanged information. The process of creating all the message
formats for the UDP messages was a pain in the butt though. So I'm
thinking of a different approach (embedding a Ruby program in the C
executable and create Ruby extensions for calling the C functions).

Anyone know how I can avoid the following compile errors?

/usr/lib/libruby.so: undefined reference to `gnu_dev_major@GLIBC_2.3.3'
/usr/lib/libruby.so: undefined reference to `gnu_dev_minor@GLIBC_2.3.3'

One more question:

Can I embed a Ruby extension into a C executable, run a Ruby script
from the C executable, and have the Ruby script have access to the
Ruby extension that's in the C executable?

Whew, figured it all out.

My solution was to create a Ruby object in C that has access to all of
the C program's internal data, then create a normal Ruby object from a
Ruby script file, then give that Ruby object the C/Ruby object that I
first created.

So, now, in C, I have this gigantic array of structs. Each struct has
a bunch of fields and a bunch of 'sub structs' (i.e. pointers to other
structs).

What's the easiest way to do reporting on this array of structs in Ruby?

Thanks,
Joe