1module Main where
2
3import Control.Monad (liftM, when)
4import Foreign.C
5
6main = do
7  size
8  alignment
9
10size = do
11  let sz1 = {# sizeof S1 #}
12  sz1expect <- liftM fromIntegral {# call size_of_s1 #}
13  let sz2 = {# sizeof S2 #}
14  sz2expect <- liftM fromIntegral {# call size_of_s2 #}
15  -- small bitfield in struct gets wrong size, should be sizeof int, c2hs gets 1
16  -- http://hackage.haskell.org/trac/c2hs/ticket/10
17  let sz3 = {# sizeof S3 #}
18  sz3expect <- liftM fromIntegral {# call size_of_s3 #}
19  let sz4 = {# sizeof S4 #}
20  sz4expect <- liftM fromIntegral {# call size_of_s4 #}
21
22  putStrLn $ show sz1 ++ " & "
23          ++ show sz2 ++ " & "
24          ++ show sz3 ++ " & "
25          ++ show sz4
26
27  when (sz1 /= sz1expect) $ fail "Fatal: sizeof s1 != size_of_s1()"
28  when (sz2 /= sz2expect) $ fail "Fatal: sizeof s2 != size_of_s2()"
29  when (sz3 /= sz3expect) $ fail $ "Fatal: sizeof s3 != size_of_s3(): " ++ show sz3 ++ " but expected " ++ show sz3expect
30  when (sz4 /= sz4expect) $ fail $ "Fatal: sizeof s4 != size_of_s4(): " ++ show sz4 ++ " but expected " ++ show sz4expect
31
32alignment = do
33  let al1 = {# alignof S1 #}
34  al1expect <- liftM fromIntegral {# call align_of_s1 #}
35  let al2 = {# alignof S2 #}
36  al2expect <- liftM fromIntegral {# call align_of_s2 #}
37  let al3 = {# alignof S3 #}
38  al3expect <- liftM fromIntegral {# call align_of_s3 #}
39  let al4 = {# alignof S4 #}
40  al4expect <- liftM fromIntegral {# call align_of_s4 #}
41
42  putStrLn $ show al1 ++ " & "
43          ++ show al2 ++ " & "
44          ++ show al3 ++ " & "
45          ++ show al4
46
47  when (al1 /= al1expect) $ fail "Fatal: alignment s1 != align_of_s1()"
48  when (al2 /= al2expect) $ fail "Fatal: alignment s2 != align_of_s2()"
49  when (al3 /= al3expect) $ fail $ "Fatal: alignment s3 != align_of_s3(): " ++ show al3 ++ " but expected " ++ show al3expect
50  when (al4 /= al4expect) $ fail $ "Fatal: alignment s4 != align_of_s4(): " ++ show al4 ++ " but expected " ++ show al4expect
51