build system 3
[henge/webcc.git] / src / henge / trigger.h
diff --git a/src/henge/trigger.h b/src/henge/trigger.h
new file mode 100644 (file)
index 0000000..5c3c64d
--- /dev/null
@@ -0,0 +1,89 @@
+/*!@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  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_