[Cuis-dev] I need some advice with FFI

Andres Valloud ten at smallinteger.com
Sat Nov 13 11:57:00 PST 2021


By the way, this should be added to some Cuis book somewhere or 
equivalently visible place.  What's a good place for this kind of 
information?

If somebody gave me a hand with the editing and management, I could 
expand on these notes some more.

On 11/9/21 9:49 AM, Andres Valloud via Cuis-dev wrote:
> Happy to help! :)
> 
> On 11/9/21 9:27 AM, Nicola Mingotti wrote:
>>
>> Hi Andres,
>>
>> Super valuable info, I had no idea of that !
>>
>> I just supposed what i can call from C as a function I can call from FFI.
>>
>> I see my supposition was wrong. Thank you ! you may have saved me 
>> several hours
>> of hopeless attempts.
>>
>> Nicola
>>
>>
>>
>>
>>
>>
>> On 11/9/21 18:13, Andres Valloud via Cuis-dev wrote:
>>> You can't call that function via FFI because that function is 
>>> documented in POSIX / Single Unix Specification, and virtually every 
>>> function in POSIX / SUS is allowed to be declared as a macro.  Of 
>>> course, you can't call a macro using an FFI.  Moreover, the macro may 
>>> have the same name as the function, so there may be a function called 
>>> localtime(), but if you write something like
>>>
>>> {
>>>     .
>>>     .
>>>     .
>>>     localtime(...);
>>>     .
>>>     .
>>>     .
>>> }
>>>
>>> in C, the C compiler will substitute the macro localtime() before it 
>>> ever calls the function localtime().  So, even if a function called 
>>> localtime() is there, you still should not call it via FFI.
>>>
>>> This is just one example of how macros of all kinds (C preprocessor, 
>>> linker macros, etc) can interpose themselves.  It could even be the 
>>> case, as I've seen in some Unix systems, that a function such as 
>>> memmove() does not even exist.  Of course, compilation works because 
>>> there's a macro called memmove(). Obviously, the implementation of 
>>> all such macros is private and cannot be depended on.
>>>
>>> The point is that the *only* correct way to call these things is by 
>>> writing C code, because the alternative is undefined behavior, 
>>> irreproducible bugs, and all sorts of maintenance headaches.  So, I'd 
>>> just write a plugin.
>>>
>>> Andres.
>>>
>>> On 11/9/21 2:47 AM, Nicola Mingotti wrote:
>>>>
>>>> On 11/7/21 23:08, Andres Valloud via Cuis-dev wrote:
>>>>> Are you trying to call localtime()? Like, this function?
>>>>>
>>>>> https://linux.die.net/man/3/localtime
>>>>>
>>>>> On 11/6/21 11:01 AM, Nicola Mingotti via Cuis-dev wrote:
>>>>>> Hi guys,
>>>>>>
>>>>>> I was trying to develop my first FFI calls in Cuis today but
>>>>>> I am stuck, i hope some of you can give me some guidance.
>>>>>>
>>>>>> In the attached package there are implemented 2 foreign functions
>>>>>> TestClass (class) >> time         # working
>>>>>> TestClass (class) >> localtime    # broken
>>>>>>
>>>>>> ---- interactions ----------
>>>>>> TestClass time.                                      " ok "
>>>>>> TestClass localtime2: (TestClass time).              " broken "
>>>>>> -----------------------------
>>>>>>
>>>>>> The error i get is "can not use integer as pointer".
>>>>>>
>>>>>> Any ideas ?
>>>>>>
>>>>>> bye
>>>>>> Nicola
>>>>>>
>>>>>>
>>>>
>>>>
>>>> Hi Andres,
>>>>
>>>> yes, absolutely that function ;)
>>>>
>>>> The motivation spurs from my mail to this list of 3-Nov title 
>>>> "ATTENTION. maybe nasty bug ..... "
>>>>
>>>> I am going to update on that thread today or tomorrow, time permitting.
>>>>
>>>> bye
>>>> Nicola
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>


More information about the Cuis-dev mailing list