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