/* "CodeWorker":	a scripting language for parsing and generating text.

Copyright (C) 1996-1997, 1999-2002 Cédric Lemaire

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library 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
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

To contact the author: codeworker@free.fr
*/

#ifndef _GrfDebugExecution_h_
#define _GrfDebugExecution_h_



#ifdef CODEWORKER_DOT_NET
#	pragma unmanaged
#endif

#include <string>
#include <list>
#include <vector>
#include <map>

#include "GrfExecutionContext.h"

namespace CodeWorker {
	class DtaBreakpoint {
	public:
		int _iBeginning;
		int _iEnd;

	public:
		DtaBreakpoint() : _iBeginning(0), _iEnd(0) {}
	};

	class GrfDebugExecution : public GrfExecutionContext {
	private:
		std::map<std::string, std::map<int, DtaBreakpoint> > _listOfBreakpoints;
		std::string _sCursor;
		bool _bStop;
		bool _bRun;
		GrfCommand* _pNext;
		int  _iIterations;
		int  _iDisplaySize;

	public:
		GrfDebugExecution(GrfBlock* pParent) : GrfExecutionContext(pParent), _bRun(false), _bStop(true), _pNext(0L), _iDisplaySize(2), _iIterations(0) {}
		virtual ~GrfDebugExecution();

		virtual void handleBeforeExecutionCBK(GrfCommand* pCommand, DtaScriptVariable& visibility);
		virtual void handleAfterExecutionCBK(GrfCommand* pCommand, DtaScriptVariable& /*visibility*/);
		virtual void handleAfterExceptionCBK(GrfCommand* pCommand, DtaScriptVariable& visibility, UtlException& exception);
		
		static void help();

		virtual void compileCpp(CppCompilerEnvironment& theCompilerEnvironment) const;

	protected:
		virtual SEQUENCE_INTERRUPTION_LIST openSession(DtaScriptVariable& visibility);

	private:
		static GrfDebugExecution* getCurrentDebugger() { return (GrfDebugExecution*) GrfCommand::getCurrentExecutionContext(); }

		bool executeCommand(GrfCommand* pCommand, DtaScriptVariable& visibility, ScpStream& stream);
		std::string display(GrfCommand* pCommand, DtaScriptVariable& visibility, int iSize, bool bEchoOn = true);
		void traceStack(GrfCommand* pCommand, DtaScriptVariable& visibility);

		void registerBreakpoint(DtaScriptVariable& visibility, const char* sFilename, int iLineNumber);
		void clearBreakpoint(DtaScriptVariable& /*visibility*/, const char* sFilename, int iLineNumber);
		bool stopOnBreakpoint(const char* sFilename, int iCharLocation);
	};
}

#endif
