[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