#if __GLASGOW_HASKELL__ >= 709
#elif __GLASGOW_HASKELL__ >= 701
#endif
module C2HS.C.Extra.Marshal
( peekIntegral
, peekString
, peekStringArray
, withStringArray
, peekIntegralArray
, withIntegralArray
) where
import Foreign.C.String ( peekCString, withCString )
import Foreign.C.Types ( CChar, CInt, CUInt )
import Foreign.Marshal.Array ( peekArray, withArray )
import Foreign.Ptr ( Ptr, nullPtr )
import Foreign.Storable ( Storable, peek )
peekIntegral :: (Integral a, Storable a, Integral b) => Ptr a -> IO b
peekIntegral p = if p == nullPtr
then return 0
else fromIntegral <$> peek p
peekString :: Ptr (Ptr CChar) -> IO String
peekString p = if p == nullPtr
then return ""
else peek p >>= \p' ->
if p' == nullPtr
then return ""
else peekCString p'
peekStringArray :: Integral n => n -> Ptr (Ptr CChar) -> IO [String]
peekStringArray 0 _ = return []
peekStringArray n p = if p == nullPtr
then return []
else peekArray (fromIntegral n) p >>=
mapM (\p' -> if p' == nullPtr
then return ""
else peekCString p')
withStringArray :: [String] -> (Ptr (Ptr CChar) -> IO a) -> IO a
withStringArray [] f = f nullPtr
withStringArray ss f = do
ps <- mapM (\s -> withCString s return) ss
withArray ps f
peekIntegralArray :: (Integral n, Integral m, Storable m) => Int -> Ptr m -> IO [n]
peekIntegralArray n p = (map fromIntegral) <$> peekArray n p
withIntegralArray :: (Integral a, Integral b, Storable b) => [a] -> (Ptr b -> IO c) -> IO c
withIntegralArray ns f = do
let ns' = fmap fromIntegral ns
withArray ns' f