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