[project @ 2002-10-11 11:05:20 by malcolm]
[ghc-base.git] / Foreign / Marshal / Alloc.hs
index e5c3aa3..900c917 100644 (file)
@@ -21,14 +21,18 @@ module Foreign.Marshal.Alloc (
   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__
@@ -38,6 +42,10 @@ import GHC.Real
 import GHC.Ptr
 import GHC.Err
 import GHC.Base
+#elsif defined(__HUGS__)
+import Control.Exception       ( bracket )
+#else
+import System.IO               ( bracket )
 #endif
 
 
@@ -93,6 +101,18 @@ allocaBytes      :: Int -> (Ptr a -> IO b) -> IO b
 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()@).
 --
@@ -127,6 +147,12 @@ failWhenNULL name f = do
 
 -- 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