1 /* "CodeWorker":	a scripting language for parsing and generating text.
2 
3 Copyright (C) 1996-1997, 1999-2002 C�dric Lemaire
4 
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9 
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 
19 To contact the author: codeworker@free.fr
20 */
21 
22 #ifndef _DtaPatternScript_h_
23 #define _DtaPatternScript_h_
24 
25 #include <map>
26 #include <memory>
27 
28 #include "DtaScript.h"
29 
30 namespace CodeWorker {
31 	class ScpStream;
32 	class DtaProtectedAreasBag;
33 	class DtaPatternScript;
34 	class DtaProject;
35 	class DtaAspectAdvices;
36 	class GrfJointPoint;
37 	class GrfAspectAdvice;
38 
39 	class GrfText;
40 	class GrfSetFloatingLocation;
41 
42 	class DtaOutputFile {
43 	private:
44 		static int _iNumberOfTemporaryFiles;
45 		DtaPatternScript* _pPatternScript;
46 		DtaOutputFile* _pOldOutputFile;
47 		mutable DtaAspectAdvices* _pAspectAdvices;
48 		ScpStream* _pOutputStream;
49 		ScpStream* _pInputStream;
50 		std::string _sTemporaryDirectory;
51 		DtaProtectedAreasBag* _pProtectedAreasBag;
52 		DtaScriptVariable* _pOutputCoverage;
53 
54 	public:
55 		DtaOutputFile(DtaPatternScript* pPatternScript);
56 		~DtaOutputFile();
57 
getOutputStream()58 		inline ScpStream* getOutputStream() const { return _pOutputStream; }
getInputStream()59 		inline ScpStream* getInputStream() const { return _pInputStream; }
setInputStream(ScpStream * pInputStream)60 		inline void setInputStream(ScpStream* pInputStream) { _pInputStream = pInputStream; }
getProtectedAreasBag()61 		inline DtaProtectedAreasBag& getProtectedAreasBag() const { return *_pProtectedAreasBag; }
getOutputCoveragePtr()62 		inline DtaScriptVariable* const* getOutputCoveragePtr() const { return &_pOutputCoverage; }
63 		void insertAspectAdvice(GrfAspectAdvice* pAdvice);
64 
65 		void prepareCoverage(DtaScriptVariable& thisContext, int iTargetLocation);
66 
67 		SEQUENCE_INTERRUPTION_LIST generate(const char* tcFile, DtaScriptVariable& thisContext);
68 		SEQUENCE_INTERRUPTION_LIST generateString(std::string& sOutput, DtaScriptVariable& thisContext);
69 		SEQUENCE_INTERRUPTION_LIST expand(const char* tcFile, DtaScriptVariable& thisContext);
70 
71 		void captureOutputFile(const char* tcFile);
72 		ScpStream* openGenerate(bool bAutomatic, const char* sFile, ScpStream*& pOldOutputStream);
73 		ScpStream* openAppend(bool bAutomatic, const char* sFile, ScpStream*& pOldOutputStream);
74 		std::string catchGenerateExecution(bool bAutomatic, ScpStream* pOldOutputStream, UtlException* pCatchedException);
75 		std::string closeGenerate(bool bAutomatic, const char* sFile, ScpStream* pOldOutputStream);
76 
77 		std::list<std::string> getProtectionKeys() const;
78 		std::list<std::string> remainingProtectionKeys() const;
79 		void populateProtectedArea(const std::string& sProtectedAreaName, const std::string& sContent);
80 		void setProtectedArea(const std::string& sProtectedAreaName);
81 		bool removeProtectedArea(const std::string& sProtectedAreaName);
82 
83 		bool weaveBeforeIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context);
84 		bool weaveAroundIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context);
85 		bool weaveAfterIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context);
86 		bool weaveBefore(GrfJointPoint& jointPoint, DtaScriptVariable& context);
87 		bool weaveAround(GrfJointPoint& jointPoint, DtaScriptVariable& context);
88 		bool weaveAfter(GrfJointPoint& jointPoint, DtaScriptVariable& context);
89 
90 		GrfText* createText(ScpStream& stream, const char* sText) const;
91 
92 	private:
93 		DtaOutputFile();
94 		DtaOutputFile(const DtaOutputFile&);
95 
96 		void openAndloadProtectedCode(const char* sFile);
97 		void saveProtectedCode();
98 		void saveProtectedCodeAndClose();
99 		void copyFromTemporaryFile(const char* sFile);
100 
101 		bool createCoverageTreeForFinalInfo(const std::string& sAbsolutePath);
102 		void restoreCoverageTree(DtaScriptVariable& thisContext, bool bCreateCoverageTreeForFinalInfo, const std::string& sAbsolutePath);
103 
104 		std::string getProtectedAreaIndentation() const;
105 		void writeStandardArea(const std::string& sAreaCode);
106 		void writeTargetedArea(const std::string& sAreaCode, const std::string& sAreaTarget);
107 	};
108 
109 
110 	class DtaPatternScript : public DtaScript {
111 	private:
112 		bool _bExecMode;
113 		int _iExecStartLocation;
114 		DtaOutputFile* _pOutputFile;
115 		EXECUTE_FUNCTION* _executeFunction;
116 
117 	protected:
118 		ExprScriptVariable* _pCoverageTree;
119 
120 	public:
121 		DtaPatternScript(bool bExecMode = false);
122 		DtaPatternScript(/*DtaScriptVariable* pVisibility, */GrfBlock* pParentBlock, bool bExecMode = false);
123 		DtaPatternScript(EXECUTE_FUNCTION* executeFunction, bool bExecMode = false);
124 		virtual ~DtaPatternScript();
125 
setExecMode(bool bExecMode)126 		inline void setExecMode(bool bExecMode) { _bExecMode = bExecMode; }
127 
128 		virtual DtaScriptFactory::SCRIPT_TYPE getType() const;
129 		virtual bool isAGenerateScript() const;
getProtectedAreasBag()130 		inline DtaProtectedAreasBag& getProtectedAreasBag() const { return _pOutputFile->getProtectedAreasBag(); }
131 
getOutputStream()132 		inline ScpStream* getOutputStream() const { return _pOutputFile->getOutputStream(); }
getInputStream()133 		inline ScpStream* getInputStream() const { return _pOutputFile->getInputStream(); }
134 
135 		virtual void traceEngine() const;
136 
137 		virtual SEQUENCE_INTERRUPTION_LIST execute(DtaScriptVariable& thisContext);
138 		SEQUENCE_INTERRUPTION_LIST executeExpansion(const std::string& sScriptContent, DtaScriptVariable& thisContext, int iTargetLocation);
139 
generate(const char * sFile,DtaScriptVariable & thisContext)140 		virtual SEQUENCE_INTERRUPTION_LIST generate(const char* sFile, DtaScriptVariable& thisContext) { return _pOutputFile->generate(sFile, thisContext); }
generateString(std::string & sOutput,DtaScriptVariable & thisContext)141 		virtual SEQUENCE_INTERRUPTION_LIST generateString(std::string& sOutput, DtaScriptVariable& thisContext) { return _pOutputFile->generateString(sOutput, thisContext); }
expand(const char * sFile,DtaScriptVariable & thisContext)142 		virtual SEQUENCE_INTERRUPTION_LIST expand(const char* sFile, DtaScriptVariable& thisContext) { return _pOutputFile->expand(sFile, thisContext); }
autoexpand(const char * sFile,DtaScriptVariable & thisContext)143 		virtual SEQUENCE_INTERRUPTION_LIST autoexpand(const char* sFile, DtaScriptVariable& thisContext) { return _pOutputFile->expand(sFile, thisContext); }
144 
openGenerate(bool bAutomatic,const char * sFile,ScpStream * & pOldOutputStream)145 		inline ScpStream* openGenerate(bool bAutomatic, const char* sFile, ScpStream*& pOldOutputStream) { return _pOutputFile->openGenerate(bAutomatic, sFile, pOldOutputStream); }
catchGenerateExecution(bool bAutomatic,ScpStream * pOldOutputStream,UtlException * pCatchedException)146 		inline void catchGenerateExecution(bool bAutomatic, ScpStream* pOldOutputStream, UtlException* pCatchedException) { _pOutputFile->catchGenerateExecution(bAutomatic, pOldOutputStream, pCatchedException); }
closeGenerate(bool bAutomatic,const char * sFile,ScpStream * pOldOutputStream)147 		inline std::string closeGenerate(bool bAutomatic, const char* sFile, ScpStream* pOldOutputStream) { return _pOutputFile->closeGenerate(bAutomatic, sFile, pOldOutputStream); }
148 
getProtectionKeys()149 		inline std::list<std::string> getProtectionKeys() const { return _pOutputFile->getProtectionKeys(); }
remainingProtectionKeys()150 		inline std::list<std::string> remainingProtectionKeys() const { return _pOutputFile->remainingProtectionKeys(); }
populateProtectedArea(const std::string & sProtectedAreaName,const std::string & sContent)151 		inline void populateProtectedArea(const std::string& sProtectedAreaName, const std::string& sContent) { _pOutputFile->populateProtectedArea(sProtectedAreaName, sContent); }
setProtectedArea(const std::string & sProtectedAreaName)152 		inline void setProtectedArea(const std::string& sProtectedAreaName) { _pOutputFile->setProtectedArea(sProtectedAreaName); }
removeProtectedArea(const std::string & sProtectedAreaName)153 		inline bool removeProtectedArea(const std::string& sProtectedAreaName) { return _pOutputFile->removeProtectedArea(sProtectedAreaName); }
154 
weaveBeforeIteration(GrfJointPoint & jointPoint,DtaScriptVariable & context)155 		inline bool weaveBeforeIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveBeforeIteration(jointPoint, context); }
weaveAroundIteration(GrfJointPoint & jointPoint,DtaScriptVariable & context)156 		inline bool weaveAroundIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveAroundIteration(jointPoint, context); }
weaveAfterIteration(GrfJointPoint & jointPoint,DtaScriptVariable & context)157 		inline bool weaveAfterIteration(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveAfterIteration(jointPoint, context); }
weaveBefore(GrfJointPoint & jointPoint,DtaScriptVariable & context)158 		inline bool weaveBefore(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveBefore(jointPoint, context); }
weaveAround(GrfJointPoint & jointPoint,DtaScriptVariable & context)159 		inline bool weaveAround(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveAround(jointPoint, context); }
weaveAfter(GrfJointPoint & jointPoint,DtaScriptVariable & context)160 		inline bool weaveAfter(GrfJointPoint& jointPoint, DtaScriptVariable& context) { return _pOutputFile->weaveAfter(jointPoint, context); }
161 
162 	protected:
163 		virtual bool betweenCommands(ScpStream& script, GrfBlock& block);
164 		virtual void handleUnknownCommand(const std::string& sCommand, ScpStream& script, GrfBlock& block);
165 		virtual void handleNotAWordCommand(ScpStream& script, GrfBlock& block);
166 		virtual void parsePreprocessorDirective(const std::string& sDirective, ScpStream& script, GrfBlock& block);
167 		virtual void parseJointPoint(GrfBlock& block, ScpStream& script);
168 		virtual void parseAdvice(GrfBlock& block, ScpStream& script);
169 		virtual void parseGeneratedFile(GrfBlock& block, ScpStream& script);
170 		virtual void parseGeneratedString(GrfBlock& block, ScpStream& script);
171 		virtual void parseAppendedFile(GrfBlock& block, ScpStream& script);
172 //##markup##"parsing"
173 //##begin##"parsing"
174 		virtual void parseAllFloatingLocations(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
175 		virtual void parseAttachOutputToSocket(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
176 		virtual void parseDetachOutputFromSocket(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
177 		virtual void parseIncrementIndentLevel(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
178 		virtual void parseInsertText(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
179 		virtual void parseInsertTextOnce(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
180 		virtual void parseInsertTextToFloatingLocation(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
181 		virtual void parseInsertTextOnceToFloatingLocation(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
182 		virtual void parseOverwritePortion(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
183 		virtual void parsePopulateProtectedArea(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
184 		virtual void parseResizeOutputStream(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
185 		virtual void parseSetFloatingLocation(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
186 		virtual void parseSetOutputLocation(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
187 		virtual void parseSetProtectedArea(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
188 		virtual void parseWriteBytes(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
189 		virtual void parseWriteText(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
190 		virtual void parseWriteTextOnce(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller);
191 //##end##"parsing"
192 
193 		virtual DtaBNFScript& getAlienParser() const;
194 
195 	private:
196 		bool handleEmbeddedExpression(ScpStream& script, GrfBlock& block, std::auto_ptr<ExprScriptExpression>& pExpr);
197 		SEQUENCE_INTERRUPTION_LIST executeLight(DtaScriptVariable& thisContext);
198 
199 		friend class DtaOutputFile;
200 	};
201 }
202 
203 #endif
204