#ifndef EVENT_CHAIN_H
#define EVENT_CHAIN_H

/* Event callback chain, for event-based devices */

typedef void(*event_chain_callback)(int success, void *data);

/* Delicious macros. */

#define EC_BEGIN \
	static void *__next_state = &&state_0;\
	goto *__next_state;\
\
state_0:\

#define EC_END __next_state = &&state_0;\
state_end: \
	;

#define EVENT_CHAIN_WAIT_EXPLICIT(label) \
	__next_state = &&label;\
	goto state_end; \
label: 

#define ECEXPAND1(x) state_ ## x
#define ECEXPAND0(x) ECEXPAND1(x)
#define EVENT_CHAIN_WAIT EVENT_CHAIN_WAIT_EXPLICIT(ECEXPAND0(__LINE__))

#define EC_DO(func, cb_data, args...) func(args, __callback, cb_data);\
	EVENT_CHAIN_WAIT

#define EC_FUNCTION(name) static void name(int __success, void *__msg) \
{ \
	static event_chain_callback __callback = &name;
#define EC_SUCCESS __success

#define EC_FUNCTION_END }
#define EC_CALL(name) do{name(1, NULL);} while(0)

#endif //EVENT_CHAIN_H

