Interfacing met structs en anonieme vakbonden met c2hs

Hoe zou je dit stuk C-code in een .chs-bestand kunnen coderen, zodat c2hs het kan omzetten in iets relatief moois?

typedef enum {
    MONOME_BUTTON_UP        = 0x00,
    MONOME_BUTTON_DOWN      = 0x01,
    MONOME_ENCODER_DELTA    = 0x02,
    MONOME_ENCODER_KEY_UP   = 0x03,
    MONOME_ENCODER_KEY_DOWN = 0x04,
    MONOME_TILT             = 0x05,
    /* update this if you add event types */
    MONOME_EVENT_MAX        = 0x06
} monome_event_type_t;
typedef struct monome monome_t; /* opaque data type */
typedef struct monome_event monome_event_t;
typedef void (*monome_event_callback_t)
    (const monome_event_t *event, void *data);
struct monome_event {
    monome_t *monome;
    monome_event_type_t event_type;
    /* __extension__ for anonymous unions in gcc */
    __extension__ union {
        struct {
            unsigned int x;
            unsigned int y;
        } grid;
        struct {
            unsigned int number;
            int delta;
        } encoder;
        struct {
            unsigned int sensor;
            int x;
            int y;
            int z;
        } tilt;
    };
};

Antwoord 1, autoriteit 100%

Wat dacht je hiervan: verander de code zodat je de leden een naam geeft. De lay-out in het geheugen is hetzelfde, zodat het binair compatibel zal zijn. Je zou deze patch voor elke versie van de lib moeten doen.

struct monome_event {
    monome_t *monome;
    monome_event_type_t event_type;
    /* __extension__ for anonymous unions in gcc */
    __extension__ union {
        struct me_grid {
            unsigned int x;
            unsigned int y;
        } grid;
        struct me_encoder {
            unsigned int number;
            int delta;
        } encoder;
        struct me_tilt {
            unsigned int sensor;
            int x;
            int y;
            int z;
        } tilt;
    };
};

Other episodes