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 _CGRuntime_h_ 23 #define _CGRuntime_h_ 24 25 #include <string> 26 #include <list> 27 28 #include "UtlException.h" 29 #include "CppParsingTree.h" 30 31 #ifdef WIN32 32 # pragma warning (disable : 4290) 33 #else 34 // Reading of the keyboard under Linux 35 // ----------------------------------- 36 // source code: "http://linux-sxs.org/programming/kbhit.html" 37 void initKeyboard(); 38 void closeKeyboard(); 39 int kbhit(); 40 int readch(); 41 #endif 42 43 namespace CodeWorker { 44 #ifndef SEQUENCE_INTERRUPTION_DECLARATION 45 #define SEQUENCE_INTERRUPTION_DECLARATION 46 enum SEQUENCE_INTERRUPTION_LIST { NO_INTERRUPTION, CONTINUE_INTERRUPTION, RETURN_INTERRUPTION, BREAK_INTERRUPTION, EXIT_INTERRUPTION, THROW_INTERRUPTION }; 47 #endif 48 49 class EXECUTE_FUNCTION { 50 public: EXECUTE_FUNCTION()51 inline EXECUTE_FUNCTION() {} 52 virtual ~EXECUTE_FUNCTION(); 53 54 virtual void run() = 0; 55 }; 56 57 #ifndef EXTERNAL_FUNCTION_TYPE 58 #define EXTERNAL_FUNCTION_TYPE 59 typedef std::string (*EXTERNAL_FUNCTION)(CppParsingTree_var**); 60 #endif 61 62 #ifndef EXTERNAL_TEMPLATE_DISPATCHER_FUNCTION_TYPE 63 #define EXTERNAL_TEMPLATE_DISPATCHER_FUNCTION_TYPE 64 typedef std::string (*EXTERNAL_TEMPLATE_DISPATCHER_FUNCTION)(const std::string&, CppParsingTree_var**); 65 #endif 66 67 #ifndef READONLYHOOK_FUNCTION_TYPE 68 #define READONLYHOOK_FUNCTION_TYPE 69 typedef std::string (*READONLYHOOK_FUNCTION)(CppParsingTree_value); 70 #endif 71 72 #ifndef WRITEFILEHOOK_FUNCTION_TYPE 73 #define WRITEFILEHOOK_FUNCTION_TYPE 74 typedef std::string (*WRITEFILEHOOK_FUNCTION)(CppParsingTree_value, CppParsingTree_value, CppParsingTree_value); 75 #endif 76 77 class ScpStream; 78 class UtlDirectory; 79 80 class DtaScriptVariable; 81 class DtaScript; 82 class DtaDesignScript; 83 class DtaPatternScript; 84 class DtaTranslateScript; 85 class CGExternalHandling; 86 class DtaOutputFile; 87 class CGBNFRuntimeEnvironment; 88 class GrfJointPoint; 89 class DtaProject; 90 91 class CGRuntime { 92 private: 93 static CppParsingTree_var _pThisTree; 94 static std::string _sFrozenTime; 95 static std::string _sLogFile; 96 97 friend class CGThisModifier; 98 99 public: 100 static char _tcHexa[]; 101 102 public: 103 static std::string toString(double dValue); 104 static std::string toString(int iValue); 105 static int toInteger(const std::string& sText); 106 static int toInteger(double dValue); 107 static double toDouble(int iValue); 108 static double toDouble(const std::string& sText); 109 110 static const char* getApplicationName(); 111 static const char* getVersionNumber(); 112 getThisTree()113 inline static CppParsingTree_var getThisTree() { return _pThisTree; } getThisInternalNode()114 inline static DtaScriptVariable& getThisInternalNode() { return *(_pThisTree._pInternalNode); } 115 static CppParsingTree_var getRootTree(); 116 getActiveJointPoint()117 inline static GrfJointPoint* getActiveJointPoint() { return _pJointPoint; } 118 getExternalHandling()119 inline static CGExternalHandling* getExternalHandling() { return _pExternalHandling; } setExternalHandling(CGExternalHandling * pExternalHandling)120 inline static void setExternalHandling(CGExternalHandling* pExternalHandling) { _pExternalHandling = pExternalHandling; } 121 122 static void registerExternalFunction(const std::string& sKey, EXTERNAL_FUNCTION externalFunction); 123 static void registerExternalTemplateDispatcherFunction(const std::string& sKey, EXTERNAL_TEMPLATE_DISPATCHER_FUNCTION externalFunction); 124 static EXTERNAL_FUNCTION getExternalFunction(const std::string& sKey); 125 126 static void throwBNFExecutionError(const std::string& sBNFToken, const char* tcComment = NULL) throw(UtlException); 127 128 static int entryPoint(int iNargs, char** tsArgs, EXECUTE_FUNCTION* executeFunction); 129 static bool executeScript(int iNargs, char** tsArgs, EXECUTE_FUNCTION* executeFunction) throw(UtlException); 130 static void registerScript(const char* sRegistration, EXECUTE_FUNCTION* executeFunction); 131 static void registerReadonlyHook(READONLYHOOK_FUNCTION readonlyHook); 132 static void registerWritefileHook(WRITEFILEHOOK_FUNCTION writefileHook); 133 static void expand(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sFilename); 134 static void expand(const std::string& sScriptFile, CppParsingTree_var pThisTree, const std::string& sFilename); 135 static void autoexpand(const std::string& sFileName, CppParsingTree_var pThisTree); 136 static void generate(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sFilename); 137 static void generate(const std::string& sScriptFile, CppParsingTree_var pThisTree, const std::string& sFilename); 138 static void generateString(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, CppParsingTree_var pOutput); 139 static void parseFree(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sFilename); 140 static void parseAsBNF(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sFilename); 141 static void parseAsBNF(const std::string& sGrammarFile, CppParsingTree_var pThisTree, const std::string& sFilename); 142 static void parseStringAsBNF(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sContent); 143 static void translate(EXECUTE_FUNCTION* executeFunction, CppParsingTree_var pThisTree, const std::string& sInputFilename, const std::string& sOutputFilename); 144 getOutputStream()145 inline static ScpStream* getOutputStream() { return _pOutputStream; } getInputStream()146 inline static ScpStream* getInputStream() { return _pInputStream; } 147 148 static SEQUENCE_INTERRUPTION_LIST writeText(const char* sText); 149 static SEQUENCE_INTERRUPTION_LIST writeText(int iValue); 150 static SEQUENCE_INTERRUPTION_LIST writeText(double dValue); 151 static SEQUENCE_INTERRUPTION_LIST writeText(const CppParsingTree_var& pValue); 152 static SEQUENCE_INTERRUPTION_LIST writeBinaryData(const char* sText, int iLength); 153 static SEQUENCE_INTERRUPTION_LIST writeBinaryData(unsigned char cChar); 154 155 static std::string readEndOfLine(); 156 static std::string readNumeric(); 157 static std::string readInteger(); 158 static std::string readPositiveInteger(); 159 static std::string readCompleteIdentifier(); 160 static bool readIfEqualTo(char cChar); 161 162 static std::list<DtaScriptVariable*>::const_iterator nextIteration(std::list<DtaScriptVariable*>::const_iterator i); 163 static std::map<std::string, DtaScriptVariable*>::const_iterator nextIteration(std::map<std::string, DtaScriptVariable*>::const_iterator i); 164 165 //##markup##"functions and procedures" 166 //##begin##"functions and procedures" 167 static SEQUENCE_INTERRUPTION_LIST appendFile(const std::string& sFilename, const std::string& sContent); 168 static SEQUENCE_INTERRUPTION_LIST clearVariable(DtaScriptVariable* pNode); 169 static SEQUENCE_INTERRUPTION_LIST clearVariable(CppParsingTree_var pNode); 170 static SEQUENCE_INTERRUPTION_LIST compileToCpp(const std::string& sScriptFileName, const std::string& sProjectDirectory, const std::string& sCodeWorkerDirectory); 171 static SEQUENCE_INTERRUPTION_LIST copyFile(const std::string& sSourceFileName, const std::string& sDestinationFileName); 172 static SEQUENCE_INTERRUPTION_LIST copyGenerableFile(const std::string& sSourceFileName, const std::string& sDestinationFileName); 173 static SEQUENCE_INTERRUPTION_LIST copySmartDirectory(const std::string& sSourceDirectory, const std::string& sDestinationPath); 174 static SEQUENCE_INTERRUPTION_LIST cutString(const std::string& sText, const std::string& sSeparator, std::list<std::string>& slList); 175 static SEQUENCE_INTERRUPTION_LIST cutString(const std::string& sText, const std::string& sSeparator, CppParsingTree_var pList); 176 static SEQUENCE_INTERRUPTION_LIST environTable(DtaScriptVariable* pTable); 177 static SEQUENCE_INTERRUPTION_LIST environTable(CppParsingTree_var pTable); 178 static SEQUENCE_INTERRUPTION_LIST extendExecutedScript(const std::string& sScriptContent); 179 static SEQUENCE_INTERRUPTION_LIST insertElementAt(DtaScriptVariable* pList, const std::string& sKey, int iPosition); 180 static SEQUENCE_INTERRUPTION_LIST insertElementAt(CppParsingTree_var pList, const std::string& sKey, int iPosition); 181 static SEQUENCE_INTERRUPTION_LIST invertArray(DtaScriptVariable* pArray); 182 static SEQUENCE_INTERRUPTION_LIST invertArray(CppParsingTree_var pArray); 183 static SEQUENCE_INTERRUPTION_LIST listAllGeneratedFiles(DtaScriptVariable* pFiles); 184 static SEQUENCE_INTERRUPTION_LIST listAllGeneratedFiles(CppParsingTree_var pFiles); 185 static SEQUENCE_INTERRUPTION_LIST loadProject(const std::string& sXMLorTXTFileName, DtaScriptVariable* pNodeToLoad); 186 static SEQUENCE_INTERRUPTION_LIST loadProject(const std::string& sXMLorTXTFileName, CppParsingTree_var pNodeToLoad); 187 static SEQUENCE_INTERRUPTION_LIST openLogFile(const std::string& sFilename); 188 static SEQUENCE_INTERRUPTION_LIST produceHTML(const std::string& sScriptFileName, const std::string& sHTMLFileName); 189 static SEQUENCE_INTERRUPTION_LIST putEnv(const std::string& sName, const std::string& sValue); 190 static SEQUENCE_INTERRUPTION_LIST randomSeed(int iSeed); 191 static SEQUENCE_INTERRUPTION_LIST removeAllElements(DtaScriptVariable* pVariable); 192 static SEQUENCE_INTERRUPTION_LIST removeAllElements(CppParsingTree_var pVariable); 193 static SEQUENCE_INTERRUPTION_LIST removeElement(DtaScriptVariable* pVariable, const std::string& sKey); 194 static SEQUENCE_INTERRUPTION_LIST removeElement(CppParsingTree_var pVariable, const std::string& sKey); 195 static SEQUENCE_INTERRUPTION_LIST removeFirstElement(DtaScriptVariable* pList); 196 static SEQUENCE_INTERRUPTION_LIST removeFirstElement(CppParsingTree_var pList); 197 static SEQUENCE_INTERRUPTION_LIST removeLastElement(DtaScriptVariable* pList); 198 static SEQUENCE_INTERRUPTION_LIST removeLastElement(CppParsingTree_var pList); 199 static SEQUENCE_INTERRUPTION_LIST removeRecursive(DtaScriptVariable* pVariable, const std::string& sAttribute); 200 static SEQUENCE_INTERRUPTION_LIST removeRecursive(CppParsingTree_var pVariable, const std::string& sAttribute); 201 static SEQUENCE_INTERRUPTION_LIST removeVariable(DtaScriptVariable* pNode); 202 static SEQUENCE_INTERRUPTION_LIST removeVariable(CppParsingTree_var pNode); 203 static SEQUENCE_INTERRUPTION_LIST saveBinaryToFile(const std::string& sFilename, const std::string& sContent); 204 static SEQUENCE_INTERRUPTION_LIST saveProject(const std::string& sXMLorTXTFileName, DtaScriptVariable* pNodeToSave); 205 static SEQUENCE_INTERRUPTION_LIST saveProject(const std::string& sXMLorTXTFileName, CppParsingTree_var pNodeToSave); 206 static SEQUENCE_INTERRUPTION_LIST saveProjectTypes(const std::string& sXMLFileName); 207 static SEQUENCE_INTERRUPTION_LIST saveToFile(const std::string& sFilename, const std::string& sContent); 208 static SEQUENCE_INTERRUPTION_LIST setCommentBegin(const std::string& sCommentBegin); 209 static SEQUENCE_INTERRUPTION_LIST setCommentEnd(const std::string& sCommentEnd); 210 static SEQUENCE_INTERRUPTION_LIST setGenerationHeader(const std::string& sComment); 211 static SEQUENCE_INTERRUPTION_LIST setIncludePath(const std::string& sPath); 212 static SEQUENCE_INTERRUPTION_LIST setNow(const std::string& sConstantDateTime); 213 static SEQUENCE_INTERRUPTION_LIST setProperty(const std::string& sDefine, const std::string& sValue); 214 static SEQUENCE_INTERRUPTION_LIST setTextMode(const std::string& sTextMode); 215 static SEQUENCE_INTERRUPTION_LIST setVersion(const std::string& sVersion); 216 static SEQUENCE_INTERRUPTION_LIST setWriteMode(const std::string& sMode); 217 static SEQUENCE_INTERRUPTION_LIST setWorkingPath(const std::string& sPath); 218 static SEQUENCE_INTERRUPTION_LIST sleep(int iMillis); 219 static SEQUENCE_INTERRUPTION_LIST slideNodeContent(DtaScriptVariable* pOrgNode, ExprScriptVariable& xDestNode); 220 static SEQUENCE_INTERRUPTION_LIST slideNodeContent(CppParsingTree_var pOrgNode, CppParsingTree_varexpr& xDestNode); 221 static SEQUENCE_INTERRUPTION_LIST sortArray(DtaScriptVariable* pArray); 222 static SEQUENCE_INTERRUPTION_LIST sortArray(CppParsingTree_var pArray); 223 static SEQUENCE_INTERRUPTION_LIST traceEngine(); 224 static SEQUENCE_INTERRUPTION_LIST traceLine(const std::string& sLine); 225 static SEQUENCE_INTERRUPTION_LIST traceObject(DtaScriptVariable* pObject, int iDepth); 226 static SEQUENCE_INTERRUPTION_LIST traceObject(CppParsingTree_var pObject, int iDepth); 227 static SEQUENCE_INTERRUPTION_LIST traceStack(DtaScriptVariable& visibility); 228 static SEQUENCE_INTERRUPTION_LIST traceText(const std::string& sText); 229 static SEQUENCE_INTERRUPTION_LIST attachInputToSocket(int iSocket); 230 static SEQUENCE_INTERRUPTION_LIST detachInputFromSocket(int iSocket); 231 static SEQUENCE_INTERRUPTION_LIST goBack(); 232 static SEQUENCE_INTERRUPTION_LIST setInputLocation(int iLocation); 233 static SEQUENCE_INTERRUPTION_LIST allFloatingLocations(DtaScriptVariable* pList); 234 static SEQUENCE_INTERRUPTION_LIST allFloatingLocations(CppParsingTree_var pList); 235 static SEQUENCE_INTERRUPTION_LIST attachOutputToSocket(int iSocket); 236 static SEQUENCE_INTERRUPTION_LIST detachOutputFromSocket(int iSocket); 237 static SEQUENCE_INTERRUPTION_LIST incrementIndentLevel(int iLevel); 238 static SEQUENCE_INTERRUPTION_LIST insertText(int iLocation, const std::string& sText); 239 static SEQUENCE_INTERRUPTION_LIST insertTextOnce(int iLocation, const std::string& sText); 240 static SEQUENCE_INTERRUPTION_LIST insertTextToFloatingLocation(const std::string& sLocation, const std::string& sText); 241 static SEQUENCE_INTERRUPTION_LIST insertTextOnceToFloatingLocation(const std::string& sLocation, const std::string& sText); 242 static SEQUENCE_INTERRUPTION_LIST overwritePortion(int iLocation, const std::string& sText, int iSize); 243 static SEQUENCE_INTERRUPTION_LIST populateProtectedArea(const std::string& sProtectedAreaName, const std::string& sContent); 244 static SEQUENCE_INTERRUPTION_LIST resizeOutputStream(int iNewSize); 245 static SEQUENCE_INTERRUPTION_LIST setFloatingLocation(const std::string& sKey, int iLocation); 246 static SEQUENCE_INTERRUPTION_LIST setOutputLocation(int iLocation); 247 static SEQUENCE_INTERRUPTION_LIST setProtectedArea(const std::string& sProtectedAreaName); 248 static SEQUENCE_INTERRUPTION_LIST writeBytes(const std::string& sBytes); 249 static SEQUENCE_INTERRUPTION_LIST writeText(const std::string& sText); 250 static SEQUENCE_INTERRUPTION_LIST writeTextOnce(const std::string& sText); 251 static SEQUENCE_INTERRUPTION_LIST closeSocket(int iSocket); 252 253 static bool flushOutputToSocket(int iSocket); 254 static int acceptSocket(int iServerSocket); 255 static double add(double dLeft, double dRight); 256 static std::string addToDate(const std::string& sDate, const std::string& sFormat, const std::string& sShifting); 257 static std::string byteToChar(const std::string& sByte); 258 static unsigned long bytesToLong(const std::string& sBytes); 259 static unsigned short bytesToShort(const std::string& sBytes); 260 static std::string canonizePath(const std::string& sPath); 261 static bool changeDirectory(const std::string& sPath); 262 static int changeFileTime(const std::string& sFilename, const std::string& sAccessTime, const std::string& sModificationTime); 263 static std::string charAt(const std::string& sText, int iIndex); 264 static std::string charToByte(const std::string& sChar); 265 static int charToInt(const std::string& sChar); 266 static bool chmod(const std::string& sFilename, const std::string& sMode); 267 static int ceil(double dNumber); 268 static int compareDate(const std::string& sDate1, const std::string& sDate2); 269 static std::string completeDate(const std::string& sDate, const std::string& sFormat); 270 static std::string completeLeftSpaces(const std::string& sText, int iLength); 271 static std::string completeRightSpaces(const std::string& sText, int iLength); 272 static std::string composeAdaLikeString(const std::string& sText); 273 static std::string composeCLikeString(const std::string& sText); 274 static std::string composeHTMLLikeString(const std::string& sText); 275 static std::string composeSQLLikeString(const std::string& sText); 276 static std::string computeMD5(const std::string& sText); 277 static bool copySmartFile(const std::string& sSourceFileName, const std::string& sDestinationFileName); 278 static std::string coreString(const std::string& sText, int iPos, int iLastRemoved); 279 static int countStringOccurences(const std::string& sString, const std::string& sText); 280 static bool createDirectory(const std::string& sPath); 281 static int createINETClientSocket(const std::string& sRemoteAddress, int iPort); 282 static int createINETServerSocket(int iPort, int iBackLog); 283 static bool createIterator(DtaScriptVariable* pI, DtaScriptVariable* pList); 284 static bool createIterator(CppParsingTree_var pI, CppParsingTree_var pList); 285 static bool createReverseIterator(DtaScriptVariable* pI, DtaScriptVariable* pList); 286 static bool createReverseIterator(CppParsingTree_var pI, CppParsingTree_var pList); 287 static bool createVirtualFile(const std::string& sHandle, const std::string& sContent); 288 static std::string createVirtualTemporaryFile(const std::string& sContent); 289 static std::string decodeURL(const std::string& sURL); 290 static double decrement(double& dNumber); 291 static double decrement(CppParsingTree_var pNumber); 292 static bool deleteFile(const std::string& sFilename); 293 static bool deleteVirtualFile(const std::string& sHandle); 294 static double div(double dDividend, double dDivisor); 295 static bool duplicateIterator(DtaScriptVariable* pOldIt, DtaScriptVariable* pNewIt); 296 static bool duplicateIterator(CppParsingTree_var pOldIt, CppParsingTree_var pNewIt); 297 static std::string encodeURL(const std::string& sURL); 298 static std::string endl(); 299 static bool endString(const std::string& sText, const std::string& sEnd); 300 static bool equal(double dLeft, double dRight); 301 static bool equalsIgnoreCase(const std::string& sLeft, const std::string& sRight); 302 static bool equalTrees(DtaScriptVariable* pFirstTree, DtaScriptVariable* pSecondTree); 303 static bool equalTrees(CppParsingTree_var pFirstTree, CppParsingTree_var pSecondTree); 304 static std::string executeStringQuiet(DtaScriptVariable* pThis, const std::string& sCommand); 305 static std::string executeStringQuiet(CppParsingTree_var pThis, const std::string& sCommand); 306 static bool existDirectory(const std::string& sPath); 307 static bool existEnv(const std::string& sVariable); 308 static bool existFile(const std::string& sFileName); 309 static bool existVirtualFile(const std::string& sHandle); 310 static bool existVariable(DtaScriptVariable* pVariable); 311 static bool existVariable(CppParsingTree_var pVariable); 312 static double exp(double dX); 313 static bool exploreDirectory(DtaScriptVariable* pDirectory, const std::string& sPath, bool bSubfolders); 314 static bool exploreDirectory(CppParsingTree_var pDirectory, const std::string& sPath, bool bSubfolders); 315 static std::string extractGenerationHeader(const std::string& sFilename, std::string& sGenerator, std::string& sVersion, std::string& sDate); 316 static std::string extractGenerationHeader(const std::string& sFilename, CppParsingTree_var pGenerator, CppParsingTree_var pVersion, CppParsingTree_var pDate); 317 static std::string fileCreation(const std::string& sFilename); 318 static std::string fileLastAccess(const std::string& sFilename); 319 static std::string fileLastModification(const std::string& sFilename); 320 static int fileLines(const std::string& sFilename); 321 static std::string fileMode(const std::string& sFilename); 322 static int fileSize(const std::string& sFilename); 323 static bool findElement(const std::string& sValue, DtaScriptVariable* pVariable); 324 static bool findElement(const std::string& sValue, CppParsingTree_var pVariable); 325 static int findFirstChar(const std::string& sText, const std::string& sSomeChars); 326 static int findFirstSubstringIntoKeys(const std::string& sSubstring, DtaScriptVariable* pArray); 327 static int findFirstSubstringIntoKeys(const std::string& sSubstring, CppParsingTree_var pArray); 328 static int findLastString(const std::string& sText, const std::string& sFind); 329 static int findNextString(const std::string& sText, const std::string& sFind, int iPosition); 330 static int findNextSubstringIntoKeys(const std::string& sSubstring, DtaScriptVariable* pArray, int iNext); 331 static int findNextSubstringIntoKeys(const std::string& sSubstring, CppParsingTree_var pArray, int iNext); 332 static int findString(const std::string& sText, const std::string& sFind); 333 static int floor(double dNumber); 334 static std::string formatDate(const std::string& sDate, const std::string& sFormat); 335 static int getArraySize(DtaScriptVariable* pVariable); 336 static int getArraySize(CppParsingTree_var pVariable); 337 static std::string getCommentBegin(); 338 static std::string getCommentEnd(); 339 static std::string getCurrentDirectory(); 340 static std::string getEnv(const std::string& sVariable); 341 static std::string getGenerationHeader(); 342 static std::string getHTTPRequest(const std::string& sURL, DtaScriptVariable* pHTTPSession, DtaScriptVariable* pArguments); 343 static std::string getHTTPRequest(const std::string& sURL, CppParsingTree_var pHTTPSession, CppParsingTree_var pArguments); 344 static std::string getIncludePath(); 345 static double getLastDelay(); 346 static std::string getNow(); 347 static std::string getProperty(const std::string& sDefine); 348 static std::string getShortFilename(const std::string& sPathFilename); 349 static std::string getTextMode(); 350 static int getVariableAttributes(DtaScriptVariable* pVariable, DtaScriptVariable* pList); 351 static int getVariableAttributes(CppParsingTree_var pVariable, CppParsingTree_var pList); 352 static std::string getVersion(); 353 static std::string getWorkingPath(); 354 static std::string getWriteMode(); 355 static int hexaToDecimal(const std::string& sHexaNumber); 356 static std::string hostToNetworkLong(const std::string& sBytes); 357 static std::string hostToNetworkShort(const std::string& sBytes); 358 static double increment(double& dNumber); 359 static double increment(CppParsingTree_var pNumber); 360 static bool indentFile(const std::string& sFile, const std::string& sMode); 361 static bool inf(double dLeft, double dRight); 362 static std::string inputKey(bool bEcho); 363 static std::string inputLine(bool bEcho, const std::string& sPrompt); 364 static bool isEmpty(DtaScriptVariable* pArray); 365 static bool isEmpty(CppParsingTree_var pArray); 366 static bool isIdentifier(const std::string& sIdentifier); 367 static bool isNegative(double dNumber); 368 static bool isNumeric(const std::string& sNumber); 369 static bool isPositive(double dNumber); 370 static std::string joinStrings(DtaScriptVariable* pList, const std::string& sSeparator); 371 static std::string joinStrings(CppParsingTree_var pList, const std::string& sSeparator); 372 static std::string leftString(const std::string& sText, int iLength); 373 static int lengthString(const std::string& sText); 374 static std::string loadBinaryFile(const std::string& sFile, int iLength); 375 static std::string loadFile(const std::string& sFile, int iLength); 376 static std::string loadVirtualFile(const std::string& sHandle); 377 static double log(double dX); 378 static std::string longToBytes(unsigned long ulLong); 379 static std::string midString(const std::string& sText, int iPos, int iLength); 380 static int mod(int iDividend, int iDivisor); 381 static double mult(double dLeft, double dRight); 382 static std::string networkLongToHost(const std::string& sBytes); 383 static std::string networkShortToHost(const std::string& sBytes); 384 static int octalToDecimal(const std::string& sOctalNumber); 385 static std::string pathFromPackage(const std::string& sPackage); 386 static std::string postHTTPRequest(const std::string& sURL, DtaScriptVariable* pHTTPSession, DtaScriptVariable* pArguments); 387 static std::string postHTTPRequest(const std::string& sURL, CppParsingTree_var pHTTPSession, CppParsingTree_var pArguments); 388 static double pow(double dX, double dY); 389 static int randomInteger(); 390 static std::string receiveBinaryFromSocket(int iSocket, int iLength); 391 static std::string receiveFromSocket(int iSocket, bool& bIsText); 392 static std::string receiveFromSocket(int iSocket, CppParsingTree_var pIsText); 393 static std::string receiveTextFromSocket(int iSocket, int iLength); 394 static std::string relativePath(const std::string& sPath, const std::string& sReference); 395 static bool removeDirectory(const std::string& sPath); 396 static bool removeGenerationTagsHandler(const std::string& sKey); 397 static std::string repeatString(const std::string& sText, int iOccurrences); 398 static std::string replaceString(const std::string& sOld, const std::string& sNew, const std::string& sText); 399 static std::string replaceTabulations(const std::string& sText, int iTab); 400 static std::string resolveFilePath(const std::string& sFilename); 401 static std::string rightString(const std::string& sText, int iLength); 402 static std::string rsubString(const std::string& sText, int iPos); 403 static bool scanDirectories(DtaScriptVariable* pDirectory, const std::string& sPath, const std::string& sPattern); 404 static bool scanDirectories(CppParsingTree_var pDirectory, const std::string& sPath, const std::string& sPattern); 405 static bool scanFiles(DtaScriptVariable* pFiles, const std::string& sPath, const std::string& sPattern, bool bSubfolders); 406 static bool scanFiles(CppParsingTree_var pFiles, const std::string& sPath, const std::string& sPattern, bool bSubfolders); 407 static bool sendBinaryToSocket(int iSocket, const std::string& sBytes); 408 static std::string sendHTTPRequest(const std::string& sURL, DtaScriptVariable* pHTTPSession); 409 static std::string sendHTTPRequest(const std::string& sURL, CppParsingTree_var pHTTPSession); 410 static bool sendTextToSocket(int iSocket, const std::string& sText); 411 static bool selectGenerationTagsHandler(const std::string& sKey); 412 static std::string shortToBytes(unsigned short ulShort); 413 static double sqrt(double dX); 414 static bool startString(const std::string& sText, const std::string& sStart); 415 static double sub(double dLeft, double dRight); 416 static std::string subString(const std::string& sText, int iPos); 417 static bool sup(double dLeft, double dRight); 418 static std::string system(const std::string& sCommand); 419 static std::string toLowerString(const std::string& sText); 420 static std::string toUpperString(const std::string& sText); 421 static int trimLeft(std::string& sString); 422 static int trimLeft(CppParsingTree_var pString); 423 static int trimRight(std::string& sString); 424 static int trimRight(CppParsingTree_var pString); 425 static int trim(std::string& sString); 426 static int trim(CppParsingTree_var pString); 427 static std::string truncateAfterString(DtaScriptVariable* pVariable, const std::string& sText); 428 static std::string truncateAfterString(CppParsingTree_var pVariable, const std::string& sText); 429 static std::string truncateBeforeString(DtaScriptVariable* pVariable, const std::string& sText); 430 static std::string truncateBeforeString(CppParsingTree_var pVariable, const std::string& sText); 431 static std::string UUID(); 432 static int countInputCols(); 433 static int countInputLines(); 434 static std::string getInputFilename(); 435 static std::string getLastReadChars(int iLength); 436 static int getInputLocation(); 437 static bool lookAhead(const std::string& sText); 438 static std::string peekChar(); 439 static bool readAdaString(std::string& sText); 440 static bool readAdaString(CppParsingTree_var pText); 441 static std::string readByte(); 442 static std::string readBytes(int iLength); 443 static std::string readCChar(); 444 static std::string readChar(); 445 static int readCharAsInt(); 446 static std::string readChars(int iLength); 447 static std::string readIdentifier(); 448 static bool readIfEqualTo(const std::string& sText); 449 static bool readIfEqualToIgnoreCase(const std::string& sText); 450 static bool readIfEqualToIdentifier(const std::string& sIdentifier); 451 static bool readLine(std::string& sText); 452 static bool readLine(CppParsingTree_var pText); 453 static bool readNextText(const std::string& sText); 454 static bool readNumber(double& dNumber); 455 static bool readNumber(CppParsingTree_var pNumber); 456 static bool readPythonString(std::string& sText); 457 static bool readPythonString(CppParsingTree_var pText); 458 static bool readString(std::string& sText); 459 static bool readString(CppParsingTree_var pText); 460 static std::string readUptoJustOneChar(const std::string& sOneAmongChars); 461 static std::string readWord(); 462 static bool skipBlanks(); 463 static bool skipSpaces(); 464 static bool skipEmptyCpp(); 465 static bool skipEmptyCppExceptDoxygen(); 466 static bool skipEmptyHTML(); 467 static bool skipEmptyLaTeX(); 468 static int countOutputCols(); 469 static int countOutputLines(); 470 static bool decrementIndentLevel(int iLevel); 471 static bool equalLastWrittenChars(const std::string& sText); 472 static bool existFloatingLocation(const std::string& sKey, bool bParent); 473 static int getFloatingLocation(const std::string& sKey); 474 static std::string getLastWrittenChars(int iNbChars); 475 static std::string getMarkupKey(); 476 static std::string getMarkupValue(); 477 static std::string getOutputFilename(); 478 static int getOutputLocation(); 479 static std::string getProtectedArea(const std::string& sProtection); 480 static int getProtectedAreaKeys(DtaScriptVariable* pKeys); 481 static int getProtectedAreaKeys(CppParsingTree_var pKeys); 482 static bool indentText(const std::string& sMode); 483 static bool newFloatingLocation(const std::string& sKey); 484 static int remainingProtectedAreas(DtaScriptVariable* pKeys); 485 static int remainingProtectedAreas(CppParsingTree_var pKeys); 486 static int removeFloatingLocation(const std::string& sKey); 487 static bool removeProtectedArea(const std::string& sProtectedAreaName); 488 //##end##"functions and procedures" 489 490 static bool extractGenerationHeader(ScpStream& theStream, std::string& sGenerator, std::string& sVersion, std::string& sDate, std::string& sComment); 491 492 private: 493 static void populateDirectory(DtaScriptVariable* pDirectory, UtlDirectory& theDirectory, bool bSubfolders); 494 static void populateFileScan(DtaScriptVariable* pFiles, UtlDirectory& theDirectory, bool bSubfolders); 495 static void copySmartDirectory(UtlDirectory& theDirectory, const std::string& sDestinationPath); 496 static bool convertBytesToChars(const std::string& sBytes, unsigned char* tcBuffer, int iLength); 497 static void convertCharsToBytes(const unsigned char* tcBuffer, char* tcContent, int iLength); 498 499 private: 500 static ScpStream* _pOutputStream; 501 friend class CGRuntimeOutputStream; 502 friend class DtaOutputFile; 503 friend class NetSocket; 504 friend class CGRuntimeOutputFile; 505 506 static ScpStream* _pInputStream; 507 friend class CGRuntimeInputStream; 508 friend class CGRuntimeInputFile; 509 friend class CGRuntimeInputString; 510 friend class DtaDesignScript; 511 friend class DtaBNFScript; 512 friend class BNFTryCatch; 513 friend class BNFScanWindow; 514 friend class CGBNFRuntimeEnvironment; 515 friend class CGBNFRuntimeResizeInput; 516 517 static GrfJointPoint* _pJointPoint; 518 friend class CGJointPointStack; 519 520 static std::list<DtaPatternScript*> _listOfPatternScripts; 521 522 static CGExternalHandling* _pExternalHandling; 523 524 static std::map<std::string, EXTERNAL_FUNCTION>& getExternalFunctionsRegister(); 525 static std::map<std::string, EXTERNAL_TEMPLATE_DISPATCHER_FUNCTION>& getExternalTemplateDispatcherFunctionsRegister(); 526 }; 527 528 529 class CGThisModifier { 530 private: 531 DtaScriptVariable* _pOldThis; 532 533 public: CGThisModifier(CppParsingTree_var & pThisTree)534 inline CGThisModifier(CppParsingTree_var& pThisTree) : _pOldThis(&CGRuntime::getThisInternalNode()) { 535 CGRuntime::_pThisTree = pThisTree; 536 } CGThisModifier(DtaScriptVariable * pThisTree)537 inline CGThisModifier(DtaScriptVariable* pThisTree) : _pOldThis(&CGRuntime::getThisInternalNode()) { 538 CGRuntime::_pThisTree = CppParsingTree_var(pThisTree); 539 } ~CGThisModifier()540 inline ~CGThisModifier() { 541 CGRuntime::_pThisTree = CppParsingTree_var(_pOldThis); 542 } 543 }; 544 545 546 class CGRuntimeInputStream { 547 private: 548 ScpStream* _pOldStream; 549 550 public: 551 CGRuntimeInputStream(ScpStream* pNewStream); 552 ~CGRuntimeInputStream(); 553 }; 554 555 class CGRuntimeOutputStream { 556 private: 557 ScpStream* _pOldStream; 558 559 public: 560 CGRuntimeOutputStream(ScpStream* pNewStream); 561 ~CGRuntimeOutputStream(); 562 }; 563 564 class CGRuntimeInputFile { 565 private: 566 std::string _sFile; 567 ScpStream* _pOldInputStream; 568 ScpStream* _pNewStream; 569 570 public: 571 CGRuntimeInputFile(const std::string& sFile); 572 ~CGRuntimeInputFile(); 573 574 std::string onCatchedException(const UtlException& exception); 575 }; 576 577 class CGRuntimeInputString { 578 private: 579 ScpStream* _pOldInputStream; 580 ScpStream* _pNewStream; 581 582 public: 583 CGRuntimeInputString(const std::string& sText); 584 ~CGRuntimeInputString(); 585 586 std::string onCatchedException(const UtlException& exception); 587 }; 588 589 class CGRuntimeOutputString { 590 private: 591 ScpStream* _pOldOutputStream; 592 DtaOutputFile* _pGeneratedString; 593 594 public: 595 CGRuntimeOutputString(); 596 ~CGRuntimeOutputString(); 597 598 void onCatchedException(UtlException& exception); 599 600 std::string getResult() const; 601 }; 602 603 class CGRuntimeOutputFile { 604 private: 605 bool _bAppendMode; 606 ScpStream* _pOldOutputStream; 607 DtaOutputFile* _pGeneratedString; 608 609 public: 610 CGRuntimeOutputFile(const std::string& sFile, bool bAppendMode = false); 611 ~CGRuntimeOutputFile(); 612 613 void onCatchedException(UtlException& exception); 614 void closeGenerate(); 615 }; 616 617 class CGRuntimeNewProject { 618 private: 619 DtaProject* _pNewProject; 620 public: 621 CGRuntimeNewProject(); 622 ~CGRuntimeNewProject(); 623 }; 624 625 class CGBNFRuntimeIgnore; 626 class CGBNFRuntimeTransformationMode; 627 628 629 typedef bool (*EXECUTE_CLAUSE_FUNCTION)(CGBNFRuntimeEnvironment&); 630 class EXECUTE_CLAUSE { 631 public: 632 virtual bool run(CGBNFRuntimeEnvironment& env) = 0; 633 }; 634 635 class DEFAULT_EXECUTE_CLAUSE : public EXECUTE_CLAUSE { 636 private: 637 EXECUTE_CLAUSE_FUNCTION _executeClause; 638 public: DEFAULT_EXECUTE_CLAUSE(EXECUTE_CLAUSE_FUNCTION executeClause)639 inline DEFAULT_EXECUTE_CLAUSE(EXECUTE_CLAUSE_FUNCTION executeClause) : _executeClause(executeClause) {} run(CGBNFRuntimeEnvironment & env)640 virtual bool run(CGBNFRuntimeEnvironment& env) { return _executeClause(env); } 641 }; 642 643 644 struct CGRuntimeTemporaryMatchingStorage; 645 646 class CGBNFRuntimeEnvironment { 647 public: 648 struct CGMatchingAreas { 649 const char* clause; 650 int beginPosition; 651 int endPosition; 652 std::list<CGMatchingAreas*> childs; 653 CGMatchingAreasCGMatchingAreas654 inline CGMatchingAreas(const char* c, int i) : clause(c), beginPosition(i), endPosition(-1) {} 655 ~CGMatchingAreas(); pushChildCGMatchingAreas656 inline void pushChild(CGMatchingAreas* pChild) { childs.push_back(pChild); } 657 void purgeChildsAfterPosition(int iLocation); 658 }; 659 660 private: 661 EXECUTE_CLAUSE* _executeClause; 662 int _iIgnoreMode; 663 bool _bImplicitCopy; 664 std::list<std::string> _clauseSignatures; 665 CGMatchingAreas* _pMatchingAreas; 666 friend class CGBNFRuntimeClauseMatchingAreaValidator; 667 668 public: CGBNFRuntimeEnvironment(EXECUTE_CLAUSE * executeClause,int iIgnoreMode,bool bImplicitCopy)669 inline CGBNFRuntimeEnvironment(EXECUTE_CLAUSE* executeClause, int iIgnoreMode, bool bImplicitCopy) : _executeClause(executeClause), _iIgnoreMode(iIgnoreMode), _bImplicitCopy(bImplicitCopy), _pMatchingAreas(NULL) {} 670 ~CGBNFRuntimeEnvironment(); 671 implicitCopy()672 inline bool implicitCopy() const { return _bImplicitCopy; } 673 void pushIgnoreMode(CGBNFRuntimeIgnore& ignoreMode, int iNewIgnoreMode, EXECUTE_CLAUSE* newExecuteClause); 674 void popIgnoreMode(const CGBNFRuntimeIgnore& ignoreMode); 675 void pushImplicitCopy(CGBNFRuntimeTransformationMode& transformationMode, bool bNewImplicitCopy); 676 void popImplicitCopy(const CGBNFRuntimeTransformationMode& transformationMode); 677 addClauseSignature(const std::string & sSignature)678 inline void addClauseSignature(const std::string& sSignature) { _clauseSignatures.push_back(sSignature); } 679 void activateMatchingAreas(); getMatchingAreas()680 inline CGMatchingAreas* getMatchingAreas() const { return _pMatchingAreas; } 681 void storeMatchingAreas(CppParsingTree_var& pStorage); 682 683 int skipEmptyChars(); 684 void writeBinaryData(const char* tcText, int iLength); writeBinaryData(unsigned char cChar)685 inline void writeBinaryData(unsigned char cChar) { writeBinaryData((const char*) &cChar, 1); } 686 687 private: 688 void storeClauseMatching(DtaScriptVariable& ruleNames, std::map<int, std::map<int, std::list<CGRuntimeTemporaryMatchingStorage*> > >& mapOfAreas, CGMatchingAreas* pClauseMatching); 689 }; 690 691 class CGBNFRuntimeClauseMatchingAreaValidator { 692 private: 693 CGBNFRuntimeEnvironment* pBNFScript_; 694 CGBNFRuntimeEnvironment::CGMatchingAreas* pOld_; 695 696 public: 697 CGBNFRuntimeClauseMatchingAreaValidator(const char* tcClause, CGBNFRuntimeEnvironment* pBNFScript); 698 ~CGBNFRuntimeClauseMatchingAreaValidator(); 699 void validate(); 700 void purgeChildsAfterPosition(int iLocation); 701 }; 702 703 class CGBNFRuntimeIgnore { 704 private: 705 CGBNFRuntimeEnvironment* _pBNFRuntimeEnvironment; 706 707 public: 708 EXECUTE_CLAUSE* _executeClause; 709 int _iIgnoreMode; 710 711 public: CGBNFRuntimeIgnore(CGBNFRuntimeEnvironment & theBNFRuntimeEnvironment,int iNewIgnoreMode,EXECUTE_CLAUSE * newExecuteClause)712 inline CGBNFRuntimeIgnore(CGBNFRuntimeEnvironment& theBNFRuntimeEnvironment, int iNewIgnoreMode, EXECUTE_CLAUSE* newExecuteClause) : _pBNFRuntimeEnvironment(&theBNFRuntimeEnvironment) { _pBNFRuntimeEnvironment->pushIgnoreMode(*this, iNewIgnoreMode, newExecuteClause); } ~CGBNFRuntimeIgnore()713 inline ~CGBNFRuntimeIgnore() { _pBNFRuntimeEnvironment->popIgnoreMode(*this); } 714 }; 715 716 class CGBNFRuntimeTransformationMode { 717 private: 718 CGBNFRuntimeEnvironment* _pBNFRuntimeEnvironment; 719 720 public: 721 bool _bImplicitCopy; 722 723 public: CGBNFRuntimeTransformationMode(CGBNFRuntimeEnvironment & theBNFRuntimeEnvironment,bool bNewImplicitCopy)724 inline CGBNFRuntimeTransformationMode(CGBNFRuntimeEnvironment& theBNFRuntimeEnvironment, bool bNewImplicitCopy) : _pBNFRuntimeEnvironment(&theBNFRuntimeEnvironment) { _pBNFRuntimeEnvironment->pushImplicitCopy(*this, bNewImplicitCopy); } ~CGBNFRuntimeTransformationMode()725 inline ~CGBNFRuntimeTransformationMode() { _pBNFRuntimeEnvironment->popImplicitCopy(*this); } 726 }; 727 728 class CGBNFRuntimeResizeInput { 729 private: 730 void* _pSizeAttributes; 731 public: 732 CGBNFRuntimeResizeInput(int iFinalLocation); 733 ~CGBNFRuntimeResizeInput(); 734 }; 735 736 class CGJointPointStack { 737 private: 738 GrfJointPoint* _pOldJointPoint; 739 740 public: CGJointPointStack(GrfJointPoint * pJointPoint)741 inline CGJointPointStack(GrfJointPoint* pJointPoint) : _pOldJointPoint(CGRuntime::_pJointPoint) { CGRuntime::_pJointPoint = pJointPoint; } 742 virtual ~CGJointPointStack(); 743 }; 744 745 class CGBNFClauseScope { 746 private: 747 mutable DtaScriptVariable* _pLocalVariables; 748 749 public: CGBNFClauseScope()750 inline CGBNFClauseScope() : _pLocalVariables(NULL) {} 751 ~CGBNFClauseScope(); 752 753 CppParsingTree_var getNode(const std::string& sName) const; 754 CppParsingTree_var getEvaluatedNode(const std::string& sDynamicVariable) const; 755 CppParsingTree_var insertNode(const std::string& sName); 756 CppParsingTree_var insertEvaluatedNode(const std::string& sDynamicVariable); 757 CppParsingTree_var insertClassicalNode(const std::string& sName); 758 CppParsingTree_var insertClassicalEvaluatedNode(const std::string& sDynamicVariable); 759 CppParsingTree_var getOrCreateLocalNode(const std::string& sName); 760 761 private: 762 CGBNFClauseScope(const CGBNFClauseScope&); 763 }; 764 } 765 766 #endif 767