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