State Machine: ============== int display_menu() { // do stuff till the user clicks an menu item return menu_id; } int run_game() { if (user presses ESC) return menu_id; } int main() { enum { RUN_GAME, DISPLAY_MENU } state; while(1) { switch(state) { case RUN_GAME: state = run_game(); break; case DISPLAY_MENU: state = display_menu(); break; } } } ------------------------------------------------------------------------- Signal way: =========== int display_menu() { if (do stuff till the user clicks an menu item) { // call a signal that is bound to run_game() run_game(); } } int run_game() { if (user presses ESC) display_menu(); } int main() { display_menu(); } --------------------------------------------------------------------------- Solution? ========= typedef fnptr (*fnptr)(); fnptr display_menu() { // do stuff till the user clicks an menu item return &run_game; } fnptr run_game() { if (user presses ESC) return &display_menu; } int main() { fnptr start = &run_game; while(1) { next = next(); } } ---------------------------------------------------------------------------