Ruby und C

Post Reply
Message
Author
bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Ruby und C

#1 Post by bakunin »

Hi!

Ich habe zwei Fragen zur Kombination aus Ruby und C. Die zweite Frage hat eine reine C-Unterfrage. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Das Buch "Programming Ruby" mag zwar sehr gut sein, aber bei diesem Thema etwas unvollständig. Und Japanisch kann ich leider nicht so gut...

1.)

Ich möchte von C aus eine Ruby-Funktion aufrufen. Also eine, die nicht innerhalb von einer Klasse definiert wurde. Man muss aber bei den Aufrufen aus C heraus ein Objekt angeben, dass als Empfänger fungiert. Ein einfaches "puts self" gibt da "main" aus, und ich habe herausgefunden, dass main vom Typ Object ist (in C also rb_cObject). Nur wie komme ich an dieses Objekt ran? rb_gv_get("main") funktioniert jedenfalls nicht. Statt rb_funcall() könnte ich zwar rb_eval_string() verwenden, aber das muss doch auch "normal" gehen.

2.)

Ich möchte den Ruby-Interpreter in ein C-Programm einbetten. Dabei soll Ruby-Code aus einer Datei ausgeführt werden, doch das Programm soll nicht komplett beendet werden, wenn der Ruby-Interpreter die Datei verarbeitet hat. Mit rb_load_file() die Datei zu laden und per ruby_run() loszulegen funktioniert also nicht.

Muss ich hier den Code manuell einlesen (Wie liest man am besten in C eine ganze Datei in einen einzelnen String ein? Per mmap()?) und dann selbst rb_eval_string() darauf loslassen? Wird das funktionieren, d.h. kommt rb_eval_string() mit Newlines klar? Gibt es eine halbwegs elegante Lösung, weil das wäre ja irgendwie grässlich, wenn ich das so lösen müsste.

Cheers,
Wolfgang

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Ruby und C

#2 Post by bakunin »

Hi!

Heute wurde mir schlagartig klar, wie ich sehr einfach eine Datei verarbeiten lassen kann: Es geht mit

rb_eval_string ("require ('brim_config.rb')");

Damit kann ich leben. :)

Cheers,
Wolfgang

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Ruby und C

#3 Post by bakunin »

Hi nochmal!

Falls es mal jemanden interessieren sollte: Noch einfacher ist rb_require(). Ich wollte übrigens Ruby zusammen mit pthreads verwenden, aber das ist nicht möglich, der Ruby-Interpreter dreht dabei durch. Man muss Rubys eigenes Threading verwenden. Das sieht dann so aus:

Datei in einen Thread abarbeiten lassen geht ziemlich simpel per

VALUE script_thread = rb_thread_create (rb_require, (void *) script_name);

Um dann auf den Thread zu warten, ist nur ein

VALUE result = rb_funcall (script_thread, rb_intern ("value"), 0);

nötig. Statt "value" kann man auch "join" verwenden, wenn man nicht am Rückgabewert interessiert ist.

Cheers,
Wolfgang

Post Reply