From: Kouhei Sutou Date: 2005-01-29T12:29:27+09:00 Subject: Re: SWIG: ruby proc->c function pointer Hi, I'm writing bindings to Subversion by SWIG. This has some callback codes. In <1106936665.034711.322390@z14g2000cwz.googlegroups.com> "SWIG: ruby proc->c function pointer" on Sat, 29 Jan 2005 03:25:52 +0900, "gga" wrote: > In the process of doing so, I realize I will need to pass proc objects > from ruby and turn them into function pointers in C, so as to provide a > callback mechanism. Here is an example: --- callback.h #ifndef CALLBACK_H #define CALLBACK_H typedef void (*callback_t) (void *user_data, const char *other_data); void invoke(callback_t callback, void *user_data, const char *other_data); #endif --- --- callback.c #include "callback.h" void invoke(callback_t callback, void *user_data, const char *other_data) { callback(user_data, other_data); } --- --- callback.i %module callback %{ void wrap_callback(void *user_data, const char *other_data) { VALUE proc = (VALUE)user_data; rb_funcall(proc, rb_intern("call"), 1, rb_str_new2(other_data)); } %} %typemap(in) (callback_t callback, void *user_data) { $1 = wrap_callback; $2 = (void *)$input; } %include callback.h %{ #include "callback.h" %} --- --- Makefile.swig # -*- Makefile -*- MODULE = callback FEATURE = $(MODULE) INTERFACE = $(MODULE).i RUBY = ruby SWIG = swig SWIGOPT = -I/usr/local/include -I/usr/include -ruby -feature $(FEATURE) WRAPPER = $(FEATURE)_wrap.c swigall: $(WRAPPER) Makefile $(WRAPPER): $(INTERFACE) $(SWIG) $(SWIGOPT) -o $@ $(INTERFACE) Makefile: extconf.rb $(RUBY) extconf.rb @if [ -f Makefile ] ; then\ echo "include Makefile.swig" >> Makefile;\ fi swigclean: @if [ -f Makefile ] ; then\ make -f Makefile clean;\ fi rm -f Makefile $(WRAPPER) --- --- extconf.rb require 'mkmf' create_makefile("callback") --- --- to build % make -f Makefile.swig % make --- --- sample usage % irb -r callback irb(main):001:0> Callback.invoke(Proc.new{|str| p str}, "abc") "abc" => nil --- -- kou