1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
module Main where
import Foreign
import Foreign.C
#include "issue22.h"
{#pointer *struct_t as Struct#}
{#pointer *substruct_t as SubStruct#}
ptrToField :: Struct -> Ptr CChar
ptrToField p = p `plusPtr` {#offsetof struct_t->somefield#}
ptrToMember :: Struct -> SubStruct
ptrToMember p = p `plusPtr` {#offsetof struct_t->substruct#}
ptrToMemberPtr :: Struct -> Ptr SubStruct
ptrToMemberPtr p = p `plusPtr` {#offsetof struct_t->substruct_p#}
{#fun foo {`Int'} -> `Struct' return* #}
main :: IO ()
main = do
p <- foo 2
let fldp = ptrToField p
subp = ptrToMember p
subpp <- peek $ ptrToMemberPtr p
s <- peekCString fldp
subval <- {#get substruct_t.field#} subp
subpval <- {#get substruct_t.field#} subpp
putStrLn s
print subval
print subpval
|