/*
 * fsm.c
 * Implementation of a simple finite state machine
 *
 * Copyright (C) Leni Mayo 2001-2002
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License, version 2, as
 *	published by the Free Software Foundation.
 *	
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *	
 *	You should have received a copy of the GNU General Public License
 *	along with this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "fsm.h"

int fsmStateNext(State *pNext, State current, Event event)
{
	int ret = FALSE;

	assert(pNext);

	switch(current)
	{
		case eStateSpirit:
		case eStateRegisterFailed:
			if (event == eEventRegister)
			{
				*pNext = eStateOnTheWayIn;
				ret = TRUE;
			}
			break;
		case eStateOnTheWayIn:
			if (event == eEventProcessSuccess)
			{
				*pNext = eStateIn;
				ret = TRUE;
			}
			else if (event == eEventProcessFailure)
			{
				*pNext = eStateRegisterFailed;
				ret = TRUE;
			}
			break;
		case eStateIn:
			if (event == eEventDeregister)
			{
				*pNext = eStateOnTheWayOut;
				ret = TRUE;
			}
			break;
		case eStateOnTheWayOut:
			if (event == eEventProcessSuccess)
			{
				*pNext = eStateSpirit;
				ret = TRUE;
			}
			else if (event == eEventProcessFailure)
			{
				*pNext = eStateIn;
				ret = TRUE;
			}
			break;
		default:
			assert(FALSE);
	}

	return ret;
}

const char *stateAsString(State state)
{
	const char *pszReturn;

	switch (state)
	{
		case eStateSpirit:         pszReturn = "eStateSpirit";         break;
		case eStateOnTheWayIn:     pszReturn = "eStateOnTheWayIn";     break;
		case eStateRegisterFailed: pszReturn = "eStateRegisterFailed"; break;
		case eStateIn:             pszReturn = "eStateIn";             break;
		case eStateOnTheWayOut:    pszReturn = "eStateOnTheWayOut";    break;
		default: assert(FALSE); break;
	}

	return pszReturn;
}
