From: Michal Suchanek Date: 2008-08-22T01:45:57+09:00 Subject: Re: FILE * friom C to ruby with swig On 21/08/2008, Lyes Amazouz wrote: > 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 , 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