Let's say you have a shared C library (called testlib.so) with the following
function signature:

void func1(int *buf);

How would you use uFFI to call this function? How would you complete the
following code fragment:

self ffiCall: #( void func1(??? buf) ) module: 'testlib.so'.

where buf should hold whatever integer value func1 puts into it. Maybe buf
needs to be prepared somehow before the ffiCall?



horrido wrote
> Je comprends enfin...
> 
> I accidentally came across a StackOverflow answer that suggested the
> String object is immutable. That makes perfect sense, as I know the C
> function is actually 
/*
> trying
*/
>  to write to the buffer.
> 
> That gave me the idea to use a ByteArray instead. Now, everything works!
> 
> horrido wrote
>> There is shockingly very little documentation on how to use uFFI. In
>> particular, I have the following situation...
>> 
>> A shared C lib has the following function:
>> 
>> void get_machine(char *machine) {
>>      uname(&uname_s);
>>      strcpy(machine, uname_s.machine);
>> }
>> 
>> It copies the content of a string value into the buffer passed to it
>> (char *machine).
>> 
>> I want to call this function from Pharo, thus:
>> 
>> buffer := String new: 64.
>> self ffiCall: #( void get_machine(String buffer) ).
>> 
>> The buffer never receives the string value (it just contains the 64
>> initiialized spaces).
>> 
>> Clearly, I'm misunderstanding the proper mechanism for doing this.
>> 
>> [There are other functions in the shared C lib that work fine, such as:
>> 
>> uint get_uptime() {
>>      sysinfo(&info);
>>      return info.uptime;
>> }
>> 
>> Returning integers or floats is no problem. But passing arguments by
>> reference seems to be verboten.]





--
View this message in context: 
http://forum.world.st/How-to-use-uFFI-with-String-tp4947890p4948184.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.

Reply via email to