alloca, -- :: Storable a => (Ptr a -> IO b) -> IO b
allocaBytes, -- :: Int -> (Ptr a -> IO b) -> IO b
- reallocBytes, -- :: Ptr a -> Int -> IO (Ptr a)
+ realloc, -- :: Storable b => Ptr a -> IO (Ptr b)
+ reallocBytes, -- :: Ptr a -> Int -> IO (Ptr a)
free -- :: Ptr a -> IO ()
) where
allocaBytes size = bracket (mallocBytes size) free
#endif
+-- |Adjust a malloc\'ed storage area to the given size of the required type
+-- (corresponds to C\'s @realloc()@).
+--
+realloc :: Storable b => Ptr a -> IO (Ptr b)
+realloc = doRealloc undefined
+ where
+ doRealloc :: Storable b => b -> Ptr a -> IO (Ptr b)
+ doRealloc dummy ptr = let
+ size = fromIntegral (sizeOf dummy)
+ in
+ failWhenNULL "realloc" (_realloc ptr size)
+
-- |Adjust a malloc\'ed storage area to the given size (equivalent to
-- C\'s @realloc()@).
--
-- basic C routines needed for memory allocation
--
foreign import ccall unsafe "malloc" _malloc :: CSize -> IO (Ptr a)
-foreign import ccall unsafe "realloc" _realloc :: Ptr a -> CSize -> IO (Ptr a)
+foreign import ccall unsafe "realloc" _realloc :: Ptr a -> CSize -> IO (Ptr b)
foreign import ccall unsafe "free" _free :: Ptr a -> IO ()
-- ** Combined allocation and marshalling
--
- withObject, -- :: Storable a => a -> (Ptr a -> IO b) -> IO b
- {- FIXME: should be `with' -}
+ with, -- :: Storable a => a -> (Ptr a -> IO b) -> IO b
new, -- :: Storable a => a -> IO (Ptr a)
-- ** Marshalling of Boolean values (non-zero corresponds to 'True')
withMany, -- :: (a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
-- ** Haskellish interface to memcpy and memmove
-
-- | (argument order: destination, source)
+ --
copyBytes, -- :: Ptr a -> Ptr a -> Int -> IO ()
- moveBytes -- :: Ptr a -> Ptr a -> Int -> IO ()
+ moveBytes, -- :: Ptr a -> Ptr a -> Int -> IO ()
+
+ -- ** DEPRECATED FUNCTIONS (don\'t use; they may disappear at any time)
+ --
+ withObject -- :: Storable a => a -> (Ptr a -> IO b) -> IO b
) where
import Data.Maybe
--
-- * see the life time constraints imposed by 'alloca'
--
-{- FIXME: should be called `with' -}
-withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
-withObject val f =
+with :: Storable a => a -> (Ptr a -> IO b) -> IO b
+with val f =
alloca $ \ptr -> do
poke ptr val
res <- f ptr
return res
+-- old DEPRECATED name (don't use; may disappear at any time)
+--
+withObject :: Storable a => a -> (Ptr a -> IO b) -> IO b
+{-# DEPRECATED withObject "use `with' instead" #-}
+withObject = with
+
-- marshalling of Boolean values (non-zero corresponds to 'True')
-- -----------------------------