Interfaçage avec des structures et des unions anonymes avec c2hs

100

Comment encoder ce morceau de code C dans un fichier .chs afin que c2hs puisse le transformer en quelque chose de relativement sympa?

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;
    };
};
amn
la source
12
Il est plus productif pour vous d'essayer de résoudre le problème d'abord, puis de poser des questions spécifiques sur le langage et / ou les outils. Les questions qui sont au cœur de toute confusion et évitent la complexité inutile d'une application spécifique, sont encore meilleures. Par exemple, vous pouvez poser des questions sur une structure simple et / ou sur une simple union, puis appliquer ces connaissances à votre problème.
Thomas M. DuBuisson
2
@ ThomasM.DuBuisson Je pense que vous faites valoir un argument raisonnable. Je vais travailler un peu plus loin.
@unsymbol avez-vous une réponse à votre question?
Pensez à l'
1
Salut unsymbol, des nouvelles à ce sujet? L'avez-vous fait fonctionner et comment?
Casper Thule Hansen

Réponses:

1

Que diriez-vous de ceci: changez le code pour que vous nommez les membres. La disposition en mémoire est la même afin qu'elle soit compatible binaire. Vous auriez à faire ce patch pour chaque version de la lib.

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;
    };
};
h4ck3rm1k3
la source