+/*!@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 <trigger.h>
+
+ 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 <trigger.h>
+ #include <hack_functions.h>
+
+ 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 K
+ \date 2016
+ ------------------------------------------------------------------------------*/
+
+#ifndef _TRIGGER_H_
+#define _TRIGGER_H_
+
+/* Function trigger stack for "unwinding" initialization of modules */
+#ifndef MAX_TRIGGER_FUNCS
+#define MAX_TRIGGER_FUNCS 15
+#endif
+
+/* Internal macro prototypes */
+#define _TRIGGER_POP(TARG) --TARG.num_funcs
+#define _TRIGGER_SET(TARG, FUNC) TARG.func[TARG.num_funcs++] = FUNC
+#define _TRIGGER(TARG) while(TARG.num_funcs) (TARG.func[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_POP() _TRIGGER_POP(default_trigger)
+#define TRIGGER_SET(FUNC) _TRIGGER_SET(default_trigger, FUNC)
+#define TRIGGER() _TRIGGER(default_trigger)
+#else
+#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_