
#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