Hi,
I'm writing bindings to Subversion by SWIG. This has some
callback codes.
In < .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
|