X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=Foreign%2FC%2FTypes.hs;h=5d896ea133f5fbdd93fe2c4b14e11983a9e7bd6e;hb=b21d4af465d575d0072ddf97e178e0e9545f77ba;hp=744d448428a60137c992cf96f853ccf78be4d6a4;hpb=5545727d5a6a1fc6d5d00f32a92a8fdf0fb7ca77;p=ghc-base.git diff --git a/Foreign/C/Types.hs b/Foreign/C/Types.hs index 744d448..5d896ea 100644 --- a/Foreign/C/Types.hs +++ b/Foreign/C/Types.hs @@ -1,36 +1,68 @@ {-# OPTIONS -fno-implicit-prelude #-} ----------------------------------------------------------------------------- --- +-- | -- Module : Foreign.C.Types -- Copyright : (c) The FFI task force 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : ffi@haskell.org -- Stability : provisional -- Portability : portable -- --- $Id: Types.hs,v 1.2 2001/07/03 11:37:50 simonmar Exp $ --- --- Mapping of C types to corresponding Haskell types. A cool hack... +-- Mapping of C types to corresponding Haskell types. -- ----------------------------------------------------------------------------- module Foreign.C.Types +#ifndef __NHC__ ( -- 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(..) + CChar, CSChar, CUChar + , CShort, CUShort, CInt, CUInt + , CLong, CULong + , CPtrdiff, CSize, CWchar, CSigAtomic + , CLLong, CULLong + -- Numeric types, instances of: Eq, Ord, Num, Read, Show, Enum, + -- Typeable, Storable + , CClock, CTime -- Floating types, instances of: Eq, Ord, Num, Read, Show, Enum, - -- Typeable, Storable, Real, Fractional, Floating, RealFrac, RealFloat + -- Typeable, Storable, Real, Fractional, Floating, RealFrac, + -- RealFloat + , CFloat, CDouble, CLDouble +#else + ( -- Exported non-abstractly in nhc98 to fix an interface file problem. + CChar(..), CSChar(..), CUChar(..) + , CShort(..), CUShort(..), CInt(..), CUInt(..) + , CLong(..), CULong(..) + , CPtrdiff(..), CSize(..), CWchar(..), CSigAtomic(..) + , CLLong(..), CULLong(..) + , CClock(..), CTime(..) , CFloat(..), CDouble(..), CLDouble(..) +#endif + + -- Instances of: Eq and Storable + , CFile, CFpos, CJmpBuf ) where +#ifdef __NHC__ +import NHC.FFI + ( CChar(..), CSChar(..), CUChar(..) + , CShort(..), CUShort(..), CInt(..), CUInt(..) + , CLong(..), CULong(..), CLLong(..), CULLong(..) + , CPtrdiff(..), CSize(..), CWchar(..), CSigAtomic(..) + , CClock(..), CTime(..) + , CFloat(..), CDouble(..), CLDouble(..) + , CFile, CFpos, CJmpBuf + , Storable(..) + ) +#else + +import Foreign.Storable import Data.Bits ( Bits(..) ) import Data.Int ( Int8, Int16, Int32, Int64 ) import Data.Word ( Word8, Word16, Word32, Word64 ) -import Data.Dynamic +import Data.Typeable #ifdef __GLASGOW_HASKELL__ import GHC.Base @@ -40,8 +72,12 @@ import GHC.Real import GHC.Show import GHC.Read import GHC.Num +#else +import Control.Monad +import Foreign.Ptr #endif +#include "Typeable.h" #include "CTypes.h" INTEGRAL_TYPE(CChar,tyConCChar,"CChar",HTYPE_CHAR) @@ -91,24 +127,32 @@ FLOATING_TYPE(CDouble,tyConCDouble,"CDouble",HTYPE_DOUBLE) -- HACK: Currently no long double in the FFI, so we simply re-use double FLOATING_TYPE(CLDouble,tyConCLDouble,"CLDouble",HTYPE_DOUBLE) +INTEGRAL_TYPE(CPtrdiff,tyConCPtrdiff,"CPtrdiff",HTYPE_PTRDIFF_T) +INTEGRAL_TYPE(CSize,tyConCSize,"CSize",HTYPE_SIZE_T) +INTEGRAL_TYPE(CWchar,tyConCWchar,"CWchar",HTYPE_WCHAR_T) +INTEGRAL_TYPE(CSigAtomic,tyConCSigAtomic,"CSigAtomic",HTYPE_SIG_ATOMIC_T) -#include "Dynamic.h" -INSTANCE_TYPEABLE0(CChar,cCharTc,"CChar") -INSTANCE_TYPEABLE0(CSChar,cSCharTc,"CSChar") -INSTANCE_TYPEABLE0(CUChar,cUCharTc,"CUChar") - -INSTANCE_TYPEABLE0(CShort,cShortTc,"CShort") -INSTANCE_TYPEABLE0(CUShort,cUShortTc,"CUShort") +{-# RULES +"fromIntegral/a->CPtrdiff" fromIntegral = \x -> CPtrdiff (fromIntegral x) +"fromIntegral/a->CSize" fromIntegral = \x -> CSize (fromIntegral x) +"fromIntegral/a->CWchar" fromIntegral = \x -> CWchar (fromIntegral x) +"fromIntegral/a->CSigAtomic" fromIntegral = \x -> CSigAtomic (fromIntegral x) + +"fromIntegral/CPtrdiff->a" fromIntegral = \(CPtrdiff x) -> fromIntegral x +"fromIntegral/CSize->a" fromIntegral = \(CSize x) -> fromIntegral x +"fromIntegral/CWchar->a" fromIntegral = \(CWchar x) -> fromIntegral x +"fromIntegral/CSigAtomic->a" fromIntegral = \(CSigAtomic x) -> fromIntegral x + #-} -INSTANCE_TYPEABLE0(CInt,cIntTc,"CInt") -INSTANCE_TYPEABLE0(CUInt,cUIntTc,"CUInt") +INTEGRAL_TYPE(CClock,tyConCClock,"CClock",HTYPE_CLOCK_T) +INTEGRAL_TYPE(CTime,tyConCTime,"CTime",HTYPE_TIME_T) -INSTANCE_TYPEABLE0(CLong,cLongTc,"CLong") -INSTANCE_TYPEABLE0(CULong,cULongTc,"CULong") +-- FIXME: Implement and provide instances for Eq and Storable +data CFile = CFile +data CFpos = CFpos +data CJmpBuf = CJmpBuf -INSTANCE_TYPEABLE0(CLLong,cLLongTc,"CLLong") -INSTANCE_TYPEABLE0(CULLong,cULLongTc,"CULLong") +-- C99 types which are still missing include: +-- intptr_t, uintptr_t, intmax_t, uintmax_t, wint_t, wctrans_t, wctype_t -INSTANCE_TYPEABLE0(CFloat,cFloatTc,"CFloat") -INSTANCE_TYPEABLE0(CDouble,cDoubleTc,"CDouble") -INSTANCE_TYPEABLE0(CLDouble,cLDoubleTc,"CLDouble") +#endif