/*!@file \brief Trigger Mechanism \details includes a small, 15 (by default) element list of function pointers that may be registered and triggered like a stack of functions. Useful for synchronizing function calls. Usage example: #include void trigger_test(void); extern void hack_the_planet(void); extern void hack_the_plants(void); extern void hack_robert_plant(void); void trigger_test() { TRIGGER_SET(hack_the_planet); TRIGGER_SET(hack_the_plants); TRIGGER_SET(hack_robert_plant); //Don't worry robert! TRIGGER_POP(); TRIGGER(); } Advanced Usage Example: #define MAX_TRIGGER_FUNCS 2 #define TRIGGERS kill_trigger flush_trigger #include #include void advanced_trigger_test() { TRIGGER_SET(kill_trigger, hack_the_planet); TRIGGER_SET(kill_trigger, hack_the_missiles); TRIGGER_SET(flush_trigger, hack_the_government); TRIGGER_SET(flush trigger, hack_my_tax_bill); if (robert_plant_hacked()) { TRIGGER(kill_trigger); TRIGGER_POP(flush_trigger); TRIGGER_SET(flush_trigger, hack_the_missile_defenses); } TRIGGER(flush_trigger); } \author Mihrtec \date 2016 -----------------------------------------------------------------------------*/ #ifndef _TRIGGER_H_ #define _TRIGGER_H_ /** The number of trigger functions per trigger */ #ifndef MAX_TRIGGER_FUNCS #define MAX_TRIGGER_FUNCS 15 #endif /* Internal macro prototypes */ #define _TRIGGER_DEL(TARG) --((TARG).num_funcs) #define _TRIGGER_POP(TARG) ((TARG).func[_TRIGGER_DEL(TARG)])() #define _TRIGGER_SET(TARG, FUNC) (TARG).func[(TARG).num_funcs++] = (FUNC) #define _TRIGGER(TARG) while((TARG).num_funcs) TRIGGER_POP(TARG) /* If TRIGGERS is not defined, use only a default trigger and define shorthand functions for easy use. */ #ifndef TRIGGERS #define TRIGGERS default_trigger #define TRIGGER_DEL() _TRIGGER_DEL(default_trigger) #define TRIGGER_POP() _TRIGGER_POP(default_trigger) #define TRIGGER_SET(FUNC) _TRIGGER_SET(default_trigger, FUNC) #define TRIGGER() _TRIGGER(default_trigger) #else #define TRIGGER_DEL(TARG) _TRIGGER_DEL(TARG) #define TRIGGER_POP(TARG) _TRIGGER_POP(TARG) #define TRIGGER_SET(TARG,FUNC) _TRIGGER_SET(TARG,FUNC) #define TRIGGER(TARG) _TRIGGER(TARG) #endif static struct call_trigger { int num_funcs; void (*func[MAX_TRIGGER_FUNCS])(void); } TRIGGERS; #endif //_TRIGGER_H_