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 ()
+#ifdef __HUGS__
+ , finalizerFree -- :: FunPtr (Ptr a -> IO ())
+#endif
) where
import Data.Maybe
-import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.C.TypesISO ( CSize )
+import Foreign.Ptr ( Ptr, nullPtr, FunPtr )
+import Foreign.C.Types ( CSize, CInt(..) )
import Foreign.Storable ( Storable(sizeOf) )
#ifdef __GLASGOW_HASKELL__
import GHC.Ptr
import GHC.Err
import GHC.Base
+#elsif defined(__HUGS__)
+import Control.Exception ( bracket )
+#else
+import System.IO ( bracket )
#endif
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 "free" _free :: Ptr a -> IO ()
+foreign import ccall unsafe "stdlib.h malloc" _malloc :: CSize -> IO (Ptr a)
+foreign import ccall unsafe "stdlib.h realloc" _realloc :: Ptr a -> CSize -> IO (Ptr b)
+foreign import ccall unsafe "stdlib.h free" _free :: Ptr a -> IO ()
+#ifdef __HUGS__
+-- |A pointer to a foreign function equivalent to @free@, which may be used
+-- as a finalizer for storage allocated with @malloc@ or @mallocBytes@.
+foreign import ccall unsafe "stdlib.h &free"
+ finalizerFree :: FunPtr (Ptr a -> IO ())
+#endif