#include <stdio.h>
#define REGISTER_CALLBACK(e,p) register_callback(e, (callback_void_t)p)
#define GET_CALLBACK(e,T) ((T)callback_func_ptrs[e])
typedef void (*callback_s_char_t)(signed char);
typedef void (*callback_void_t)(void);
typedef enum {
EVENT1,
EVENT2,
MAX_EVENTS
} event_t;
callback_void_t callback_func_ptrs[MAX_EVENTS];
void event_func1(signed char direction) {
printf("success rotated: %d\n", direction
); }
void event_func2(void) {
printf("success button pressed\n"); }
void register_callback(event_t event, callback_void_t ptr) {
callback_func_ptrs[event] = ptr;
}
int main(void) {
//register callback functions
REGISTER_CALLBACK(EVENT1, event_func1);
REGISTER_CALLBACK(EVENT2, event_func2);
//call callbacks
if(callback_func_ptrs[EVENT1])
GET_CALLBACK(EVENT1,callback_s_char_t)(1);
if(callback_func_ptrs[EVENT2])
GET_CALLBACK(EVENT2,callback_void_t)();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFJFR0lTVEVSX0NBTExCQUNLKGUscCkgcmVnaXN0ZXJfY2FsbGJhY2soZSwgKGNhbGxiYWNrX3ZvaWRfdClwKQojZGVmaW5lIEdFVF9DQUxMQkFDSyhlLFQpICgoVCljYWxsYmFja19mdW5jX3B0cnNbZV0pCgp0eXBlZGVmIHZvaWQgKCpjYWxsYmFja19zX2NoYXJfdCkoc2lnbmVkIGNoYXIpOwp0eXBlZGVmIHZvaWQgKCpjYWxsYmFja192b2lkX3QpKHZvaWQpOwoKdHlwZWRlZiBlbnVtIHsKICAgIEVWRU5UMSwgICAgCiAgICBFVkVOVDIsCiAgICBNQVhfRVZFTlRTICAKfSBldmVudF90OwoKY2FsbGJhY2tfdm9pZF90IGNhbGxiYWNrX2Z1bmNfcHRyc1tNQVhfRVZFTlRTXTsKCnZvaWQgZXZlbnRfZnVuYzEoc2lnbmVkIGNoYXIgZGlyZWN0aW9uKSB7CiAgICBwcmludGYoInN1Y2Nlc3Mgcm90YXRlZDogJWRcbiIsIGRpcmVjdGlvbik7Cn0Kdm9pZCBldmVudF9mdW5jMih2b2lkKSB7CiAgICBwcmludGYoInN1Y2Nlc3MgYnV0dG9uIHByZXNzZWRcbiIpOwp9Cgp2b2lkIHJlZ2lzdGVyX2NhbGxiYWNrKGV2ZW50X3QgZXZlbnQsIGNhbGxiYWNrX3ZvaWRfdCBwdHIpIHsKICAgIGNhbGxiYWNrX2Z1bmNfcHRyc1tldmVudF0gPSBwdHI7Cn0KCmludCBtYWluKHZvaWQpIHsKCiAgICAvL3JlZ2lzdGVyIGNhbGxiYWNrIGZ1bmN0aW9ucyAgIAogICAgUkVHSVNURVJfQ0FMTEJBQ0soRVZFTlQxLCBldmVudF9mdW5jMSk7CiAgICBSRUdJU1RFUl9DQUxMQkFDSyhFVkVOVDIsIGV2ZW50X2Z1bmMyKTsKCiAgICAvL2NhbGwgY2FsbGJhY2tzCiAgICBpZihjYWxsYmFja19mdW5jX3B0cnNbRVZFTlQxXSkKICAgICAgICBHRVRfQ0FMTEJBQ0soRVZFTlQxLGNhbGxiYWNrX3NfY2hhcl90KSgxKTsKCiAgICBpZihjYWxsYmFja19mdW5jX3B0cnNbRVZFTlQyXSkKICAgICAgICBHRVRfQ0FMTEJBQ0soRVZFTlQyLGNhbGxiYWNrX3ZvaWRfdCkoKTsKCiAgICByZXR1cm4gMDsKfQo=