- If not, then how should enum values be declared in the FFI?
What you need to do is run a little autoconf-like program which constructs a program containing a suitable example, runs it through a C compiler and tells you what's going on.
hsc comes very close but I'm not certain if it does exactly what you need. If not, compiling and running this program should tell you:
Hmm, careful. The C compiler is free to be clever, and use a char if there are <=256 elements in the enum, and short or int otherwise. You want to know the size of your particular enum, not any random enum.
Yes. The C99 spec says (sec. 6.7.2.1): [#4] Each enumerated type shall be compatible with an integer type. The choice of type is implementation-defined but shall be capable of representing the values of all the members of the enumeration. [...] If a C compiler can choose any integer type, then it seems to me that mixing code from two C compilers on the same platform might not work. Hmmm. Anway, I think Alastair meant to say hsc2hs (not hsc), but you do actually get the right answer doing it this way. In hsc2hs if you say (#type enum foo) you'll get a Haskell type which corresponds to the actual type used by the C compiler (provided hsc2hs is using the same C compiler as was used to compile the library, presumably). Cheers, Simon