Listing 1: The FSM header file

 1: typedef short Signal;
 2: typedef struct Event Event;
 3: typedef struct Fsm Fsm;
 4: typedef void (*State)(Fsm *, Event const *);
 5:
 6: struct Event { /* Event base class */
 7:    Signal sig;
 8: };
 9:
10: struct Fsm { /* Finite State Machine base class */
11:    State state__; /* the current state */
12: };
13: /* "inlined" methods of Fsm class */
14: #define FsmCtor_(me_, init_) ((me_)->state__ = (State)(init_))
15: #define FsmInit(me_, e_)     (*(me_)->state__)((me_), (e_))
16: #define FsmDispatch(me_, e_) (*(me_)->state__)((me_), (e_))
17: #define FsmTran_(me_, targ_) ((me_)->state__ = (State)(targ_))