Thank you, it seems that all I need is to use { char n } instead of
c-string. Since it is an output parameter anyway, I don't care about
how memory is allocated anyway, only that it is big enough.

Just to be sure: with-out-parameters takes care of freeing the
underlying alien, right? For instance, say in Jon's example I did

: foo ( -- ) { { char 2000 } } [ "B" strcpy drop ] with-out-parameters
utf8 alien>string print ;


After the strcpy, the third byte of the allocated memory will be null,
and alien>string correctly cuts the string there. In doing this, I
think I am not creating any leaks, but I would like to have
confirmation from more experienced users

2014-11-29 19:46 GMT+01:00 Andrea Ferretti <ferrettiand...@gmail.com>:
> Thank you! I am away now, but I will try all of your solutions on monday! :-)
>
> 2014-11-28 22:30 GMT+01:00 Jon Harper <jon.harpe...@gmail.com>:
>> After investigating a bit, it might be possible? If someone more
>> knowledgeable about the ffi could comment on the following:
>>
>> FUNCTION: char* strcpy ( char * , c-string ) ;
>> : foo ( -- ) { { { char 2 } initial: B{ 0x41 0 } } } [ "B" strcpy drop ]
>> with-out-parameters utf8 alien>string print ;
>> : bar ( -- ) { { { char 2 } initial: B{ 0x41 0 } } } [ drop ]
>> with-out-parameters utf8 alien>string print ;
>>
>> foo ! prints "B"
>> bar ! prints "A"
>>
>> If there is no syntactic sugar yet for passing strings with
>> with-out-parameters, it might be interesting to add it I guess
>>
>> PS: typed this manually, sorry if there are typos :)
>> Jon
>>
>> Le 28 nov. 2014 20:43, "Jon Harper" <jon.harpe...@gmail.com> a écrit :
>>
>>> John provided an alternative, but here are the explanations of the errors
>>> you got:
>>>
>>> On Fri, Nov 28, 2014 at 5:14 PM, Andrea Ferretti
>>> <ferrettiand...@gmail.com> wrote:
>>>>
>>>>   { { c-string } } [ "hello world" swap example_cp ] with-out-parameters
>>>
>>> The syntax of with-out-parameters is an array of elements, which are
>>> either a c-type, or a triple { c-type intial: value }. So in your case, it
>>> should have been
>>>   { c-string } [ "hello world" swap example_cp ] with-out-parameters
>>>
>>>> I get "index out of bounds: 0" which seems reasonable, since I pass an
>>>> empty c-string. But if I try something like
>>>>
>>>>   { { c-string initial: "hello earth" } } [ "hello world" swap
>>>> example_cp ] with-out-parameters
>>>>
>>>> I get "local-allocation-error".
>>>
>>> The FFI only works with the optimizing compiler, so this code should be
>>> defined in a word, not run in the interactive listener. You can define the
>>> word in a source file, or directly in the listener and then call it just
>>> after you defined it
>>>
>>>
>>> Cheers,
>>> Jon
>>
>>
>> ------------------------------------------------------------------------------
>> Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
>> from Actuate! Instantly Supercharge Your Business Reports and Dashboards
>> with Interactivity, Sharing, Native Excel Exports, App Integration & more
>> Get technology previously reserved for billion-dollar corporations, FREE
>> http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
>> _______________________________________________
>> Factor-talk mailing list
>> Factor-talk@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>

------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to