content: {-# LANGUAGE ForeignFunctionInterface #-}
  {- | The pointers exported and used by the C libffi describing basic ffi types. -}
  module Foreign.LibFFI.FFITypes where
  
  import Data.Int
  import Data.Word
  import Foreign.C.Types
  import Foreign.Ptr
  import Foreign.Storable
  
  import Foreign.LibFFI.Internal
  
  foreign import ccall unsafe "&" ffi_type_void :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_sint8 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_uint8 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_uint16 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_sint16 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_uint32 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_sint32 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_uint64 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_sint64 :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_float  :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_double :: Ptr CType
  foreign import ccall unsafe "&" ffi_type_pointer :: Ptr CType
  
  ffi_type_uchar  :: Ptr CType
  ffi_type_uchar  = ffi_type_uint8
  
  ffi_type_schar  :: Ptr CType
  ffi_type_schar  = ffi_type_sint8
  
  ffi_type_wchar  :: Ptr CType
  ffi_type_wchar  = case sizeOf (undefined :: CWchar) of
                      2   -> ffi_type_sint16
                      4   -> ffi_type_sint32
                      8   -> ffi_type_sint64
                      _   -> error "ffi_type_wchar of unsupported size"
  
  ffi_type_size   :: Ptr CType
  ffi_type_size   = case sizeOf (undefined :: CSize) of
                      4   -> ffi_type_uint32
                      8   -> ffi_type_uint64
                      _   -> error "ffi_type_size of unsupported size"
  
  ffi_type_time   :: Ptr CType
  ffi_type_time   = case sizeOf (undefined :: CTime) of
                      4   -> ffi_type_sint32
                      8   -> ffi_type_sint64
                      _   -> error "ffi_type_time of unsupported size"
  
  ffi_type_uint   :: Ptr CType
  ffi_type_uint   = case sizeOf (undefined :: CUInt) of
                      4   -> ffi_type_uint32
                      8   -> ffi_type_uint64
                      _   -> error "ffi_type_uint of unsupported size"
  
  ffi_type_sint   :: Ptr CType
  ffi_type_sint   = case sizeOf (undefined :: CInt) of
                      4   -> ffi_type_sint32
                      8   -> ffi_type_sint64
                      _   -> error "ffi_type_sint of unsupported size"
  
  ffi_type_ulong  :: Ptr CType
  ffi_type_ulong  = case sizeOf (undefined :: CULong) of
                      4   -> ffi_type_uint32
                      8   -> ffi_type_uint64
                      _   -> error "ffi_type_ulong of unsupported size"
  
  ffi_type_slong  :: Ptr CType
  ffi_type_slong  = case sizeOf (undefined :: CLong) of
                      4   -> ffi_type_sint32
                      8   -> ffi_type_sint64
                      _   -> error "ffi_type_slong of unsupported size"
  
  ffi_type_hs_int :: Ptr CType
  ffi_type_hs_int = case sizeOf (undefined :: Int) of
                      4   -> ffi_type_sint32
                      8   -> ffi_type_sint64
                      _   -> error "ffi_type_hs_int: unsupported sizeOf (_ :: Int)"
  
  ffi_type_hs_word :: Ptr CType
  ffi_type_hs_word = case sizeOf (undefined :: Word) of
                      4   -> ffi_type_uint32
                      8   -> ffi_type_uint64
                      _   -> error "ffi_type_hs_word: unsupported sizeOf (_ :: Word)"
  