[project @ 1997-11-18 10:41:40 by simonm]
[ghc-hetmet.git] / ghc / lib / glaExts / Addr.lhs
index a634094..91056ee 100644 (file)
@@ -8,7 +8,9 @@
 {-# OPTIONS -fno-implicit-prelude #-}
 
 module Addr (
-       Addr(..), -- ToDo: nullAddr,
+       Addr(..), 
+       nullAddr,                       -- :: Addr
+       plusAddr,                       -- :: Addr -> Int -> Addr
    ) where
 
 import GHC
@@ -18,14 +20,62 @@ import CCall
 \end{code}
 
 \begin{code}
-data Addr = A# Addr#   deriving (Eq, Ord) -- Glasgow extension
+data Addr = A# Addr#   deriving (Eq, Ord)
 
 nullAddr = ``NULL'' :: Addr
 
+plusAddr :: Addr -> Int -> Addr
+plusAddr (A# addr) (I# off) = A# (int2Addr# (addr2Int# addr +# off))
+
 instance CCallable Addr
 instance CCallable Addr#
 instance CReturnable Addr
 \end{code}
 
+ToDo:
+
+-- read value out of _immutable_ memory
+      indexCharOffAddr   :: Addr -> Int -> Char
+      indexIntOffAddr    :: Addr -> Int -> Int     -- should we drop this?
+      indexAddrOffAddr   :: Addr -> Int -> Addr
+      indexFloatOffAddr  :: Addr -> Int -> Float
+      indexDoubleOffAddr :: Addr -> Int -> Double
+      indexWord8OffAddr  :: Addr -> Int -> Word8
+      indexWord16OffAddr :: Addr -> Int -> Word16
+      indexWord32OffAddr :: Addr -> Int -> Word32
+      indexWord64OffAddr :: Addr -> Int -> Word64
+      indexInt8OffAddr   :: Addr -> Int -> Int8
+      indexInt16OffAddr  :: Addr -> Int -> Int16
+      indexInt32OffAddr  :: Addr -> Int -> Int32
+      indexInt64OffAddr  :: Addr -> Int -> Int64
+
+      -- read value out of mutable memory
+      readCharOffAddr    :: Addr -> Int -> IO Char
+      readIntOffAddr     :: Addr -> Int -> IO Int  -- should we drop this?
+      readAddrOffAddr    :: Addr -> Int -> IO Addr
+      readFloatOffAddr   :: Addr -> Int -> IO Float
+      readDoubleOffAddr  :: Addr -> Int -> IO Double
+      readWord8OffAddr   :: Addr -> Int -> IO Word8
+      readWord16OffAddr  :: Addr -> Int -> IO Word16
+      readWord32OffAddr  :: Addr -> Int -> IO Word32
+      readWord64OffAddr  :: Addr -> Int -> IO Word64
+      readInt8OffAddr    :: Addr -> Int -> IO Int8
+      readInt16OffAddr   :: Addr -> Int -> IO Int16
+      readInt32OffAddr   :: Addr -> Int -> IO Int32
+      readInt64OffAddr   :: Addr -> Int -> IO Int64
 
+      -- write value into mutable memory
+      writeCharOffAddr   :: Addr -> Int -> Char   -> IO ()
+      writeIntOffAddr    :: Addr -> Int -> Int    -> IO ()  -- should we drop this?
+      writeAddrOffAddr   :: Addr -> Int -> Addr   -> IO ()
+      writeFloatOffAddr  :: Addr -> Int -> Float  -> IO ()
+      writeDoubleOffAddr :: Addr -> Int -> Double -> IO ()
+      writeWord8OffAddr  :: Addr -> Int -> Word8  -> IO ()
+      writeWord16OffAddr :: Addr -> Int -> Word16 -> IO ()
+      writeWord32OffAddr :: Addr -> Int -> Word32 -> IO ()
+      writeWord64OffAddr :: Addr -> Int -> Word64 -> IO ()
+      writeInt8OffAddr   :: Addr -> Int -> Int8   -> IO ()
+      writeInt16OffAddr  :: Addr -> Int -> Int16  -> IO ()
+      writeInt32OffAddr  :: Addr -> Int -> Int32  -> IO ()
+      writeInt64OffAddr  :: Addr -> Int -> Int64  -> IO ()