module LLVM.Internal.FFI.ShortByteString
( packCString
, packCStringLen
, useAsCString
, useAsCStringLen
) where
import LLVM.Prelude
import Data.ByteString.Internal (c_strlen)
import Data.ByteString.Short.Internal
import qualified Data.ByteString.Short as ByteString
import Foreign.C.String
import Foreign.Marshal.Alloc
import Foreign.Storable
packCString :: CString -> IO ShortByteString
packCString cstr = do
len <- c_strlen cstr
packCStringLen (cstr, fromIntegral len)
packCStringLen :: CStringLen -> IO ShortByteString
packCStringLen (cstr, len) | len >= 0 = createFromPtr cstr len
packCStringLen (_, len) =
error ("negative length: " ++ show len)
useAsCString :: ShortByteString -> (CString -> IO a) -> IO a
useAsCString bs action =
allocaBytes (l+1) $ \buf -> do
copyToPtr bs 0 buf (fromIntegral l)
pokeByteOff buf l (0::Word8)
action buf
where l = ByteString.length bs
useAsCStringLen :: ShortByteString -> (CStringLen -> IO a) -> IO a
useAsCStringLen bs action =
allocaBytes l $ \buf -> do
copyToPtr bs 0 buf (fromIntegral l)
action (buf, l)
where l = ByteString.length bs