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