#include #include #include #include typedef struct FSM_WRAPPER { struct FSM_WRAPPER *(*NextState)(struct FSM_WRAPPER *); } FSM_WRAPPER; FSM_WRAPPER *foo(FSM_WRAPPER *); FSM_WRAPPER *bar(FSM_WRAPPER *); FSM_WRAPPER *baz(FSM_WRAPPER *); FSM_WRAPPER *foo(FSM_WRAPPER *f) { printf("I'm foo().\n"); if(rand() % 4 == 0) { f->NextState = bar; } else { f->NextState = baz; } return f; } FSM_WRAPPER *bar(FSM_WRAPPER *f) { printf("I'm bar().\n"); if(rand() % 5 == 0) { f->NextState = baz; } else { f->NextState = foo; } return f; } FSM_WRAPPER *baz(FSM_WRAPPER *f) { printf("I'm baz().\n"); if(rand() % 6 == 0) { f->NextState = foo; } else if(rand() % 2 == 0) { f->NextState = bar; } else { printf("I give up! I give up!\n"); f->NextState = NULL; } return f; } int main(void) { FSM_WRAPPER fsm; FSM_WRAPPER *state = &fsm; fsm.NextState = foo; srand((unsigned)time(NULL)); do { state = (*(state->NextState))(&fsm); } while(state->NextState != NULL); return 0; }