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