0544486a69a299ce2ee059164b01cdc16ed6707e
[ghc-base.git] / Foreign / Ptr.hs
1 {-# OPTIONS -fno-implicit-prelude #-}
2 -----------------------------------------------------------------------------
3 -- |
4 -- Module      :  Foreign.Ptr
5 -- Copyright   :  (c) The FFI task force 2001
6 -- License     :  BSD-style (see the file libraries/core/LICENSE)
7 -- 
8 -- Maintainer  :  ffi@haskell.org
9 -- Stability   :  provisional
10 -- Portability :  portable
11 --
12 -- Pointer types.
13 --
14 -----------------------------------------------------------------------------
15
16 module Foreign.Ptr (
17     --------------------------------------------------------------------
18     -- Data pointers.
19     
20     Ptr(..),      -- data Ptr a
21     nullPtr,      -- :: Ptr a
22     castPtr,      -- :: Ptr a -> Ptr b
23     plusPtr,      -- :: Ptr a -> Int -> Ptr b
24     alignPtr,     -- :: Ptr a -> Int -> Ptr a
25     minusPtr,     -- :: Ptr a -> Ptr b -> Int
26     
27     --------------------------------------------------------------------
28     -- Function pointers.
29     
30     FunPtr(..),      -- data FunPtr a
31     nullFunPtr,      -- :: FunPtr a
32     castFunPtr,      -- :: FunPtr a -> FunPtr b
33     castFunPtrToPtr, -- :: FunPtr a -> Ptr b
34     castPtrToFunPtr, -- :: Ptr a -> FunPtr b
35     
36     freeHaskellFunPtr, -- :: FunPtr a -> IO ()
37     -- Free the function pointer created by foreign export dynamic.
38
39  ) where
40
41 #ifdef __GLASGOW_HASKELL__
42 import GHC.Ptr
43 import GHC.IOBase
44 import GHC.Err
45 import GHC.Base
46 import GHC.Num
47 import GHC.List
48 import GHC.Show
49 import Numeric
50 #endif
51
52 #include "MachDeps.h"
53
54 #ifdef __GLASGOW_HASKELL__
55 #if (WORD_SIZE_IN_BITS == 32 || WORD_SIZE_IN_BITS == 64)
56 instance Show (Ptr a) where
57    showsPrec p (Ptr a) rs = pad_out (showHex (word2Integer(int2Word#(addr2Int# a))) "") rs
58      where
59         -- want 0s prefixed to pad it out to a fixed length.
60        pad_out ('0':'x':ls) rs = 
61           '0':'x':(replicate (2*SIZEOF_HSPTR - length ls) '0') ++ ls ++ rs
62        -- word2Integer :: Word# -> Integer (stolen from Word.lhs)
63        word2Integer w = case word2Integer# w of
64                         (# s, d #) -> J# s d
65 #endif
66 #endif
67
68 foreign import ccall unsafe "freeHaskellFunctionPtr"
69     freeHaskellFunPtr :: FunPtr a -> IO ()