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. Many thanks, Dominic. #define ICMP_ECHOREPLY 0 /* Echo Reply */ #define ICMP_DEST_UNREACH 3 /* Destination Unreachable */ #define ICMP_SOURCE_QUENCH 4 /* Source Quench */ #define ICMP_REDIRECT 5 /* Redirect (change route) */ #define ICMP_ECHO 8 /* Echo Request */ #define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */ #define ICMP_PARAMETERPROB 12 /* Parameter Problem */ #define ICMP_TIMESTAMP 13 /* Timestamp Request */ #define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */ #define ICMP_INFO_REQUEST 15 /* Information Request */ #define ICMP_INFO_REPLY 16 /* Information Reply */ #define ICMP_ADDRESS 17 /* Address Mask Request */ #define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */ #define NR_ICMP_TYPES 18
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
participants (2)
-
dominic.j.steinitzļ¼ britishairways.com -
Manuel M. T. Chakravarty