{-# OPTIONS_COMPILE -cpp #-} module NHC.FFI ( -- Integral types, instances of: Eq, Ord, Num, Read, Show, Enum, -- Typeable, Storable, Bounded, Real, Integral, Bits CChar(..), CSChar(..), CUChar(..) , CShort(..), CUShort(..), CInt(..), CUInt(..) , CLong(..), CULong(..), CLLong(..), CULLong(..) -- Floating types, instances of: Eq, Ord, Num, Read, Show, Enum, -- Typeable, Storable, Real, Fractional, Floating, RealFrac, RealFloat , CFloat(..), CDouble(..), CLDouble(..) ) where import NonStdUnsafeCoerce import Int ( Int8, Int16, Int32, Int64 ) import Word ( Word8, Word16, Word32, Word64 ) import Storable ( Storable(..) ) -- import Data.Bits( Bits(..) ) -- import NHC.SizedTypes import Monad ( liftM ) import Ptr ( castPtr ) #include "CTypes.h" INTEGRAL_TYPE(CChar,Int8) INTEGRAL_TYPE(CSChar,Int8) INTEGRAL_TYPE(CUChar,Word8) INTEGRAL_TYPE(CShort,Int16) INTEGRAL_TYPE(CUShort,Word16) INTEGRAL_TYPE(CInt,Int) INTEGRAL_TYPE(CUInt,Word32) INTEGRAL_TYPE(CLong,Int32) INTEGRAL_TYPE(CULong,Word32) INTEGRAL_TYPE(CLLong,Int64) INTEGRAL_TYPE(CULLong,Word64) FLOATING_TYPE(CFloat,Float) FLOATING_TYPE(CDouble,Double) -- HACK: Currently no long double in the FFI, so we simply re-use double FLOATING_TYPE(CLDouble,Double)