[C2hs] [c2hs] #38: Need to think how to bind C enums with aliases

c2hs cvs-ghc at haskell.org
Fri Aug 26 11:01:18 CEST 2011


#38: Need to think how to bind C enums with aliases
-------------------------+--------------------------------------------------
 Reporter:  duncan       |       Owner:        
     Type:  enhancement  |      Status:  new   
 Priority:  normal       |   Milestone:        
Component:  general      |     Version:  0.16.0
 Keywords:               |  
-------------------------+--------------------------------------------------
 Consider this C enum:
 {{{
 typedef enum
 {
   GTK_ANCHOR_CENTER,
   GTK_ANCHOR_NORTH,
   GTK_ANCHOR_NORTH_WEST,
   GTK_ANCHOR_NORTH_EAST,
   GTK_ANCHOR_SOUTH,
   GTK_ANCHOR_SOUTH_WEST,
   GTK_ANCHOR_SOUTH_EAST,
   GTK_ANCHOR_WEST,
   GTK_ANCHOR_EAST,
   GTK_ANCHOR_N          = GTK_ANCHOR_NORTH,
   GTK_ANCHOR_NW         = GTK_ANCHOR_NORTH_WEST,
   GTK_ANCHOR_NE         = GTK_ANCHOR_NORTH_EAST,
   GTK_ANCHOR_S          = GTK_ANCHOR_SOUTH,
   GTK_ANCHOR_SW         = GTK_ANCHOR_SOUTH_WEST,
   GTK_ANCHOR_SE         = GTK_ANCHOR_SOUTH_EAST,
   GTK_ANCHOR_W          = GTK_ANCHOR_WEST,
   GTK_ANCHOR_E          = GTK_ANCHOR_EAST
 } GtkAnchorType;
 }}}

 Of course in C, enums are really ints, so it's ok to have aliases. It is
 the case that `GTK_ANCHOR_E = GTK_ANCHOR_EAST` since both enum names have
 the int value 9.

 Currently c2hs binds this as:
 {{{
 data GtkAnchorType = GtkAnchorCenter
                    | GtkAnchorNorth
                    | GtkAnchorNorthWest
                    | GtkAnchorNorthEast
                    | GtkAnchorSouth
                    | GtkAnchorSouthWest
                    | GtkAnchorSouthEast
                    | GtkAnchorWest
                    | GtkAnchorEast
                    | GtkAnchorN
                    | GtkAnchorNw
                    | GtkAnchorNe
                    | GtkAnchorS
                    | GtkAnchorSw
                    | GtkAnchorSe
                    | GtkAnchorW
                    | GtkAnchorE
                    deriving (Eq,Show)

 instance Enum GtkAnchorType where
   fromEnum GtkAnchorCenter = 0
   fromEnum GtkAnchorNorth = 1
   fromEnum GtkAnchorNorthWest = 2
   fromEnum GtkAnchorNorthEast = 3
   fromEnum GtkAnchorSouth = 4
   fromEnum GtkAnchorSouthWest = 5
   fromEnum GtkAnchorSouthEast = 6
   fromEnum GtkAnchorWest = 7
   fromEnum GtkAnchorEast = 8
   fromEnum GtkAnchorN = 1
   fromEnum GtkAnchorNw = 2
   fromEnum GtkAnchorNe = 3
   fromEnum GtkAnchorS = 4
   fromEnum GtkAnchorSw = 5
   fromEnum GtkAnchorSe = 6
   fromEnum GtkAnchorW = 7
   fromEnum GtkAnchorE = 8

   toEnum 0 = GtkAnchorCenter
   toEnum 1 = GtkAnchorNorth
   toEnum 2 = GtkAnchorNorthWest
   toEnum 3 = GtkAnchorNorthEast
   toEnum 4 = GtkAnchorSouth
   toEnum 5 = GtkAnchorSouthWest
   toEnum 6 = GtkAnchorSouthEast
   toEnum 7 = GtkAnchorWest
   toEnum 8 = GtkAnchorEast
   toEnum 1 = GtkAnchorN
   toEnum 2 = GtkAnchorNw
   toEnum 3 = GtkAnchorNe
   toEnum 4 = GtkAnchorS
   toEnum 5 = GtkAnchorSw
   toEnum 6 = GtkAnchorSe
   toEnum 7 = GtkAnchorW
   toEnum 8 = GtkAnchorE
   toEnum unmatched = error ("GtkAnchorType.toEnum: Cannot match " ++ show
 unmatched)
 }}}

 Note in particular that the `toEnum` has overlaps. It's also obviously not
 the case in Haskell that `GtkAnchorE = GtkAnchorEast`. Perhaps we should
 ignore aliases, that is pretend that the enum values `GTK_ANCHOR_E` etc
 are simply not present.

-- 
Ticket URL: <http://hackage.haskell.org/trac/c2hs/ticket/38>
c2hs <http://www.cse.unsw.edu.au/~chak/haskell/c2hs/>
C->Haskell, An Interface Generator for Haskell



More information about the C2hs mailing list