C Header File Conversion

Manuel M. T. Chakravarty chak@cse.unsw.edu.au
Sun, 05 May 2002 07:09:58 +1000


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