#include "exec.hpp"



//------------ EXECUTER & Base Poliz Elem Module  ---------------//
//						  v 15 . 04 .  2007						 //
//																 //
//								MT								 //
//---------------------------------------------------------------//

void PolizElem :: Push(PolizElem *e) 
	{ exe->Push(e); };
PolizElem* PolizElem :: Pop() 
	{ return exe->Pop(); };


//------------------------------ HELPER ------------------------------+


//--- Show Error
void CExecuter :: ShowError(char *str, char *str2)
{
	Error.Gum("Runtime error. ");
	Error.Gum(str);
	if (str2!=NULL){
		Error.Gum(" '"); Error.Gum(str2); Error.Gum("'");
	}
	Error.Gum("\n");
	Error.OnErrorSpit(-750);
};


//============================== HELPER ===============================


//------------------------- Variables ---------------------------------

//--- Get Variable from VarTable
int CExecuter :: GetVar(char *str)
{
	try { return VarTable.GetVar(str); }
	catch (const char *s) {
		if (strcmp(VT_VAR_NOT_FOUND, s) == 0)
			ShowError(VT_VAR_NOT_FOUND, str);
		return 0;
	}
};


//------------------------- P.O.L.I.Z. Executer -----------------------

//--- Execute
void CExecuter :: Execute () 
{
	cur = begin;
	PolizItem *tmp;
	
	while (cur!=NULL)
	{
		try {
			tmp = cur;
			Debug("\n Next -> ");
			cur->p->Evaluate_main(this);
			if (tmp==cur) cur = cur->next;
		}
		catch (PolizExNotInt) 
		{ ShowError ("Wrong const"); };
	};

	Debug("\n End execution.");
};


//--- Add Item
void CExecuter :: AddElem(PolizElem *elem)
{
	if (begin == NULL) 
	{
		cur = new PolizItem(elem);
		begin = cur;
		return;
	}
	cur->next = new PolizItem(elem);
	cur = cur->next;
};


//--------------------------- Stack -----------------------------------

//--- Push 
void CExecuter :: Push(PolizElem *e)
{
	PolizItem *tmp = new PolizItem(e);
	stack.Push(tmp);
};


//--- Pop
PolizElem* CExecuter :: Pop()
{
	try {
		 PolizItem *tmp = stack.Pop();
		 PolizElem *val = tmp -> p;
		 delete tmp;
		 return val;
	}
	catch (CStackEmptyEx) {
		ShowError("Stack access: stack is empty.");
	}
	return NULL;
};

//---------------------------------------------------------------------


//---------------------------------------------------------------------
CExecuter  :: ~CExecuter()
{ 
	delete begin;
};

