Maurí­cio wrote:
Hi,

How is CStringLen supposed to be used? The only
usual C string I'm familiar with is the null
terminated sequence of chars. I remember some
Pascal version where the first 2 bytes were used
as an integer counting the following characters.
What is the convention used in Foreign.C.String?

the docs (via Hoogle) tell me:

withCStringLen :: String -> (CStringLen -> IO a) -> IO a
type CStringLen = (Ptr CChar, Int)

I have a C function signature like this:

void function (int,const void*,int,const void*)

where each (int,const void*) pair is a string.
Can (should) I use CStringLen here? How?

seems an approprate use case for withCStringLen, yes, as long as you take care with character encodings:

"
The translation between Unicode and the encoding of the current locale may be lossy.
"

So for a "quick hack" withCStringLen is probably the quickest solution, otherwise something that takes into account Unicode and locales etc would be preferable (I think there are some UTF string packages around, maybe on hackage?).

for withCStringLen something like this might work (completely untested!):


foreign import ccall "function.h function"
  function_c :: CInt -> Ptr CChar -> CInt -> Ptr CChar -> IO ()

function :: String -> String -> IO ()
function s t = withCStringLen s (\(sp,sl) ->
               withCStringLen t (\(tp,tl) ->
               function_c (toEnum sl) sp (toEnum tl) tp ) )
-- where toEnum :: Int -> CInt
-- perhaps castPtr is useful depending on import declaration too...


Hopefully this is in the right direction,

Thanks,
Maurício


Claude
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to