module CInfo (
CPrimType(..), size, alignment,
bitfieldDirection, bitfieldPadding, bitfieldIntSigned, bitfieldAlignment
) where
import Foreign.C
import C2HSConfig (Ptr, FunPtr,
bitfieldDirection, bitfieldPadding, bitfieldIntSigned,
bitfieldAlignment)
import qualified
C2HSConfig as Storable
(Storable(sizeOf, alignment))
data CPrimType = CPtrPT
| CFunPtrPT
| CCharPT
| CUCharPT
| CSCharPT
| CIntPT
| CShortPT
| CLongPT
| CLLongPT
| CUIntPT
| CUShortPT
| CULongPT
| CULLongPT
| CFloatPT
| CDoublePT
| CLDoublePT
| CSFieldPT Int
| CUFieldPT Int
deriving (CPrimType -> CPrimType -> Bool
(CPrimType -> CPrimType -> Bool)
-> (CPrimType -> CPrimType -> Bool) -> Eq CPrimType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CPrimType -> CPrimType -> Bool
$c/= :: CPrimType -> CPrimType -> Bool
== :: CPrimType -> CPrimType -> Bool
$c== :: CPrimType -> CPrimType -> Bool
Eq)
size :: CPrimType -> Int
size :: CPrimType -> Int
size CPtrPT = Ptr () -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (Ptr ()
forall a. HasCallStack => a
undefined :: Ptr ())
size CFunPtrPT = FunPtr () -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (FunPtr ()
forall a. HasCallStack => a
undefined :: FunPtr ())
size CCharPT = 1
size CUCharPT = 1
size CSCharPT = 1
size CIntPT = CInt -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CInt
forall a. HasCallStack => a
undefined :: CInt)
size CShortPT = CShort -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CShort
forall a. HasCallStack => a
undefined :: CShort)
size CLongPT = CLong -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CLong
forall a. HasCallStack => a
undefined :: CLong)
size CLLongPT = CLLong -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CLLong
forall a. HasCallStack => a
undefined :: CLLong)
size CUIntPT = CUInt -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CUInt
forall a. HasCallStack => a
undefined :: CUInt)
size CUShortPT = CUShort -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CUShort
forall a. HasCallStack => a
undefined :: CUShort)
size CULongPT = CULong -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CULong
forall a. HasCallStack => a
undefined :: CULong)
size CULLongPT = CLLong -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CLLong
forall a. HasCallStack => a
undefined :: CLLong)
size CFloatPT = CFloat -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CFloat
forall a. HasCallStack => a
undefined :: CFloat)
size CDoublePT = CDouble -> Int
forall a. Storable a => a -> Int
Storable.sizeOf (CDouble
forall a. HasCallStack => a
undefined :: CDouble)
size (CSFieldPT bs :: Int
bs) = -Int
bs
size (CUFieldPT bs :: Int
bs) = -Int
bs
alignment :: CPrimType -> Int
alignment :: CPrimType -> Int
alignment CPtrPT = Ptr () -> Int
forall a. Storable a => a -> Int
Storable.alignment (Ptr ()
forall a. HasCallStack => a
undefined :: Ptr ())
alignment CFunPtrPT = FunPtr () -> Int
forall a. Storable a => a -> Int
Storable.alignment (FunPtr ()
forall a. HasCallStack => a
undefined :: FunPtr ())
alignment CCharPT = 1
alignment CUCharPT = 1
alignment CSCharPT = 1
alignment CIntPT = CInt -> Int
forall a. Storable a => a -> Int
Storable.alignment (CInt
forall a. HasCallStack => a
undefined :: CInt)
alignment CShortPT = CShort -> Int
forall a. Storable a => a -> Int
Storable.alignment (CShort
forall a. HasCallStack => a
undefined :: CShort)
alignment CLongPT = CLong -> Int
forall a. Storable a => a -> Int
Storable.alignment (CLong
forall a. HasCallStack => a
undefined :: CLong)
alignment CLLongPT = CLLong -> Int
forall a. Storable a => a -> Int
Storable.alignment (CLLong
forall a. HasCallStack => a
undefined :: CLLong)
alignment CUIntPT = CUInt -> Int
forall a. Storable a => a -> Int
Storable.alignment (CUInt
forall a. HasCallStack => a
undefined :: CUInt)
alignment CUShortPT = CUShort -> Int
forall a. Storable a => a -> Int
Storable.alignment (CUShort
forall a. HasCallStack => a
undefined :: CUShort)
alignment CULongPT = CULong -> Int
forall a. Storable a => a -> Int
Storable.alignment (CULong
forall a. HasCallStack => a
undefined :: CULong)
alignment CULLongPT = CULLong -> Int
forall a. Storable a => a -> Int
Storable.alignment (CULLong
forall a. HasCallStack => a
undefined :: CULLong)
alignment CFloatPT = CFloat -> Int
forall a. Storable a => a -> Int
Storable.alignment (CFloat
forall a. HasCallStack => a
undefined :: CFloat)
alignment CDoublePT = CDouble -> Int
forall a. Storable a => a -> Int
Storable.alignment (CDouble
forall a. HasCallStack => a
undefined :: CDouble)
alignment (CSFieldPT bs :: Int
bs) = Int -> Int
fieldAlignment Int
bs
alignment (CUFieldPT bs :: Int
bs) = Int -> Int
fieldAlignment Int
bs
fieldAlignment :: Int -> Int
fieldAlignment :: Int -> Int
fieldAlignment 0 = - (CPrimType -> Int
size CPrimType
CIntPT Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)
fieldAlignment bs :: Int
bs | Bool
bitfieldPadding = - Int
bs
| Bool
otherwise = 0