Mapping betwing a standard type and a user defined type with SWIG

Hello!

I've wrote a C library where I redefined (with typedef) the "char" and I
gave it the name "my_char". Every things worked well when I gave constant
strings to my wrapped functions which takes a "my_char *" as argument (then
it is equivalent to give a char * argument). But when I have given a String
variable to one of my functions (I initialised a variable var = "" and gave
it to the finction), it returned me this:

Expected argument 3 of type my_char *, but got String "" (TypeError)

How can I do to tell SWIG that the "my_char" type is euivalent to the "char"
type? May I have a solution to make work my functions

thank you

···

--

Lyes Amazouz
USTHB, Algiers

===========

Lyes Amazouz wrote:

I've wrote a C library where I redefined (with typedef) the "char" and I
gave it the name "my_char". Every things worked well when I gave constant
strings to my wrapped functions which takes a "my_char *" as argument (then
it is equivalent to give a char * argument). But when I have given a String
variable to one of my functions (I initialised a variable var = "" and gave
it to the finction), it returned me this:

Expected argument 3 of type my_char *, but got String "" (TypeError)

How can I do to tell SWIG that the "my_char" type is euivalent to the "char"
type? May I have a solution to make work my functions

You are passing a C function that expects a 'my_char*' a Ruby string, which in C has the type VALUE.

You need to apply a typemap that tells SWIG how to translate a ruby object into my_char*. Something roughly like:

%typemap(in) my_char* "$1 = (my_char*)STR2CSTR($input);"

This is the most basic conversion; a good typemap would probably also verify the ruby class of the passed-in argument, perhaps using SWIG's %typemap(check)

Without wishing to be rude, this is fairly basic SWIG stuff. You might want to have another look at the manual. It is dense but quite comprehensive. In particular:

http://www.swig.org/Doc1.3/Ruby.html#Ruby_nn37
http://www.swig.org/Doc1.3/Ruby.html#Ruby_nn41

alex

Hello

Thank you for your help, I will try this.

···

On Wed, Aug 20, 2008 at 4:51 PM, Alex Fenton <alex@deleteme.pressure.to>wrote:

Lyes Amazouz wrote:

I've wrote a C library where I redefined (with typedef) the "char" and I

gave it the name "my_char". Every things worked well when I gave constant
strings to my wrapped functions which takes a "my_char *" as argument
(then
it is equivalent to give a char * argument). But when I have given a
String
variable to one of my functions (I initialised a variable var = "" and
gave
it to the finction), it returned me this:

Expected argument 3 of type my_char *, but got String "" (TypeError)

How can I do to tell SWIG that the "my_char" type is euivalent to the
"char"
type? May I have a solution to make work my functions

You are passing a C function that expects a 'my_char*' a Ruby string, which
in C has the type VALUE.

You need to apply a typemap that tells SWIG how to translate a ruby object
into my_char*. Something roughly like:

%typemap(in) my_char* "$1 = (my_char*)STR2CSTR($input);"

This is the most basic conversion; a good typemap would probably also
verify the ruby class of the passed-in argument, perhaps using SWIG's
%typemap(check)

Without wishing to be rude, this is fairly basic SWIG stuff. You might want
to have another look at the manual. It is dense but quite comprehensive. In
particular:

SWIG and Ruby
SWIG and Ruby

alex

--

Lyes Amazouz
USTHB, Algiers

===========