
On Thu, Nov 20, 2008 at 11:26 AM, Mauricio
(...) But the major advantage of hsc2hs is that if your C struct changes or you use a different C compiler, the allignment and size as well as the offsets used in peek and poke will still be correct since the compiler will calculate it for you. (...)
And you wanted to write a storable instance. With hsc2hs you would write it like this: (...)
Thanks! This is actually a really nice tutorial! Do you mind if I try to find a place for it in the wiki?
Go right ahead(*). Of course if you put that in, you should note that the #{alignment foo} syntax is not currently built-in to hsc2hs. You have to add the following line to your haskell source file to add the alignment syntax: #let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) For completeness I should note that if you had a string field (e.g. struct { char c_string_field[MAX_LEN]; }) you would have to do it a little different. For example in peek: peek ptr = do s <- peekCString $ #{ptr c_type,c_string_field} ptr return (Foo s) Then in poke you would do: poke ptr (Foo s) = do withCStringLen (take maxLen value) $ uncurry (copyArray $ #{ptr c_type,c_string_field} ptr) where maxLen = #{const MAX_LEN} Note the use of #{ptr} instead of #{peek} since we want the address of the c_string_field rather than it's value. Unfortunately for the "struct { char *c_string_field; }" style there is no good general solution because you have to worry about allocating memory to have c_string_field point to. I'll leave figuring out #{enum}, but it can also be quite helpful in translating C enums/defines into Haskell. Michael D. Adams (*) For the lawyers: I hereby place that and these code snippet in the public domain or the nearest legal equivalent for those countries that don't have a legal concept of public domain.