Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fxfa / src / fm2js / xfa_expression.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "xfa_fm2js.h"\r
8 static CFX_WideStringC RUNTIMEBLOCKTEMPARRAY            =       FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array");\r
9 static CFX_WideStringC RUNTIMEBLOCKTEMPARRAYINDEX       =       FX_WSTRC(L"foxit_xfa_formcalc_runtime_block_temp_array_index");\r
10 CXFA_FMExpression::CXFA_FMExpression( FX_DWORD line )\r
11     : m_line(line), m_type(XFA_FM_EXPTYPE_UNKNOWN)\r
12 {\r
13 }\r
14 CXFA_FMExpression::CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type)\r
15     : m_line(line), m_type(type)\r
16 {\r
17 }\r
18 void CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
19 {}\r
20 void CXFA_FMExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
21 {}\r
22 CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition( FX_DWORD line, FX_BOOL isGlobal, FX_WSTR wsName, CFX_WideStringCArray *pArguments, CFX_PtrArray *pExpressions )\r
23     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_FUNC),\r
24       m_isGlobal(isGlobal),\r
25       m_wsName(wsName),\r
26       m_pArguments(pArguments),\r
27       m_pExpressions(pExpressions)\r
28 {\r
29 }\r
30 CXFA_FMFunctionDefinition::~CXFA_FMFunctionDefinition()\r
31 {\r
32     if (m_pArguments) {\r
33         m_pArguments->RemoveAll();\r
34         delete m_pArguments;\r
35         m_pArguments = 0;\r
36     }\r
37     if (m_pExpressions) {\r
38         int32_t expc = m_pExpressions->GetSize();\r
39         int32_t index = 0;\r
40         CXFA_FMExpression *e = 0;\r
41         while (index < expc) {\r
42             e = (CXFA_FMExpression *)m_pExpressions->GetAt(index);\r
43             delete e;\r
44             index++;\r
45         }\r
46         m_pExpressions->RemoveAll();\r
47         delete m_pExpressions;\r
48         m_pExpressions = 0;\r
49     }\r
50 }\r
51 void CXFA_FMFunctionDefinition::ToJavaScript(CFX_WideTextBuf& javascript)\r
52 {\r
53     if (m_isGlobal && (!m_pExpressions || m_pExpressions->GetSize() == 0)) {\r
54         javascript << FX_WSTRC(L"// comments only");\r
55         return;\r
56     }\r
57     if(m_isGlobal) {\r
58         javascript << FX_WSTRC(L"(\n");\r
59     }\r
60     javascript << FX_WSTRC(L"function ");\r
61     if (m_wsName.GetAt(0) == L'!') {\r
62         CFX_WideString tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);\r
63         javascript << tempName;\r
64     } else {\r
65         javascript << m_wsName;\r
66     }\r
67     javascript << FX_WSTRC(L"(");\r
68     if (m_pArguments != 0) {\r
69         int32_t argc = m_pArguments->GetSize();\r
70         int32_t index = 0;\r
71         CFX_WideStringC identifier = 0;\r
72         while (index < argc) {\r
73             identifier = m_pArguments->GetAt(index);\r
74             if (identifier.GetAt(0) == L'!') {\r
75                 CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + identifier.Mid(1);\r
76                 javascript << tempIdentifier;\r
77             } else {\r
78                 javascript << identifier;\r
79             }\r
80             if (index + 1 < argc) {\r
81                 javascript << FX_WSTRC(L", ");\r
82             }\r
83             index++;\r
84         }\r
85     }\r
86     javascript << FX_WSTRC(L")\n{\n");\r
87     javascript << FX_WSTRC(L"var ");\r
88     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
89     javascript << FX_WSTRC(L" = null;\n");\r
90     if (m_pExpressions) {\r
91         int32_t expc = m_pExpressions->GetSize();\r
92         int32_t index = 0;\r
93         CXFA_FMExpression *e = 0;\r
94         while (index < expc) {\r
95             e = (CXFA_FMExpression *)m_pExpressions->GetAt(index);\r
96             if (index + 1 < expc) {\r
97                 e->ToJavaScript(javascript);\r
98             } else {\r
99                 e->ToImpliedReturnJS(javascript);\r
100             }\r
101             index++;\r
102         }\r
103     }\r
104     javascript << FX_WSTRC(L"return ");\r
105     if (m_isGlobal) {\r
106         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
107         javascript << FX_WSTRC(L"(");\r
108         javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
109         javascript << FX_WSTRC(L")");\r
110     } else {\r
111         javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
112     }\r
113     javascript << FX_WSTRC(L";\n}\n");\r
114     if(m_isGlobal) {\r
115         javascript << FX_WSTRC(L").call(this);\n");\r
116     }\r
117 }\r
118 void CXFA_FMFunctionDefinition::ToImpliedReturnJS(CFX_WideTextBuf&)\r
119 {}\r
120 CXFA_FMVarExpression::CXFA_FMVarExpression( FX_DWORD line, FX_WSTR wsName, CXFA_FMExpression *pInit )\r
121     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_VAR),\r
122       m_wsName(wsName),\r
123       m_pInit(pInit)\r
124 {\r
125 }\r
126 CXFA_FMVarExpression::~CXFA_FMVarExpression()\r
127 {\r
128     if (m_pInit) {\r
129         delete m_pInit;\r
130         m_pInit = 0;\r
131     }\r
132 }\r
133 void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
134 {\r
135     javascript << FX_WSTRC(L"var ");\r
136     CFX_WideString tempName = m_wsName;\r
137     if (m_wsName.GetAt(0) == L'!') {\r
138         tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);\r
139     }\r
140     javascript << tempName;\r
141     javascript << FX_WSTRC(L" = ");\r
142     if (m_pInit) {\r
143         m_pInit->ToJavaScript(javascript);\r
144         javascript << tempName;\r
145         javascript << FX_WSTRC(L" = ");\r
146         javascript << XFA_FM_EXPTypeToString(VARFILTER);\r
147         javascript << FX_WSTRC(L"(");\r
148         javascript << tempName;\r
149         javascript << FX_WSTRC(L");\n");\r
150     } else {\r
151         javascript << FX_WSTRC(L"\"\";\n");\r
152     }\r
153 }\r
154 void CXFA_FMVarExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
155 {\r
156     javascript << FX_WSTRC(L"var ");\r
157     CFX_WideString tempName = m_wsName;\r
158     if (m_wsName.GetAt(0) == L'!') {\r
159         tempName = EXCLAMATION_IN_IDENTIFIER + m_wsName.Mid(1);\r
160     }\r
161     javascript << tempName;\r
162     javascript << FX_WSTRC(L" = ");\r
163     if (m_pInit) {\r
164         m_pInit->ToJavaScript(javascript);\r
165         javascript << tempName;\r
166         javascript << FX_WSTRC(L" = ");\r
167         javascript << XFA_FM_EXPTypeToString(VARFILTER);\r
168         javascript << FX_WSTRC(L"(");\r
169         javascript << tempName;\r
170         javascript << FX_WSTRC(L");\n");\r
171     } else {\r
172         javascript << FX_WSTRC(L"\"\";\n");\r
173     }\r
174     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
175     javascript << FX_WSTRC(L" = ");\r
176     javascript << tempName;\r
177     javascript << FX_WSTRC(L";\n");\r
178 }\r
179 CXFA_FMExpExpression::CXFA_FMExpExpression( FX_DWORD line, CXFA_FMSimpleExpression *pExpression )\r
180     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression)\r
181 {\r
182 }\r
183 CXFA_FMExpExpression::~CXFA_FMExpExpression()\r
184 {\r
185     if (m_pExpression) {\r
186         delete m_pExpression;\r
187         m_pExpression = 0;\r
188     }\r
189 }\r
190 void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
191 {\r
192     if (m_pExpression->GetOperatorToken() == TOKassign) {\r
193         m_pExpression->ToJavaScript(javascript);\r
194     } else {\r
195         m_pExpression->ToJavaScript(javascript);\r
196         javascript << FX_WSTRC(L";\n");\r
197     }\r
198 }\r
199 void CXFA_FMExpExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
200 {\r
201     if (m_pExpression->GetOperatorToken() == TOKassign) {\r
202         m_pExpression->ToImpliedReturnJS(javascript);\r
203     } else {\r
204         if( m_pExpression->GetOperatorToken() == TOKstar ||\r
205                 m_pExpression->GetOperatorToken() == TOKdotstar ||\r
206                 m_pExpression->GetOperatorToken() == TOKdotscream ||\r
207                 m_pExpression->GetOperatorToken() == TOKdotdot ||\r
208                 m_pExpression->GetOperatorToken() == TOKdot\r
209           ) {\r
210             javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
211             javascript << FX_WSTRC(L" = ");\r
212             javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
213             javascript << FX_WSTRC(L"(");\r
214             m_pExpression->ToJavaScript(javascript);\r
215             javascript << FX_WSTRC(L");\n");\r
216         } else {\r
217             javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
218             javascript << FX_WSTRC(L" = ");\r
219             m_pExpression->ToJavaScript(javascript);\r
220             javascript << FX_WSTRC(L";\n");\r
221         }\r
222     }\r
223 }\r
224 CXFA_FMBlockExpression::CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray *pExpressionList )\r
225     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BLOCK),\r
226       m_pExpressionList(pExpressionList)\r
227 {\r
228 }\r
229 CXFA_FMBlockExpression::~CXFA_FMBlockExpression()\r
230 {\r
231     if (m_pExpressionList) {\r
232         int32_t expc = m_pExpressionList->GetSize();\r
233         int32_t index = 0;\r
234         CXFA_FMExpression *e = 0;\r
235         while (index < expc) {\r
236             e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index);\r
237             delete e;\r
238             index++;\r
239         }\r
240         m_pExpressionList->RemoveAll();\r
241         delete m_pExpressionList;\r
242         m_pExpressionList = 0;\r
243     }\r
244 }\r
245 void CXFA_FMBlockExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
246 {\r
247     javascript << FX_WSTRC(L"{\n");\r
248     if (m_pExpressionList) {\r
249         int32_t expc = m_pExpressionList->GetSize();\r
250         int32_t index = 0;\r
251         CXFA_FMExpression *e = 0;\r
252         while (index < expc) {\r
253             e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index);\r
254             e->ToJavaScript(javascript);\r
255             index++;\r
256         }\r
257     }\r
258     javascript << FX_WSTRC(L"}\n");\r
259 }\r
260 void CXFA_FMBlockExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
261 {\r
262     javascript << FX_WSTRC(L"{\n");\r
263     if (m_pExpressionList) {\r
264         int32_t expc = m_pExpressionList->GetSize();\r
265         int32_t index = 0;\r
266         CXFA_FMExpression *e = 0;\r
267         while (index < expc) {\r
268             e = (CXFA_FMExpression *)m_pExpressionList->GetAt(index);\r
269             if (index + 1 == expc) {\r
270                 e->ToImpliedReturnJS(javascript);\r
271             } else {\r
272                 e->ToJavaScript(javascript);\r
273             }\r
274             index++;\r
275         }\r
276     }\r
277     javascript << FX_WSTRC(L"}\n");\r
278 }\r
279 CXFA_FMDoExpression::CXFA_FMDoExpression( FX_DWORD line, CXFA_FMExpression *pList )\r
280     : CXFA_FMExpression(line),\r
281       m_pList(pList)\r
282 {\r
283 }\r
284 CXFA_FMDoExpression::~CXFA_FMDoExpression()\r
285 {\r
286     if (m_pList) {\r
287         delete m_pList;\r
288         m_pList = 0;\r
289     }\r
290 }\r
291 void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
292 {\r
293     m_pList->ToJavaScript(javascript);\r
294 }\r
295 void CXFA_FMDoExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
296 {\r
297     m_pList->ToImpliedReturnJS(javascript);\r
298 }\r
299 CXFA_FMIfExpression::CXFA_FMIfExpression( FX_DWORD line, CXFA_FMSimpleExpression *pExpression, CXFA_FMExpression *pIfExpression, CXFA_FMExpression *pElseExpression )\r
300     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_IF),\r
301       m_pExpression(pExpression),\r
302       m_pIfExpression(pIfExpression),\r
303       m_pElseExpression(pElseExpression)\r
304 {\r
305 }\r
306 CXFA_FMIfExpression::~CXFA_FMIfExpression()\r
307 {\r
308     if (m_pExpression) {\r
309         delete m_pExpression;\r
310         m_pExpression = 0;\r
311     }\r
312     if (m_pIfExpression) {\r
313         delete m_pIfExpression;\r
314         m_pIfExpression = 0;\r
315     }\r
316     if (m_pElseExpression) {\r
317         delete m_pElseExpression;\r
318         m_pElseExpression = 0;\r
319     }\r
320 }\r
321 void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
322 {\r
323     javascript << FX_WSTRC(L"if (");\r
324     if (m_pExpression) {\r
325         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
326         javascript << FX_WSTRC(L"(");\r
327         m_pExpression->ToJavaScript(javascript);\r
328         javascript << FX_WSTRC(L")");\r
329     }\r
330     javascript << FX_WSTRC(L")\n");\r
331     if (m_pIfExpression) {\r
332         m_pIfExpression->ToJavaScript(javascript);\r
333     }\r
334     if (m_pElseExpression) {\r
335         if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {\r
336             javascript << FX_WSTRC(L"else\n");\r
337             javascript << FX_WSTRC(L"{\n");\r
338             m_pElseExpression->ToJavaScript(javascript);\r
339             javascript << FX_WSTRC(L"}\n");\r
340         } else {\r
341             javascript << FX_WSTRC(L"else\n");\r
342             m_pElseExpression->ToJavaScript(javascript);\r
343         }\r
344     }\r
345 }\r
346 void CXFA_FMIfExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
347 {\r
348     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
349     javascript << FX_WSTRC(L" = 0;\n");\r
350     javascript << FX_WSTRC(L"if (");\r
351     if (m_pExpression) {\r
352         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
353         javascript << FX_WSTRC(L"(");\r
354         m_pExpression->ToJavaScript(javascript);\r
355         javascript << FX_WSTRC(L")");\r
356     }\r
357     javascript << FX_WSTRC(L")\n");\r
358     if (m_pIfExpression) {\r
359         m_pIfExpression->ToImpliedReturnJS(javascript);\r
360     }\r
361     if (m_pElseExpression) {\r
362         if (m_pElseExpression->GetExpType() == XFA_FM_EXPTYPE_IF) {\r
363             javascript << FX_WSTRC(L"else\n");\r
364             javascript << FX_WSTRC(L"{\n");\r
365             m_pElseExpression->ToImpliedReturnJS(javascript);\r
366             javascript << FX_WSTRC(L"}\n");\r
367         } else {\r
368             javascript << FX_WSTRC(L"else\n");\r
369             m_pElseExpression->ToImpliedReturnJS(javascript);\r
370         }\r
371     }\r
372 }\r
373 CXFA_FMLoopExpression::~CXFA_FMLoopExpression()\r
374 {\r
375 }\r
376 void CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
377 {\r
378 }\r
379 void CXFA_FMLoopExpression::ToImpliedReturnJS(CFX_WideTextBuf&)\r
380 {}\r
381 CXFA_FMWhileExpression::CXFA_FMWhileExpression( FX_DWORD line, CXFA_FMSimpleExpression *pCondition, CXFA_FMExpression *pExpression )\r
382     : CXFA_FMLoopExpression(line),\r
383       m_pCondition(pCondition),\r
384       m_pExpression(pExpression)\r
385 {\r
386 }\r
387 CXFA_FMWhileExpression::~CXFA_FMWhileExpression()\r
388 {\r
389     if (m_pCondition) {\r
390         delete m_pCondition;\r
391         m_pCondition = 0;\r
392     }\r
393     if (m_pExpression) {\r
394         delete m_pExpression;\r
395         m_pExpression = 0;\r
396     }\r
397 }\r
398 void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
399 {\r
400     javascript << FX_WSTRC(L"while (");\r
401     m_pCondition->ToJavaScript(javascript);\r
402     javascript << FX_WSTRC(L")\n");\r
403     m_pExpression->ToJavaScript(javascript);\r
404 }\r
405 void CXFA_FMWhileExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
406 {\r
407     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
408     javascript << FX_WSTRC(L" = 0;\n");\r
409     javascript << FX_WSTRC(L"while (");\r
410     m_pCondition->ToJavaScript(javascript);\r
411     javascript << FX_WSTRC(L")\n");\r
412     m_pExpression->ToImpliedReturnJS(javascript);\r
413 }\r
414 CXFA_FMBreakExpression::CXFA_FMBreakExpression(FX_DWORD line)\r
415     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_BREAK),\r
416       m_pExpression(0)\r
417 {\r
418 }\r
419 CXFA_FMBreakExpression::~CXFA_FMBreakExpression()\r
420 {\r
421 }\r
422 void CXFA_FMBreakExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
423 {\r
424     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
425     javascript << FX_WSTRC(L" = 0;\n");\r
426     javascript << FX_WSTRC(L"break;\n");\r
427 }\r
428 void CXFA_FMBreakExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
429 {\r
430     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
431     javascript << FX_WSTRC(L" = 0;\n");\r
432     javascript << FX_WSTRC(L"break;\n");\r
433 }\r
434 CXFA_FMContinueExpression::CXFA_FMContinueExpression( FX_DWORD line )\r
435     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_CONTINUE),\r
436       m_pExpression(0)\r
437 {\r
438 }\r
439 CXFA_FMContinueExpression::~CXFA_FMContinueExpression()\r
440 {\r
441 }\r
442 void CXFA_FMContinueExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
443 {\r
444     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
445     javascript << FX_WSTRC(L" = 0;\n");\r
446     javascript << FX_WSTRC(L"continue;\n");\r
447 }\r
448 void CXFA_FMContinueExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
449 {\r
450     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
451     javascript << FX_WSTRC(L" = 0;\n");\r
452     javascript << FX_WSTRC(L"continue;\n");\r
453 }\r
454 CXFA_FMForExpression::CXFA_FMForExpression(FX_DWORD line, FX_WSTR wsVariant, CXFA_FMSimpleExpression *pAssignment, CXFA_FMSimpleExpression *pAccessor, int32_t iDirection, CXFA_FMSimpleExpression *pStep, CXFA_FMExpression *pList)\r
455     : CXFA_FMLoopExpression(line),\r
456       m_wsVariant(wsVariant),\r
457       m_pAssignment(pAssignment),\r
458       m_pAccessor(pAccessor),\r
459       m_iDirection(iDirection),\r
460       m_pStep(pStep),\r
461       m_pList(pList)\r
462 {\r
463 }\r
464 CXFA_FMForExpression::~CXFA_FMForExpression()\r
465 {\r
466     if (m_pAssignment) {\r
467         delete m_pAssignment;\r
468         m_pAssignment = 0;\r
469     }\r
470     if (m_pAccessor) {\r
471         delete m_pAccessor;\r
472         m_pAccessor = 0;\r
473     }\r
474     if (m_pStep) {\r
475         delete m_pStep;\r
476         m_pStep = 0;\r
477     }\r
478     if (m_pList) {\r
479         delete m_pList;\r
480         m_pList = 0;\r
481     }\r
482 }\r
483 void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
484 {\r
485     javascript << FX_WSTRC(L"{\nvar ");\r
486     CFX_WideString tempVariant;\r
487     if (m_wsVariant.GetAt(0) == L'!') {\r
488         tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);\r
489         javascript << tempVariant;\r
490     } else {\r
491         tempVariant = m_wsVariant;\r
492         javascript << m_wsVariant;\r
493     }\r
494     javascript << FX_WSTRC(L" = null;\n");\r
495     javascript << FX_WSTRC(L"for (");\r
496     javascript << tempVariant;\r
497     javascript << FX_WSTRC(L" = ");\r
498     javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
499     javascript << FX_WSTRC(L"(");\r
500     m_pAssignment->ToJavaScript(javascript);\r
501     javascript << FX_WSTRC(L"); ");\r
502     javascript << tempVariant;\r
503     if (m_iDirection == 1) {\r
504         javascript << FX_WSTRC(L" <= ");\r
505         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
506         javascript << FX_WSTRC(L"(");\r
507         m_pAccessor->ToJavaScript(javascript);\r
508         javascript << FX_WSTRC(L"); ");\r
509         javascript << tempVariant;\r
510         javascript << FX_WSTRC(L" += ");\r
511     } else {\r
512         javascript << FX_WSTRC(L" >= ");\r
513         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
514         javascript << FX_WSTRC(L"(");\r
515         m_pAccessor->ToJavaScript(javascript);\r
516         javascript << FX_WSTRC(L"); ");\r
517         javascript << tempVariant;\r
518         javascript << FX_WSTRC(L" -= ");\r
519     }\r
520     if (m_pStep) {\r
521         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
522         javascript << FX_WSTRC(L"(");\r
523         m_pStep->ToJavaScript(javascript);\r
524         javascript << FX_WSTRC(L")");\r
525     } else {\r
526         javascript << FX_WSTRC(L"1");\r
527     }\r
528     javascript << FX_WSTRC(L")\n");\r
529     m_pList->ToJavaScript(javascript);\r
530     javascript << FX_WSTRC(L"}\n");\r
531 }\r
532 void CXFA_FMForExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
533 {\r
534     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
535     javascript << FX_WSTRC(L" = 0;\n");\r
536     javascript << FX_WSTRC(L"{\nvar ");\r
537     CFX_WideString tempVariant;\r
538     if (m_wsVariant.GetAt(0) == L'!') {\r
539         tempVariant = EXCLAMATION_IN_IDENTIFIER + m_wsVariant.Mid(1);\r
540         javascript << tempVariant;\r
541     } else {\r
542         tempVariant = m_wsVariant;\r
543         javascript << m_wsVariant;\r
544     }\r
545     javascript << FX_WSTRC(L" = null;\n");\r
546     javascript << FX_WSTRC(L"for (");\r
547     javascript << tempVariant;\r
548     javascript << FX_WSTRC(L" = ");\r
549     javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
550     javascript << FX_WSTRC(L"(");\r
551     m_pAssignment->ToJavaScript(javascript);\r
552     javascript << FX_WSTRC(L"); ");\r
553     javascript << tempVariant;\r
554     if (m_iDirection == 1) {\r
555         javascript << FX_WSTRC(L" <= ");\r
556         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
557         javascript << FX_WSTRC(L"(");\r
558         m_pAccessor->ToJavaScript(javascript);\r
559         javascript << FX_WSTRC(L"); ");\r
560         javascript << tempVariant;\r
561         javascript << FX_WSTRC(L" += ");\r
562     } else {\r
563         javascript << FX_WSTRC(L" >= ");\r
564         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
565         javascript << FX_WSTRC(L"(");\r
566         m_pAccessor->ToJavaScript(javascript);\r
567         javascript << FX_WSTRC(L"); ");\r
568         javascript << tempVariant;\r
569         javascript << FX_WSTRC(L" -= ");\r
570     }\r
571     if (m_pStep) {\r
572         javascript << XFA_FM_EXPTypeToString(GETFMVALUE);\r
573         javascript << FX_WSTRC(L"(");\r
574         m_pStep->ToJavaScript(javascript);\r
575         javascript << FX_WSTRC(L")");\r
576     } else {\r
577         javascript << FX_WSTRC(L"1");\r
578     }\r
579     javascript << FX_WSTRC(L")\n");\r
580     m_pList->ToImpliedReturnJS(javascript);\r
581     javascript << FX_WSTRC(L"}\n");\r
582 }\r
583 CXFA_FMForeachExpression::CXFA_FMForeachExpression( FX_DWORD line, FX_WSTR wsIdentifier, CFX_PtrArray *pAccessors, CXFA_FMExpression *pList )\r
584     : CXFA_FMLoopExpression(line),\r
585       m_wsIdentifier(wsIdentifier),\r
586       m_pAccessors(pAccessors),\r
587       m_pList(pList)\r
588 {\r
589 }\r
590 CXFA_FMForeachExpression::~CXFA_FMForeachExpression()\r
591 {\r
592     if (m_pList) {\r
593         delete m_pList;\r
594         m_pList = 0;\r
595     }\r
596     if (m_pAccessors) {\r
597         int32_t size = m_pAccessors->GetSize();\r
598         int32_t index = 0;\r
599         CXFA_FMSimpleExpression *e = 0;\r
600         while (index < size) {\r
601             e = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index);\r
602             delete e;\r
603             index++;\r
604         }\r
605         m_pAccessors->RemoveAll();\r
606         delete m_pAccessors;\r
607         m_pAccessors = 0;\r
608     }\r
609 }\r
610 void CXFA_FMForeachExpression::ToJavaScript(CFX_WideTextBuf& javascript)\r
611 {\r
612     javascript << FX_WSTRC(L"{\n");\r
613     javascript << FX_WSTRC(L"var ");\r
614     if (m_wsIdentifier.GetAt(0) == L'!') {\r
615         CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);\r
616         javascript << tempIdentifier;\r
617     } else {\r
618         javascript << m_wsIdentifier;\r
619     }\r
620     javascript << FX_WSTRC(L" = null;\n");\r
621     javascript << FX_WSTRC(L"var ");\r
622     javascript << RUNTIMEBLOCKTEMPARRAY;\r
623     javascript << FX_WSTRC(L" = ");\r
624     javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);\r
625     javascript << FX_WSTRC(L"(");\r
626     int32_t iSize = m_pAccessors->GetSize();\r
627     int32_t index = 0;\r
628     CXFA_FMSimpleExpression *s = 0;\r
629     while(index < iSize) {\r
630         s = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index);\r
631         s->ToJavaScript(javascript);\r
632         if (index + 1 < iSize) {\r
633             javascript << FX_WSTRC(L", ");\r
634         }\r
635         index++;\r
636     }\r
637     s = 0;\r
638     javascript << FX_WSTRC(L");\n");\r
639     javascript << FX_WSTRC(L"var ");\r
640     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
641     javascript << FX_WSTRC(L" = 0;\n");\r
642     javascript << FX_WSTRC(L"while(");\r
643     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
644     javascript << FX_WSTRC(L" < ");\r
645     javascript << RUNTIMEBLOCKTEMPARRAY;\r
646     javascript << FX_WSTRC(L".length)\n{\n");\r
647     if (m_wsIdentifier.GetAt(0) == L'!') {\r
648         CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);\r
649         javascript << tempIdentifier;\r
650     } else {\r
651         javascript << m_wsIdentifier;\r
652     }\r
653     javascript << FX_WSTRC(L" = ");\r
654     javascript << RUNTIMEBLOCKTEMPARRAY;\r
655     javascript << FX_WSTRC(L"[");\r
656     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
657     javascript << FX_WSTRC(L"++];\n");\r
658     m_pList->ToJavaScript(javascript);\r
659     javascript << FX_WSTRC(L"}\n");\r
660     javascript << FX_WSTRC(L"}\n");\r
661 }\r
662 void CXFA_FMForeachExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript)\r
663 {\r
664     javascript << RUNTIMEFUNCTIONRETURNVALUE;\r
665     javascript << FX_WSTRC(L" = 0;\n");\r
666     javascript << FX_WSTRC(L"{\n");\r
667     javascript << FX_WSTRC(L"var ");\r
668     if (m_wsIdentifier.GetAt(0) == L'!') {\r
669         CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);\r
670         javascript << tempIdentifier;\r
671     } else {\r
672         javascript << m_wsIdentifier;\r
673     }\r
674     javascript << FX_WSTRC(L" = null;\n");\r
675     javascript << FX_WSTRC(L"var ");\r
676     javascript << RUNTIMEBLOCKTEMPARRAY;\r
677     javascript << FX_WSTRC(L" = ");\r
678     javascript << XFA_FM_EXPTypeToString(CONCATFMOBJECT);\r
679     javascript << FX_WSTRC(L"(");\r
680     int32_t iSize = m_pAccessors->GetSize();\r
681     int32_t index = 0;\r
682     CXFA_FMSimpleExpression *s = 0;\r
683     while(index < iSize) {\r
684         s = (CXFA_FMSimpleExpression *)m_pAccessors->GetAt(index);\r
685         s->ToJavaScript(javascript);\r
686         if (index + 1 < iSize) {\r
687             javascript << FX_WSTRC(L", ");\r
688         }\r
689         index++;\r
690     }\r
691     s = 0;\r
692     javascript << FX_WSTRC(L");\n");\r
693     javascript << FX_WSTRC(L"var ");\r
694     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
695     javascript << FX_WSTRC(L" = 0;\n");\r
696     javascript << FX_WSTRC(L"while(");\r
697     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
698     javascript << FX_WSTRC(L" < ");\r
699     javascript << RUNTIMEBLOCKTEMPARRAY;\r
700     javascript << FX_WSTRC(L".length)\n{\n");\r
701     if (m_wsIdentifier.GetAt(0) == L'!') {\r
702         CFX_WideString tempIdentifier = EXCLAMATION_IN_IDENTIFIER + m_wsIdentifier.Mid(1);\r
703         javascript << tempIdentifier;\r
704     } else {\r
705         javascript << m_wsIdentifier;\r
706     }\r
707     javascript << FX_WSTRC(L" = ");\r
708     javascript << RUNTIMEBLOCKTEMPARRAY;\r
709     javascript << FX_WSTRC(L"[");\r
710     javascript << RUNTIMEBLOCKTEMPARRAYINDEX;\r
711     javascript << FX_WSTRC(L"++];\n");\r
712     m_pList->ToImpliedReturnJS(javascript);\r
713     javascript << FX_WSTRC(L"}\n");\r
714     javascript << FX_WSTRC(L"}\n");\r
715 }\r