SWIG, Ruby, C and typemaps

J

Jeff Sack

Hello all. I am seeking some advice on using SWIG to wrap some native
C code provided to me (I don't have the ability to change it).
Basically, I have something like this:

The definition of one of the problematic methods I am trying to wrap
looks something like this. This is in my SWIG interface file (.i
file):

int open_file(ResponseObject **resp, const char *fname);

And the normal way of using this is as follows:

ResponseObject *reponsObj;
const char *filename="input_file";

if(open_file(&reponsObj, filename)!=0)
{
// handle non-zero error code
}
else
{
// success!
}


I think the most natural way of accessing this method might be
something like this:

resp = open_file('input_file')

In this scenario, resp is a Ruby object representing ResponseObject,
and the original int return value is now mapped to a conditionally
thrown exception. If open_file returns 0, then no exception would be
thrown, otherwise, the Ruby method open_file would throw an exception
which wraps the int return code.

Thoughts? I know there is some SWIG/typemap magic that can do this,
but so far I'm a bit stumped. Can someone offer some advice? I can
provide more details if needed.

Thanks so much in advance for your help. Much appreciated.

-Jeff
 
A

Alex Fenton

Jeff said:
The definition of one of the problematic methods I am trying to wrap
looks something like this. This is in my SWIG interface file (.i
file):

int open_file(ResponseObject **resp, const char *fname);
....

I think the most natural way of accessing this method might be
something like this:

resp = open_file('input_file')

You'lll first want a typemap to tell SWIG to convert one ruby input (the string filename) into the two parameters C is expecting. Along the lines of (untested)

%typemap(in,numinputs=1) (ResponseObject **resp, const char *fname) {
$1 = new ResponseObject();
$2 = rb_str_new2(fname);
}

Then you'll need another typemap to treat the resp argument as a ruby return value, and convert it to a ruby wrapper round the C object.

%typemap(argout) (ResponseObject **resp) {
$result = SWIG_NewPointerObj($1, $1_descriptor, 1);
}

hth
alex
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,066
Latest member
VytoKetoReviews

Latest Threads

Top