[MLton] passing a const char **
John Reppy
jhr at cs.uchicago.edu
Tue Dec 12 21:16:20 PST 2006
In this particular application (OpenGL shaders) the whole point of
passing an array of
strings is to avoid having to concatenate them, but thanks for the
suggestion.
- John
On Dec 12, 2006, at 9:55 PM, Matthew Fluet wrote:
>
>> I need to call a C function that takes as an argument an array of
>> strings
>> (with type const char **). Unfortunately, trying to import the
>> function
>> with a "string vector" argument type doesn't work. Is there a
>> good reason
>> for this restriction?
>
> If ML object pointers are not represented the same way as C
> pointer, then "string vector" doesn't have the same representation
> as "const char **". This is an issue on 64bit systems with smaller
> ML object pointers. It is reasonable to perform the constant time
> operation of lifting ML object pointers to C object pointers for
> the outermost FFI types, but it isn't constant overhead to coerce a
> vector of ML object pointers to a vector of C pointers, so I don't
> think it is the right design decision to support it.
>
> > Am I going to have to malloc the strings to pass
>> them as arguments?
>
> We need to handle the "const char **" idiom for exece/execp. Here
> is my solution:
>
> On the ML side, concatenate all the strings together into a single
> vector. This isn't as expensive as it sounds, since one normally
> needs to add a null-terminator to all the ML strings before
> throwing it over to the C side. Also on the ML side, allocate a
> C_Pointer.t array and a C_Size.t vector (although, perhaps the
> latter should be C_Ptrdiff.t). The C_Pointer.t array is of the same
> size as the number of strings, and is initialized to null. the
> C_Size.t vector is also of the same size as the number of strings,
> and is initialized to offsets into the concatenated string that
> correspond to the beginning of each string.
>
> This code can be found in the CUtil.StringVector structure:
> http://mlton.org/cgi-bin/viewsvn.cgi/mlton/trunk/basis-library/util/
> CUtil.sml?rev=4898&view=auto
>
> On the C side, fill in the C_Pointer.t array with the C pointers
> corresponding to the base of the concatenated string plus the offset.
>
> This code, for Posix.Process.exece, can be found at:
> http://mlton.org/cgi-bin/viewsvn.cgi/mlton/trunk/runtime/basis/
> Posix/Process/exece.c?rev=4898&view=auto
>
> I'll admit that it isn't as clean a solution as I would like, and
> perhaps it is overkill to handle mixed pointer representations.
>
>
>
More information about the MLton
mailing list