Listing 1: C-style FSM.
// C-style method of doing a simple Finite State Machine
#define INVALID_EVENT -1
#define INVALID_STATE -1
typedef int event_t;
typedef int state_t;
typedef void (*FPAction)(void*);
typedef struct State_ State;
// State Machine components
typedef struct Transition_
{
const event_t event;
FPAction action;
const State* state;
} Transition;
struct State_
{
const Transition* table;
FPAction entry;
FPAction exit;
};
// Create the State Transition Table
#define DEFINE_TRANSITION_TABLE(name) \
Transition name##_TransitionTable[] = {
#define ADD_TRANSITION(ev,ac,st) \
{ ev, ac, st },
#define END_TRANSITION_TABLE \
{ INVALID_EVENT, NULL, INVALID_STATE } }
// DEFINE_STATE_TABLE
#define DEFINE_STATE_TABLE(name) \
State name##_StateTable[] = {
#define ADD_STATE(name,entry,exit) \
{ name##_TransitionTable, entry, exit },
#define END_STATE_TABLE \
{ NULL, NULL, NULL } }
// Access operations
#define GET_STATE_TABLE_ENTRY(name,st) \
name##_StateTable[st]
#define GET_STATE_TRANSITION_TABLE(name,st) \
(name##_StateTable[st]).table
#define GET_STATE_ENTRY_CRITERIA(name,st) \
(name##_StateTable[st]).entry
#define GET_STATE_EXIT_CRITERIA(name,st) \
(name##_StateTable[st]).exit