# FILE \* friom C to ruby with swig

**URL:** <https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486>\
**Category:** Ruby\
**Created:** [August 21, 2008, 4:35pm UTC](https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486 "2008-08-21T16:35:20Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![lyes](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ed8c4c/32.png) [@lyes](https://www.ruby-forum.com/u/lyes)\
**Post date:** [August 21, 2008, 4:35pm UTC](https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486/1 "2008-08-21T16:35:20Z")

</div>

Hello list,

I have written a function which prototype is:

FILE \* getContent (void \* objetc, char \* code);

This function a FILE \* to a temporary file it fill with user data, and  
copy  
in “code” (with strcpy) some string

I warpedd this function with Swig, but when I call it from a Ruby  
script, I  
have two problems:

1- The class of the function output in Ruby is SWIG::TYPE\_p\_FILE,  
what is  
this class? I looked for it in the net by without results, Hows can I  
recover the data from my temporary file with this?

2- when I call this function from a C program, the variable code will  
contain a string value that the function copy to it from an other  
variable  
in internal. and with a C program, the content of the variable code is  
updated very well. But when I call the wrapped function from a Ruby  
script,  
the argument code stays empty (empty string “”)? How have to give this  
argument in such way that it will be modified?

thank you

---

<div class="post-metadata">

**Author:** ![lyes](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ed8c4c/32.png) [@lyes](https://www.ruby-forum.com/u/lyes)\
**Post date:** [August 21, 2008, 6:39pm UTC](https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486/2 "2008-08-21T18:39:40Z")

</div>

Lyes A. wrote:

> 1- The class of the function output in Ruby is SWIG::TYPE\_p\_FILE, what is  
> this class? I looked for it in the net by without results, Hows can I  
> recover the data from my temporary file with this?

SWIG::TYPE\_p\_XXX is what SWIG returns when it doesn’t know how to deal  
with the type returned by a C function. It’s an opaque and useless  
pointer. You need to deal with FILE\* - typically by using a  
%typemap(out) - in some way.

I don’t know exactly how to deal with FILE\* - there may be a standard  
SWIG typemap to deal with this, or you might search for examples to  
convert it to a Ruby File object.

> 2- when I call this function from a C program, the variable code will  
> contain a string value that the function copy to it from an other variable  
> in internal. and with a C program, the content of the variable code is  
> updated very well. But when I call the wrapped function from a Ruby script,  
> the argument code stays empty (empty string “”)? How have to give this  
> argument in such way that it will be modified?

Passing in a char\* buffer which is modified by a function is a very  
common idiom in C, but it’s un-rubyish. Again, you’ll need a  
%typemap(in) or write a wrapper function. Have a look at the \*INOUT  
standard typemaps in SWIG.

Usually the most natural ruby way to deal with this is to use  
%typemap(in,numinputs=0) and return two VALUEs to ruby, the file object  
and a new string.

alex

---

<div class="post-metadata">

**Author:** ![lyes](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ed8c4c/32.png) [@lyes](https://www.ruby-forum.com/u/lyes)\
**Post date:** [August 21, 2008, 6:50pm UTC](https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486/3 "2008-08-21T18:50:14Z")

</div>

On 21/08/2008, Lyes A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> have two problems:
> 
> 1- The class of the function output in Ruby is SWIG::TYPE\_p\_FILE, what is  
> this class? I looked for it in the net by without results, Hows can I  
> recover the data from my temporary file with this?

What you get is a FILE \* object which ruby cannot handle. However, you  
can use Swig to write read and write methods for this object, and you  
could then get at the data.

Or you could rewrite your C function to return a file descriptor  
rather than a FILE \* object, and update the Swig wrapper to turn the  
file descriptor into an IO object (using IO::for\_fd) that you can use  
in Ruby without problems. Or you could just use the automatic Swig  
wrapper, and wrap the function once more in ruby to turn the fd into  
IO.

> 2- when I call this function from a C program, the variable code will  
> contain a string value that the function copy to it from an other variable  
> in internal. and with a C program, the content of the variable code is  
> updated very well. But when I call the wrapped function from a Ruby script,  
> the argument code stays empty (empty string “”)? How have to give this  
> argument in such way that it will be modified?

I haven’t seen your Swig code (and I am not proficient with Swig  
anyway but others might figure out something when they look at it) but  
my guess is that autogenerated wrappers should convert String to char

- just fine.

What might confuse the generator is the first argument which has no  
apparent type, and you have to extract some C value from the argument  
passed to the wrapped function. Which means that you will probably  
have to write a manual wrapper or even multiple wrappers that convert  
the first argument in different ways, and perhaps pass a different  
second argument based on the conversion of the first argument.

Generally I have no idea what the function is supposed to do so I  
cannot tell you how it could be wrapped.

HTH

Michal

---

<div class="post-metadata">

**Author:** ![lyes](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/ed8c4c/32.png) [@lyes](https://www.ruby-forum.com/u/lyes)\
**Post date:** [August 23, 2008, 9:33am UTC](https://www.ruby-forum.com/t/file-friom-c-to-ruby-with-swig/146486/4 "2008-08-23T09:33:29Z")

</div>

OK, thank you all, I will try your suggets!
