X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Foreign%2FMarshal%2FUtils.hs;h=7fcacfa8c78560e0c425b737ecac3255ea5c45e2;hb=bf1530efdee344ee89cac1e37cb208222b4edff2;hp=4e0305551515f965c6582bd3e4a20fdb30e56ca4;hpb=b66a730b881d05c34c0dfe2da052b5fa01429244;p=ghc-base.git diff --git a/Foreign/Marshal/Utils.hs b/Foreign/Marshal/Utils.hs index 4e03055..7fcacfa 100644 --- a/Foreign/Marshal/Utils.hs +++ b/Foreign/Marshal/Utils.hs @@ -1,4 +1,4 @@ -{-# OPTIONS_GHC -fno-implicit-prelude #-} +{-# OPTIONS_GHC -XNoImplicitPrelude #-} ----------------------------------------------------------------------------- -- | -- Module : Foreign.Marshal.Utils @@ -24,16 +24,16 @@ module Foreign.Marshal.Utils ( -- ** Marshalling of Boolean values (non-zero corresponds to 'True') -- fromBool, -- :: Num a => Bool -> a - toBool, -- :: Num a => a -> Bool + toBool, -- :: Num a => a -> Bool -- ** Marshalling of Maybe values -- maybeNew, -- :: ( a -> IO (Ptr a)) - -- -> (Maybe a -> IO (Ptr a)) + -- -> (Maybe a -> IO (Ptr a)) maybeWith, -- :: ( a -> (Ptr b -> IO c) -> IO c) - -- -> (Maybe a -> (Ptr b -> IO c) -> IO c) + -- -> (Maybe a -> (Ptr b -> IO c) -> IO c) maybePeek, -- :: (Ptr a -> IO b ) - -- -> (Ptr a -> IO (Maybe b)) + -- -> (Ptr a -> IO (Maybe b)) -- ** Marshalling lists of storable objects -- @@ -47,20 +47,19 @@ module Foreign.Marshal.Utils ( ) where import Data.Maybe -import Foreign.Ptr ( Ptr, nullPtr ) -import Foreign.Storable ( Storable(poke) ) -import Foreign.C.Types ( CSize ) -import Foreign.Marshal.Alloc ( malloc, alloca ) +import Foreign.Ptr ( Ptr, nullPtr ) +import Foreign.Storable ( Storable(poke) ) +import Foreign.C.Types ( CSize ) +import Foreign.Marshal.Alloc ( malloc, alloca ) #ifdef __GLASGOW_HASKELL__ -import GHC.IOBase -import GHC.Real ( fromIntegral ) +import GHC.Real ( fromIntegral ) import GHC.Num import GHC.Base #endif #ifdef __NHC__ -import Foreign.C.Types ( CInt(..) ) +import Foreign.C.Types ( CInt(..) ) #endif -- combined allocation and marshalling @@ -114,19 +113,19 @@ toBool = (/= 0) -- marshalling of Maybe values -- --------------------------- --- |Allocate storage and marshall a storable value wrapped into a 'Maybe' +-- |Allocate storage and marshal a storable value wrapped into a 'Maybe' -- -- * the 'nullPtr' is used to represent 'Nothing' -- maybeNew :: ( a -> IO (Ptr a)) - -> (Maybe a -> IO (Ptr a)) + -> (Maybe a -> IO (Ptr a)) maybeNew = maybe (return nullPtr) -- |Converts a @withXXX@ combinator into one marshalling a value wrapped -- into a 'Maybe', using 'nullPtr' to represent 'Nothing'. -- maybeWith :: ( a -> (Ptr b -> IO c) -> IO c) - -> (Maybe a -> (Ptr b -> IO c) -> IO c) + -> (Maybe a -> (Ptr b -> IO c) -> IO c) maybeWith = maybe ($ nullPtr) -- |Convert a peek combinator into a one returning 'Nothing' if applied to a @@ -134,7 +133,7 @@ maybeWith = maybe ($ nullPtr) -- maybePeek :: (Ptr a -> IO b) -> Ptr a -> IO (Maybe b) maybePeek peek ptr | ptr == nullPtr = return Nothing - | otherwise = do a <- peek ptr; return (Just a) + | otherwise = do a <- peek ptr; return (Just a) -- marshalling lists of storable objects @@ -144,12 +143,12 @@ maybePeek peek ptr | ptr == nullPtr = return Nothing -- marshalled objects -- withMany :: (a -> (b -> res) -> res) -- withXXX combinator for one object - -> [a] -- storable objects - -> ([b] -> res) -- action on list of marshalled obj.s - -> res + -> [a] -- storable objects + -> ([b] -> res) -- action on list of marshalled obj.s + -> res withMany _ [] f = f [] withMany withFoo (x:xs) f = withFoo x $ \x' -> - withMany withFoo xs (\xs' -> f (x':xs')) + withMany withFoo xs (\xs' -> f (x':xs')) -- Haskellish interface to memcpy and memmove @@ -159,13 +158,15 @@ withMany withFoo (x:xs) f = withFoo x $ \x' -> -- first (destination); the copied areas may /not/ overlap -- copyBytes :: Ptr a -> Ptr a -> Int -> IO () -copyBytes dest src size = memcpy dest src (fromIntegral size) +copyBytes dest src size = do _ <- memcpy dest src (fromIntegral size) + return () -- |Copies the given number of bytes from the second area (source) into the -- first (destination); the copied areas /may/ overlap -- moveBytes :: Ptr a -> Ptr a -> Int -> IO () -moveBytes dest src size = memmove dest src (fromIntegral size) +moveBytes dest src size = do _ <- memmove dest src (fromIntegral size) + return () -- auxilliary routines @@ -173,5 +174,5 @@ moveBytes dest src size = memmove dest src (fromIntegral size) -- |Basic C routines needed for memory copying -- -foreign import ccall unsafe "string.h" memcpy :: Ptr a -> Ptr a -> CSize -> IO () -foreign import ccall unsafe "string.h" memmove :: Ptr a -> Ptr a -> CSize -> IO () +foreign import ccall unsafe "string.h" memcpy :: Ptr a -> Ptr a -> CSize -> IO (Ptr a) +foreign import ccall unsafe "string.h" memmove :: Ptr a -> Ptr a -> CSize -> IO (Ptr a)