Marshalling C unions

Nabil Alsharif blit32 at gmail.com
Wed Apr 13 19:29:39 CEST 2011


Hi everybody,

I know this sounds like an issue many have faced before me, but good old 
google didn't come up with any helpful results. The basic problem is 
that I need to marshal a union so I can pass it to a C function via FFI. 
So to make sure I have my head wrapped around this correctly, say I have 
a union like so:
typedef union {
     int i;
     char c;
} my_union;

This would typically be represented in Haskell as:
data myUnion = I CInt | C CChar

My question is how would you marshall (define an Storable instance for) 
myUnion into my_union? It's my understanding that an instance my_union 
would take up sizeof(int) bytes in memory, i.e. the size of it's largest 
member. So to store this we would write something along the lines of:
instance Storable myUnion where
     size _ = #{size my_union} -- <-- hsc2hs shortcut
     alignment _ = alignment undefined::CInt -- <-- What should this 
really be?
     peek ptr = do -- <-- How are you supposed to know which element to 
extract?
     poke ptr (I i) =  poke ptr i -- <-- Or should this be #{poke 
my_union, i} ptr i ?
     poke ptr (C c) = poke ptr c

I hope this clear. I appreciate all the help. If this question has 
already been answered, which I'm sure it has, please point me to right 
spot. Thanks again for everyone's time.

Nabil Alsharif.



More information about the FFI mailing list