dominic.j.steinitz@britishairways.com wrote,
I need to use values that are kept in a C header file - see below for an extract of the header file. What I'd like to be able to say is
import Word import Bits
data ICMPType = EchoReply | ICMPType1 | ICMPType2 | DestUnreach | SourceQuench ... deriving Enum
encode :: ICMPType -> Word8 encode x = fromIntegral (fromEnum x)
Is this a sensible approach? Are there any tools that could help? C->Haskell and HaskellDirect look possibilities but I'd welcome advice before I try and install them.
Regarding C->Haskell, conversion of C enumerations into Haskell type definitions is what enum hooks are for, BUT doing this fully automatically from #define'd enumerations is not yet implemented. Thus, you would have to define (in a C header) enum ICMPType { ECHOREPLY = ICMP_ECHOREPLY, ICMPType1 = 1, /* you can leave these two off and c2hs */ ICMPType2 = 2, /* will still generate the right Enum instance */ DEST_UNREACH = ICMP_DEST_UNREACH, ... }; Then, the binding hooks {#enum ICMPType {underscoreToCase}#} would exactly do what you want. I plan to extend C->Haskell so that you don't have to write the C enum declaration manually, but you will, then, have to list the names of the enumeration values in the binding module. But this extension will only be after the next binary release of c2hs. Cheers, Manuel