summaryrefslogtreecommitdiff
path: root/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp')
-rw-r--r--xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp1422
1 files changed, 711 insertions, 711 deletions
diff --git a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
index 9ce6dd318b..c67681f6ba 100644
--- a/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
+++ b/xfa/src/fxfa/src/fm2js/xfa_simpleexpression.cpp
@@ -1,711 +1,711 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa_fm2js.h"
-static CFX_WideStringC gs_lpStrExpFuncName[] = {
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime."),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"),
- FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"),
-};
-CFX_WideStringC XFA_FM_EXPTypeToString(
- XFA_FM_SimpleExpressionType simpleExpType) {
- return gs_lpStrExpFuncName[simpleExpType];
-}
-static XFA_FMBuildInFunc buildInFuncs[] = {
- {0x0001f1f5, L"At"}, {0x00020b9c, L"FV"},
- {0x00021aef, L"If"}, {0x00023ee6, L"PV"},
- {0x04b5c9ee, L"Encode"}, {0x08e96685, L"DateFmt"},
- {0x09f99db6, L"Abs"}, {0x09f9e583, L"Apr"},
- {0x09fa043e, L"Avg"}, {0x0a9782a0, L"Get"},
- {0x0b1b09df, L"Len"}, {0x0b3543a6, L"Max"},
- {0x0b356ca4, L"Min"}, {0x0b358b60, L"Mod"},
- {0x0b4fded4, L"NPV"}, {0x0b846bf1, L"Pmt"},
- {0x0b8494f9, L"Put"}, {0x0bb8df5d, L"Ref"},
- {0x0bd37a99, L"Str"}, {0x0bd37fb5, L"Sum"},
- {0x1048469b, L"Cterm"}, {0x11e03660, L"Exists"},
- {0x126236e6, L"Post"}, {0x127c6661, L"PPmt"},
- {0x193ade3e, L"Right"}, {0x1ec8ab2c, L"Rate"},
- {0x20e476dc, L"IsoTime2Num"}, {0x23eb6816, L"TimeFmt"},
- {0x24fb17b0, L"LocalDateFmt"}, {0x28dee6e9, L"Format"},
- {0x2d0890b8, L"Term"}, {0x2d71b00f, L"Time"},
- {0x2f890fb1, L"Num2Time"}, {0x3767511d, L"Ceil"},
- {0x3ffd1941, L"LocalTimeFmt"}, {0x442f68c8, L"Round"},
- {0x46fd1128, L"Eval"}, {0x4d629440, L"Date2Num"},
- {0x4dcf25f8, L"Concat"}, {0x4e00255d, L"UnitValue"},
- {0x55a5cc29, L"Lower"}, {0x5e43e04c, L"WordNum"},
- {0x620ce6ba, L"Ipmt"}, {0x6f544d49, L"Count"},
- {0x7e241013, L"Within"}, {0x9b9a6e2b, L"IsoDate2Num"},
- {0xb2c941c2, L"UnitType"}, {0xb598a1f7, L"Uuid"},
- {0xbde9abde, L"Date"}, {0xc0010b80, L"Num2Date"},
- {0xc1f6144c, L"Upper"}, {0xc44028f7, L"Oneof"},
- {0xc62c1b2c, L"Space"}, {0xd0ff50f9, L"HasValue"},
- {0xd1537042, L"Floor"}, {0xd2ac9cf1, L"Time2Num"},
- {0xd907aee5, L"Num2GMTime"}, {0xdf24f7c4, L"Decode"},
- {0xe2664803, L"Substr"}, {0xe3e7b528, L"Stuff"},
- {0xe6792d4e, L"Rtrim"}, {0xe8c23f5b, L"Parse"},
- {0xea18d121, L"Choose"}, {0xebfef69c, L"Replace"},
- {0xf5ad782b, L"Left"}, {0xf7bb2248, L"Ltrim"},
-};
-static const XFA_FMSOMMethod gs_FMSomMethods[] = {
- {0x00000068, L"h", 0x01},
- {0x00000077, L"w", 0x01},
- {0x00000078, L"x", 0x01},
- {0x00000079, L"y", 0x01},
- {0x05eb5b0f, L"pageSpan", 0x01},
- {0x10f1b1bd, L"page", 0x01},
- {0x3bf1c2a5, L"absPageSpan", 0x01},
- {0x3c752495, L"verify", 0x0d},
- {0x44c352ad, L"formNodes", 0x01},
- {0x5775c2cc, L"absPageInBatch", 0x01},
- {0x5ee00996, L"setElement", 0x01},
- {0x7033bfd5, L"insert", 0x03},
- {0x8c5feb32, L"sheetInBatch", 0x01},
- {0x8f3a8379, L"sheet", 0x01},
- {0x92dada4f, L"saveFilteredXML", 0x01},
- {0x9cab7cae, L"remove", 0x01},
- {0xa68635f1, L"sign", 0x61},
- {0xaac241c8, L"isRecordGroup", 0x01},
- {0xd8ed1467, L"clear", 0x01},
- {0xda12e518, L"append", 0x01},
- {0xe74f0653, L"absPage", 0x01},
-};
-CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op)
- : m_line(line), m_op(op) {}
-void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
-XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const {
- return m_op;
-}
-CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line)
- : CXFA_FMSimpleExpression(line, TOKnull) {}
-void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << FX_WSTRC(L"null");
-}
-CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line,
- CFX_WideStringC wsNumber)
- : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {}
-void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << m_wsNumber;
-}
-CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line,
- CFX_WideStringC wsString)
- : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {}
-void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- CFX_WideString tempStr = m_wsString;
- if (tempStr.GetLength() > 2) {
- javascript.AppendChar(L'\"');
- FX_WCHAR oneChar;
- for (int16_t i = 1; i < tempStr.GetLength() - 1; i++) {
- oneChar = tempStr[i];
- switch (oneChar) {
- case L'\"': {
- i++;
- javascript << FX_WSTRC(L"\\\"");
- } break;
- case 0x0d:
- break;
- case 0x0a: {
- javascript << FX_WSTRC(L"\\n");
- } break;
- default: { javascript.AppendChar(oneChar); } break;
- }
- }
- javascript.AppendChar(L'\"');
- } else {
- javascript << tempStr;
- }
-}
-CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn(
- FX_DWORD line,
- CFX_WideStringC wsIdentifier)
- : CXFA_FMSimpleExpression(line, TOKidentifier),
- m_wsIdentifier(wsIdentifier) {}
-void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) {
- CFX_WideString tempStr = m_wsIdentifier;
- if (tempStr.Equal(FX_WSTRC(L"$"))) {
- tempStr = FX_WSTRC(L"this");
- } else if (tempStr.Equal(FX_WSTRC(L"!"))) {
- tempStr = FX_WSTRC(L"xfa.datasets");
- } else if (tempStr.Equal(FX_WSTRC(L"$data"))) {
- tempStr = FX_WSTRC(L"xfa.datasets.data");
- } else if (tempStr.Equal(FX_WSTRC(L"$event"))) {
- tempStr = FX_WSTRC(L"xfa.event");
- } else if (tempStr.Equal(FX_WSTRC(L"$form"))) {
- tempStr = FX_WSTRC(L"xfa.form");
- } else if (tempStr.Equal(FX_WSTRC(L"$host"))) {
- tempStr = FX_WSTRC(L"xfa.host");
- } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) {
- tempStr = FX_WSTRC(L"xfa.layout");
- } else if (tempStr.Equal(FX_WSTRC(L"$template"))) {
- tempStr = FX_WSTRC(L"xfa.template");
- } else if (tempStr[0] == L'!') {
- tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1);
- }
- javascript << tempStr;
-}
-
-CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp)
- : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
-CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {
- if (m_pExp != 0) {
- delete m_pExp;
- m_pExp = 0;
- }
-}
-void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
-CXFA_FMBinExpression::~CXFA_FMBinExpression() {
- if (m_pExp1 != 0) {
- delete m_pExp1;
- m_pExp1 = 0;
- }
- if (m_pExp2 != 0) {
- delete m_pExp2;
- m_pExp2 = 0;
- }
-}
-void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
-CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << FX_WSTRC(L"if (");
- javascript << gs_lpStrExpFuncName[ISFMOBJECT];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L"))\n{\n");
- javascript << gs_lpStrExpFuncName[ASSIGN];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L");\n}\n");
- CFX_WideTextBuf tempExp1;
- m_pExp1->ToJavaScript(tempExp1);
- if (m_pExp1->GetOperatorToken() == TOKidentifier &&
- tempExp1.GetWideString() != FX_WSTRC(L"this")) {
- javascript << FX_WSTRC(L"else\n{\n");
- javascript << tempExp1;
- javascript << FX_WSTRC(L" = ");
- javascript << gs_lpStrExpFuncName[ASSIGN];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L");\n}\n");
- }
-}
-void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
- javascript << FX_WSTRC(L"if (");
- javascript << gs_lpStrExpFuncName[ISFMOBJECT];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L"))\n{\n");
- javascript << RUNTIMEFUNCTIONRETURNVALUE;
- javascript << FX_WSTRC(L" = ");
- javascript << gs_lpStrExpFuncName[ASSIGN];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L");\n}\n");
- CFX_WideTextBuf tempExp1;
- m_pExp1->ToJavaScript(tempExp1);
- if (m_pExp1->GetOperatorToken() == TOKidentifier &&
- tempExp1.GetWideString() != FX_WSTRC(L"this")) {
- javascript << FX_WSTRC(L"else\n{\n");
- javascript << RUNTIMEFUNCTIONRETURNVALUE;
- javascript << FX_WSTRC(L" = ");
- javascript << tempExp1;
- javascript << FX_WSTRC(L" = ");
- javascript << gs_lpStrExpFuncName[ASSIGN];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L");\n}\n");
- }
-}
-CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[LOGICALOR];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[LOGICALAND];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- switch (m_op) {
- case TOKeq:
- case TOKkseq:
- javascript << gs_lpStrExpFuncName[EQUALITY];
- break;
- case TOKne:
- case TOKksne:
- javascript << gs_lpStrExpFuncName[NOTEQUALITY];
- break;
- default:
- FXSYS_assert(FALSE);
- break;
- }
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- switch (m_op) {
- case TOKlt:
- case TOKkslt:
- javascript << gs_lpStrExpFuncName[LESS];
- break;
- case TOKgt:
- case TOKksgt:
- javascript << gs_lpStrExpFuncName[GREATER];
- break;
- case TOKle:
- case TOKksle:
- javascript << gs_lpStrExpFuncName[LESSEQUAL];
- break;
- case TOKge:
- case TOKksge:
- javascript << gs_lpStrExpFuncName[GREATEREQUAL];
- break;
- default:
- FXSYS_assert(FALSE);
- break;
- }
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- switch (m_op) {
- case TOKplus:
- javascript << gs_lpStrExpFuncName[PLUS];
- break;
- case TOKminus:
- javascript << gs_lpStrExpFuncName[MINUS];
- break;
- default:
- FXSYS_assert(FALSE);
- break;
- }
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(
- FX_DWORD line,
- XFA_FM_TOKEN op,
- CXFA_FMSimpleExpression* pExp1,
- CXFA_FMSimpleExpression* pExp2)
- : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
-void CXFA_FMMultiplicativeExpression::ToJavaScript(
- CFX_WideTextBuf& javascript) {
- switch (m_op) {
- case TOKmul:
- javascript << gs_lpStrExpFuncName[MULTIPLE];
- break;
- case TOKdiv:
- javascript << gs_lpStrExpFuncName[DIVIDE];
- break;
- default:
- FXSYS_assert(FALSE);
- break;
- }
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line,
- CXFA_FMSimpleExpression* pExp)
- : CXFA_FMUnaryExpression(line, TOKplus, pExp) {}
-void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[POSITIVE];
- javascript << FX_WSTRC(L"(");
- m_pExp->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line,
- CXFA_FMSimpleExpression* pExp)
- : CXFA_FMUnaryExpression(line, TOKminus, pExp) {}
-void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[NEGATIVE];
- javascript << FX_WSTRC(L"(");
- m_pExp->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line,
- CXFA_FMSimpleExpression* pExp)
- : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {}
-void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[NOT];
- javascript << FX_WSTRC(L"(");
- m_pExp->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line,
- CXFA_FMSimpleExpression* pExp,
- CFX_PtrArray* pArguments,
- FX_BOOL bIsSomMethod)
- : CXFA_FMUnaryExpression(line, TOKcall, pExp),
- m_bIsSomMethod(bIsSomMethod),
- m_pArguments(pArguments) {
-}
-CXFA_FMCallExpression::~CXFA_FMCallExpression() {
- if (m_pArguments) {
- int32_t argc = m_pArguments->GetSize();
- int32_t index = 0;
- CXFA_FMSimpleExpression* e = 0;
- while (index < argc) {
- e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
- delete e;
- index++;
- }
- m_pArguments->RemoveAll();
- delete m_pArguments;
- m_pArguments = 0;
- }
-}
-FX_BOOL CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf& funcName) {
- int32_t iLength = funcName.GetLength();
- uint32_t uHash = FX_HashCode_String_GetW(funcName.GetBuffer(), iLength, TRUE);
- XFA_FMBuildInFunc buildinfunction;
- int32_t iStart = 0,
- iEnd = (sizeof(buildInFuncs) / sizeof(buildInFuncs[0])) - 1;
- int32_t iMid = (iStart + iEnd) / 2;
- do {
- iMid = (iStart + iEnd) / 2;
- buildinfunction = buildInFuncs[iMid];
- if (uHash == buildinfunction.m_uHash) {
- funcName.Clear();
- funcName << buildinfunction.m_buildinfunc;
- return TRUE;
- } else if (uHash < buildinfunction.m_uHash) {
- iEnd = iMid - 1;
- } else {
- iStart = iMid + 1;
- }
- } while (iStart <= iEnd);
- return FALSE;
-}
-FX_DWORD CXFA_FMCallExpression::IsSomMethodWithObjPara(
- const CFX_WideStringC& methodName) {
- int32_t iLength = methodName.GetLength();
- uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength);
- XFA_FMSOMMethod somMethodWithObjPara;
- FX_DWORD parameters = 0x00;
- int32_t iStart = 0,
- iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1;
- int32_t iMid = (iStart + iEnd) / 2;
- do {
- iMid = (iStart + iEnd) / 2;
- somMethodWithObjPara = gs_FMSomMethods[iMid];
- if (uHash == somMethodWithObjPara.m_uHash) {
- parameters = somMethodWithObjPara.m_dParameters;
- break;
- } else if (uHash < somMethodWithObjPara.m_uHash) {
- iEnd = iMid - 1;
- } else {
- iStart = iMid + 1;
- }
- } while (iStart <= iEnd);
- return parameters;
-}
-void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- CFX_WideTextBuf funcName;
- m_pExp->ToJavaScript(funcName);
- if (m_bIsSomMethod) {
- javascript << funcName;
- javascript << FX_WSTRC(L"(");
- if (m_pArguments) {
- int32_t argc = m_pArguments->GetSize();
- int32_t index = 0;
- FX_DWORD methodPara = IsSomMethodWithObjPara(funcName.GetWideString());
- if (methodPara > 0) {
- CXFA_FMSimpleExpression* e = 0;
- while (index < argc) {
- if ((methodPara & (0x01 << index)) > 0) {
- javascript << gs_lpStrExpFuncName[GETFMJSOBJ];
- } else {
- javascript << gs_lpStrExpFuncName[GETFMVALUE];
- }
- javascript << FX_WSTRC(L"(");
- e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
- e->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
- if (index + 1 < argc) {
- javascript << FX_WSTRC(L", ");
- }
- index++;
- }
- } else {
- CXFA_FMSimpleExpression* e = 0;
- while (index < argc) {
- javascript << gs_lpStrExpFuncName[GETFMVALUE];
- javascript << FX_WSTRC(L"(");
- e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
- e->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
- if (index + 1 < argc) {
- javascript << FX_WSTRC(L", ");
- }
- index++;
- }
- }
- }
- javascript << FX_WSTRC(L")");
- } else {
- FX_BOOL isEvalFunc = FALSE;
- FX_BOOL isExistsFunc = FALSE;
- if (IsBuildInFunc(funcName)) {
- if (funcName.GetWideString() == FX_WSTRC(L"Eval")) {
- isEvalFunc = TRUE;
- javascript << FX_WSTRC(L"eval.call(this, ");
- javascript << gs_lpStrExpFuncName[CALL];
- javascript << FX_WSTRC(L"Translate");
- } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) {
- isExistsFunc = TRUE;
- javascript << gs_lpStrExpFuncName[CALL];
- javascript << funcName;
- } else {
- javascript << gs_lpStrExpFuncName[CALL];
- javascript << funcName;
- }
- } else {
- javascript << funcName;
- }
- javascript << FX_WSTRC(L"(");
- if (isExistsFunc) {
- javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n");
- if (m_pArguments && m_pArguments->GetSize() > 0) {
- CXFA_FMSimpleExpression* e =
- (CXFA_FMSimpleExpression*)m_pArguments->GetAt(0);
- javascript << FX_WSTRC(L"return ");
- e->ToJavaScript(javascript);
- javascript << FX_WSTRC(L";\n}\n");
- } else {
- javascript << FX_WSTRC(L"return 0;\n}\n");
- }
- javascript << FX_WSTRC(
- L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n");
- } else if (m_pArguments) {
- int32_t argc = m_pArguments->GetSize();
- int32_t index = 0;
- CXFA_FMSimpleExpression* e = 0;
- while (index < argc) {
- e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
- e->ToJavaScript(javascript);
- if (index + 1 < argc) {
- javascript << FX_WSTRC(L", ");
- }
- index++;
- }
- }
- javascript << FX_WSTRC(L")");
- if (isEvalFunc) {
- javascript << FX_WSTRC(L")");
- }
- }
-}
-CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
- FX_DWORD line,
- CXFA_FMSimpleExpression* pAccessor,
- XFA_FM_TOKEN op,
- CFX_WideStringC wsIdentifier,
- CXFA_FMSimpleExpression* pIndexExp)
- : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
- m_wsIdentifier(wsIdentifier) {}
-void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[DOT];
- javascript << FX_WSTRC(L"(");
- if (m_pExp1) {
- m_pExp1->ToJavaScript(javascript);
- } else {
- javascript << FX_WSTRC(L"null");
- }
- javascript << FX_WSTRC(L", ");
- javascript << FX_WSTRC(L"\"");
- if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
- m_pExp1->ToJavaScript(javascript);
- }
- javascript << FX_WSTRC(L"\", ");
- if (m_op == TOKdotscream) {
- javascript << FX_WSTRC(L"\"#");
- javascript << m_wsIdentifier;
- javascript << FX_WSTRC(L"\", ");
- } else if (m_op == TOKdotstar) {
- javascript << FX_WSTRC(L"\"*\", ");
- } else if (m_op == TOKcall) {
- javascript << FX_WSTRC(L"\"\", ");
- } else {
- javascript << FX_WSTRC(L"\"");
- javascript << m_wsIdentifier;
- javascript << FX_WSTRC(L"\", ");
- }
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMIndexExpression::CXFA_FMIndexExpression(
- FX_DWORD line,
- XFA_FM_AccessorIndex accessorIndex,
- CXFA_FMSimpleExpression* pIndexExp,
- FX_BOOL bIsStarIndex)
- : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp),
- m_accessorIndex(accessorIndex),
- m_bIsStarIndex(bIsStarIndex) {}
-void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- switch (m_accessorIndex) {
- case ACCESSOR_NO_INDEX:
- javascript << FX_WSTRC(L"0");
- break;
- case ACCESSOR_NO_RELATIVEINDEX:
- javascript << FX_WSTRC(L"1");
- break;
- case ACCESSOR_POSITIVE_INDEX:
- javascript << FX_WSTRC(L"2");
- break;
- case ACCESSOR_NEGATIVE_INDEX:
- javascript << FX_WSTRC(L"3");
- break;
- default:
- javascript << FX_WSTRC(L"0");
- }
- if (!m_bIsStarIndex) {
- javascript << FX_WSTRC(L", ");
- if (m_pExp) {
- m_pExp->ToJavaScript(javascript);
- } else {
- javascript << FX_WSTRC(L"0");
- }
- }
-}
-CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
- FX_DWORD line,
- CXFA_FMSimpleExpression* pAccessor,
- XFA_FM_TOKEN op,
- CFX_WideStringC wsIdentifier,
- CXFA_FMSimpleExpression* pIndexExp)
- : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
- m_wsIdentifier(wsIdentifier) {}
-void CXFA_FMDotDotAccessorExpression::ToJavaScript(
- CFX_WideTextBuf& javascript) {
- javascript << gs_lpStrExpFuncName[DOTDOT];
- javascript << FX_WSTRC(L"(");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L", ");
- javascript << FX_WSTRC(L"\"");
- if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
- m_pExp1->ToJavaScript(javascript);
- }
- javascript << FX_WSTRC(L"\", ");
- javascript << FX_WSTRC(L"\"");
- javascript << m_wsIdentifier;
- javascript << FX_WSTRC(L"\", ");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L")");
-}
-CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
- FX_DWORD line,
- CXFA_FMSimpleExpression* pAccessorExp1,
- CXFA_FMSimpleExpression* pCallExp)
- : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {}
-void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
- javascript << FX_WSTRC(L"(\nfunction ()\n{\n");
- javascript << FX_WSTRC(L"var method_return_value = null;\n");
- javascript << FX_WSTRC(L"var accessor_object = ");
- m_pExp1->ToJavaScript(javascript);
- javascript << FX_WSTRC(L";\n");
- javascript << FX_WSTRC(L"if (");
- javascript << gs_lpStrExpFuncName[ISFMARRAY];
- javascript << FX_WSTRC(L"(accessor_object))\n{\n");
- javascript << FX_WSTRC(
- L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n");
- javascript << FX_WSTRC(L"method_return_value = accessor_object[index].");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L";\n}\n}\n");
- javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object.");
- m_pExp2->ToJavaScript(javascript);
- javascript << FX_WSTRC(L";\n}\n");
- javascript << FX_WSTRC(L"return method_return_value;\n");
- javascript << FX_WSTRC(L"}\n).call(this)");
-}
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa_fm2js.h"
+static CFX_WideStringC gs_lpStrExpFuncName[] = {
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.assign_value_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_or_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_and_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.equality_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.notequality_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.less_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.lessequal_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.greater_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.greaterequal_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.plus_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.minus_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.multiple_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.divide_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.positive_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.negative_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.logical_not_operator"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime."),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.dot_accessor"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.dotdot_accessor"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.concat_fm_object"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_object"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.is_fm_array"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_value"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.get_fm_jsobj"),
+ FX_WSTRC(L"foxit_xfa_formcalc_runtime.fm_var_filter"),
+};
+CFX_WideStringC XFA_FM_EXPTypeToString(
+ XFA_FM_SimpleExpressionType simpleExpType) {
+ return gs_lpStrExpFuncName[simpleExpType];
+}
+static XFA_FMBuildInFunc buildInFuncs[] = {
+ {0x0001f1f5, L"At"}, {0x00020b9c, L"FV"},
+ {0x00021aef, L"If"}, {0x00023ee6, L"PV"},
+ {0x04b5c9ee, L"Encode"}, {0x08e96685, L"DateFmt"},
+ {0x09f99db6, L"Abs"}, {0x09f9e583, L"Apr"},
+ {0x09fa043e, L"Avg"}, {0x0a9782a0, L"Get"},
+ {0x0b1b09df, L"Len"}, {0x0b3543a6, L"Max"},
+ {0x0b356ca4, L"Min"}, {0x0b358b60, L"Mod"},
+ {0x0b4fded4, L"NPV"}, {0x0b846bf1, L"Pmt"},
+ {0x0b8494f9, L"Put"}, {0x0bb8df5d, L"Ref"},
+ {0x0bd37a99, L"Str"}, {0x0bd37fb5, L"Sum"},
+ {0x1048469b, L"Cterm"}, {0x11e03660, L"Exists"},
+ {0x126236e6, L"Post"}, {0x127c6661, L"PPmt"},
+ {0x193ade3e, L"Right"}, {0x1ec8ab2c, L"Rate"},
+ {0x20e476dc, L"IsoTime2Num"}, {0x23eb6816, L"TimeFmt"},
+ {0x24fb17b0, L"LocalDateFmt"}, {0x28dee6e9, L"Format"},
+ {0x2d0890b8, L"Term"}, {0x2d71b00f, L"Time"},
+ {0x2f890fb1, L"Num2Time"}, {0x3767511d, L"Ceil"},
+ {0x3ffd1941, L"LocalTimeFmt"}, {0x442f68c8, L"Round"},
+ {0x46fd1128, L"Eval"}, {0x4d629440, L"Date2Num"},
+ {0x4dcf25f8, L"Concat"}, {0x4e00255d, L"UnitValue"},
+ {0x55a5cc29, L"Lower"}, {0x5e43e04c, L"WordNum"},
+ {0x620ce6ba, L"Ipmt"}, {0x6f544d49, L"Count"},
+ {0x7e241013, L"Within"}, {0x9b9a6e2b, L"IsoDate2Num"},
+ {0xb2c941c2, L"UnitType"}, {0xb598a1f7, L"Uuid"},
+ {0xbde9abde, L"Date"}, {0xc0010b80, L"Num2Date"},
+ {0xc1f6144c, L"Upper"}, {0xc44028f7, L"Oneof"},
+ {0xc62c1b2c, L"Space"}, {0xd0ff50f9, L"HasValue"},
+ {0xd1537042, L"Floor"}, {0xd2ac9cf1, L"Time2Num"},
+ {0xd907aee5, L"Num2GMTime"}, {0xdf24f7c4, L"Decode"},
+ {0xe2664803, L"Substr"}, {0xe3e7b528, L"Stuff"},
+ {0xe6792d4e, L"Rtrim"}, {0xe8c23f5b, L"Parse"},
+ {0xea18d121, L"Choose"}, {0xebfef69c, L"Replace"},
+ {0xf5ad782b, L"Left"}, {0xf7bb2248, L"Ltrim"},
+};
+static const XFA_FMSOMMethod gs_FMSomMethods[] = {
+ {0x00000068, L"h", 0x01},
+ {0x00000077, L"w", 0x01},
+ {0x00000078, L"x", 0x01},
+ {0x00000079, L"y", 0x01},
+ {0x05eb5b0f, L"pageSpan", 0x01},
+ {0x10f1b1bd, L"page", 0x01},
+ {0x3bf1c2a5, L"absPageSpan", 0x01},
+ {0x3c752495, L"verify", 0x0d},
+ {0x44c352ad, L"formNodes", 0x01},
+ {0x5775c2cc, L"absPageInBatch", 0x01},
+ {0x5ee00996, L"setElement", 0x01},
+ {0x7033bfd5, L"insert", 0x03},
+ {0x8c5feb32, L"sheetInBatch", 0x01},
+ {0x8f3a8379, L"sheet", 0x01},
+ {0x92dada4f, L"saveFilteredXML", 0x01},
+ {0x9cab7cae, L"remove", 0x01},
+ {0xa68635f1, L"sign", 0x61},
+ {0xaac241c8, L"isRecordGroup", 0x01},
+ {0xd8ed1467, L"clear", 0x01},
+ {0xda12e518, L"append", 0x01},
+ {0xe74f0653, L"absPage", 0x01},
+};
+CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op)
+ : m_line(line), m_op(op) {}
+void CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+void CXFA_FMSimpleExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {}
+XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const {
+ return m_op;
+}
+CXFA_FMNullExpression::CXFA_FMNullExpression(FX_DWORD line)
+ : CXFA_FMSimpleExpression(line, TOKnull) {}
+void CXFA_FMNullExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << FX_WSTRC(L"null");
+}
+CXFA_FMNumberExpression::CXFA_FMNumberExpression(FX_DWORD line,
+ CFX_WideStringC wsNumber)
+ : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {}
+void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << m_wsNumber;
+}
+CXFA_FMStringExpression::CXFA_FMStringExpression(FX_DWORD line,
+ CFX_WideStringC wsString)
+ : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {}
+void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ CFX_WideString tempStr = m_wsString;
+ if (tempStr.GetLength() > 2) {
+ javascript.AppendChar(L'\"');
+ FX_WCHAR oneChar;
+ for (int16_t i = 1; i < tempStr.GetLength() - 1; i++) {
+ oneChar = tempStr[i];
+ switch (oneChar) {
+ case L'\"': {
+ i++;
+ javascript << FX_WSTRC(L"\\\"");
+ } break;
+ case 0x0d:
+ break;
+ case 0x0a: {
+ javascript << FX_WSTRC(L"\\n");
+ } break;
+ default: { javascript.AppendChar(oneChar); } break;
+ }
+ }
+ javascript.AppendChar(L'\"');
+ } else {
+ javascript << tempStr;
+ }
+}
+CXFA_FMIdentifierExpressionn::CXFA_FMIdentifierExpressionn(
+ FX_DWORD line,
+ CFX_WideStringC wsIdentifier)
+ : CXFA_FMSimpleExpression(line, TOKidentifier),
+ m_wsIdentifier(wsIdentifier) {}
+void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) {
+ CFX_WideString tempStr = m_wsIdentifier;
+ if (tempStr.Equal(FX_WSTRC(L"$"))) {
+ tempStr = FX_WSTRC(L"this");
+ } else if (tempStr.Equal(FX_WSTRC(L"!"))) {
+ tempStr = FX_WSTRC(L"xfa.datasets");
+ } else if (tempStr.Equal(FX_WSTRC(L"$data"))) {
+ tempStr = FX_WSTRC(L"xfa.datasets.data");
+ } else if (tempStr.Equal(FX_WSTRC(L"$event"))) {
+ tempStr = FX_WSTRC(L"xfa.event");
+ } else if (tempStr.Equal(FX_WSTRC(L"$form"))) {
+ tempStr = FX_WSTRC(L"xfa.form");
+ } else if (tempStr.Equal(FX_WSTRC(L"$host"))) {
+ tempStr = FX_WSTRC(L"xfa.host");
+ } else if (tempStr.Equal(FX_WSTRC(L"$layout"))) {
+ tempStr = FX_WSTRC(L"xfa.layout");
+ } else if (tempStr.Equal(FX_WSTRC(L"$template"))) {
+ tempStr = FX_WSTRC(L"xfa.template");
+ } else if (tempStr[0] == L'!') {
+ tempStr = EXCLAMATION_IN_IDENTIFIER + tempStr.Mid(1);
+ }
+ javascript << tempStr;
+}
+
+CXFA_FMUnaryExpression::CXFA_FMUnaryExpression(FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp)
+ : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
+CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {
+ if (m_pExp != 0) {
+ delete m_pExp;
+ m_pExp = 0;
+ }
+}
+void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+CXFA_FMBinExpression::CXFA_FMBinExpression(FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
+CXFA_FMBinExpression::~CXFA_FMBinExpression() {
+ if (m_pExp1 != 0) {
+ delete m_pExp1;
+ m_pExp1 = 0;
+ }
+ if (m_pExp2 != 0) {
+ delete m_pExp2;
+ m_pExp2 = 0;
+ }
+}
+void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
+CXFA_FMAssignExpression::CXFA_FMAssignExpression(FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMAssignExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << FX_WSTRC(L"if (");
+ javascript << gs_lpStrExpFuncName[ISFMOBJECT];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L"))\n{\n");
+ javascript << gs_lpStrExpFuncName[ASSIGN];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L");\n}\n");
+ CFX_WideTextBuf tempExp1;
+ m_pExp1->ToJavaScript(tempExp1);
+ if (m_pExp1->GetOperatorToken() == TOKidentifier &&
+ tempExp1.GetWideString() != FX_WSTRC(L"this")) {
+ javascript << FX_WSTRC(L"else\n{\n");
+ javascript << tempExp1;
+ javascript << FX_WSTRC(L" = ");
+ javascript << gs_lpStrExpFuncName[ASSIGN];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L");\n}\n");
+ }
+}
+void CXFA_FMAssignExpression::ToImpliedReturnJS(CFX_WideTextBuf& javascript) {
+ javascript << FX_WSTRC(L"if (");
+ javascript << gs_lpStrExpFuncName[ISFMOBJECT];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L"))\n{\n");
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << FX_WSTRC(L" = ");
+ javascript << gs_lpStrExpFuncName[ASSIGN];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L");\n}\n");
+ CFX_WideTextBuf tempExp1;
+ m_pExp1->ToJavaScript(tempExp1);
+ if (m_pExp1->GetOperatorToken() == TOKidentifier &&
+ tempExp1.GetWideString() != FX_WSTRC(L"this")) {
+ javascript << FX_WSTRC(L"else\n{\n");
+ javascript << RUNTIMEFUNCTIONRETURNVALUE;
+ javascript << FX_WSTRC(L" = ");
+ javascript << tempExp1;
+ javascript << FX_WSTRC(L" = ");
+ javascript << gs_lpStrExpFuncName[ASSIGN];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L");\n}\n");
+ }
+}
+CXFA_FMLogicalOrExpression::CXFA_FMLogicalOrExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMLogicalOrExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[LOGICALOR];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMLogicalAndExpression::CXFA_FMLogicalAndExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMLogicalAndExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[LOGICALAND];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMEqualityExpression::CXFA_FMEqualityExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMEqualityExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ switch (m_op) {
+ case TOKeq:
+ case TOKkseq:
+ javascript << gs_lpStrExpFuncName[EQUALITY];
+ break;
+ case TOKne:
+ case TOKksne:
+ javascript << gs_lpStrExpFuncName[NOTEQUALITY];
+ break;
+ default:
+ FXSYS_assert(FALSE);
+ break;
+ }
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMRelationalExpression::CXFA_FMRelationalExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMRelationalExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ switch (m_op) {
+ case TOKlt:
+ case TOKkslt:
+ javascript << gs_lpStrExpFuncName[LESS];
+ break;
+ case TOKgt:
+ case TOKksgt:
+ javascript << gs_lpStrExpFuncName[GREATER];
+ break;
+ case TOKle:
+ case TOKksle:
+ javascript << gs_lpStrExpFuncName[LESSEQUAL];
+ break;
+ case TOKge:
+ case TOKksge:
+ javascript << gs_lpStrExpFuncName[GREATEREQUAL];
+ break;
+ default:
+ FXSYS_assert(FALSE);
+ break;
+ }
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMAdditiveExpression::CXFA_FMAdditiveExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMAdditiveExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ switch (m_op) {
+ case TOKplus:
+ javascript << gs_lpStrExpFuncName[PLUS];
+ break;
+ case TOKminus:
+ javascript << gs_lpStrExpFuncName[MINUS];
+ break;
+ default:
+ FXSYS_assert(FALSE);
+ break;
+ }
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMMultiplicativeExpression::CXFA_FMMultiplicativeExpression(
+ FX_DWORD line,
+ XFA_FM_TOKEN op,
+ CXFA_FMSimpleExpression* pExp1,
+ CXFA_FMSimpleExpression* pExp2)
+ : CXFA_FMBinExpression(line, op, pExp1, pExp2) {}
+void CXFA_FMMultiplicativeExpression::ToJavaScript(
+ CFX_WideTextBuf& javascript) {
+ switch (m_op) {
+ case TOKmul:
+ javascript << gs_lpStrExpFuncName[MULTIPLE];
+ break;
+ case TOKdiv:
+ javascript << gs_lpStrExpFuncName[DIVIDE];
+ break;
+ default:
+ FXSYS_assert(FALSE);
+ break;
+ }
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMPosExpression::CXFA_FMPosExpression(FX_DWORD line,
+ CXFA_FMSimpleExpression* pExp)
+ : CXFA_FMUnaryExpression(line, TOKplus, pExp) {}
+void CXFA_FMPosExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[POSITIVE];
+ javascript << FX_WSTRC(L"(");
+ m_pExp->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMNegExpression::CXFA_FMNegExpression(FX_DWORD line,
+ CXFA_FMSimpleExpression* pExp)
+ : CXFA_FMUnaryExpression(line, TOKminus, pExp) {}
+void CXFA_FMNegExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[NEGATIVE];
+ javascript << FX_WSTRC(L"(");
+ m_pExp->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMNotExpression::CXFA_FMNotExpression(FX_DWORD line,
+ CXFA_FMSimpleExpression* pExp)
+ : CXFA_FMUnaryExpression(line, TOKksnot, pExp) {}
+void CXFA_FMNotExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[NOT];
+ javascript << FX_WSTRC(L"(");
+ m_pExp->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMCallExpression::CXFA_FMCallExpression(FX_DWORD line,
+ CXFA_FMSimpleExpression* pExp,
+ CFX_PtrArray* pArguments,
+ FX_BOOL bIsSomMethod)
+ : CXFA_FMUnaryExpression(line, TOKcall, pExp),
+ m_bIsSomMethod(bIsSomMethod),
+ m_pArguments(pArguments) {
+}
+CXFA_FMCallExpression::~CXFA_FMCallExpression() {
+ if (m_pArguments) {
+ int32_t argc = m_pArguments->GetSize();
+ int32_t index = 0;
+ CXFA_FMSimpleExpression* e = 0;
+ while (index < argc) {
+ e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
+ delete e;
+ index++;
+ }
+ m_pArguments->RemoveAll();
+ delete m_pArguments;
+ m_pArguments = 0;
+ }
+}
+FX_BOOL CXFA_FMCallExpression::IsBuildInFunc(CFX_WideTextBuf& funcName) {
+ int32_t iLength = funcName.GetLength();
+ uint32_t uHash = FX_HashCode_String_GetW(funcName.GetBuffer(), iLength, TRUE);
+ XFA_FMBuildInFunc buildinfunction;
+ int32_t iStart = 0,
+ iEnd = (sizeof(buildInFuncs) / sizeof(buildInFuncs[0])) - 1;
+ int32_t iMid = (iStart + iEnd) / 2;
+ do {
+ iMid = (iStart + iEnd) / 2;
+ buildinfunction = buildInFuncs[iMid];
+ if (uHash == buildinfunction.m_uHash) {
+ funcName.Clear();
+ funcName << buildinfunction.m_buildinfunc;
+ return TRUE;
+ } else if (uHash < buildinfunction.m_uHash) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ } while (iStart <= iEnd);
+ return FALSE;
+}
+FX_DWORD CXFA_FMCallExpression::IsSomMethodWithObjPara(
+ const CFX_WideStringC& methodName) {
+ int32_t iLength = methodName.GetLength();
+ uint32_t uHash = FX_HashCode_String_GetW(methodName.GetPtr(), iLength);
+ XFA_FMSOMMethod somMethodWithObjPara;
+ FX_DWORD parameters = 0x00;
+ int32_t iStart = 0,
+ iEnd = (sizeof(gs_FMSomMethods) / sizeof(gs_FMSomMethods[0])) - 1;
+ int32_t iMid = (iStart + iEnd) / 2;
+ do {
+ iMid = (iStart + iEnd) / 2;
+ somMethodWithObjPara = gs_FMSomMethods[iMid];
+ if (uHash == somMethodWithObjPara.m_uHash) {
+ parameters = somMethodWithObjPara.m_dParameters;
+ break;
+ } else if (uHash < somMethodWithObjPara.m_uHash) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ } while (iStart <= iEnd);
+ return parameters;
+}
+void CXFA_FMCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ CFX_WideTextBuf funcName;
+ m_pExp->ToJavaScript(funcName);
+ if (m_bIsSomMethod) {
+ javascript << funcName;
+ javascript << FX_WSTRC(L"(");
+ if (m_pArguments) {
+ int32_t argc = m_pArguments->GetSize();
+ int32_t index = 0;
+ FX_DWORD methodPara = IsSomMethodWithObjPara(funcName.GetWideString());
+ if (methodPara > 0) {
+ CXFA_FMSimpleExpression* e = 0;
+ while (index < argc) {
+ if ((methodPara & (0x01 << index)) > 0) {
+ javascript << gs_lpStrExpFuncName[GETFMJSOBJ];
+ } else {
+ javascript << gs_lpStrExpFuncName[GETFMVALUE];
+ }
+ javascript << FX_WSTRC(L"(");
+ e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
+ e->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+ if (index + 1 < argc) {
+ javascript << FX_WSTRC(L", ");
+ }
+ index++;
+ }
+ } else {
+ CXFA_FMSimpleExpression* e = 0;
+ while (index < argc) {
+ javascript << gs_lpStrExpFuncName[GETFMVALUE];
+ javascript << FX_WSTRC(L"(");
+ e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
+ e->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+ if (index + 1 < argc) {
+ javascript << FX_WSTRC(L", ");
+ }
+ index++;
+ }
+ }
+ }
+ javascript << FX_WSTRC(L")");
+ } else {
+ FX_BOOL isEvalFunc = FALSE;
+ FX_BOOL isExistsFunc = FALSE;
+ if (IsBuildInFunc(funcName)) {
+ if (funcName.GetWideString() == FX_WSTRC(L"Eval")) {
+ isEvalFunc = TRUE;
+ javascript << FX_WSTRC(L"eval.call(this, ");
+ javascript << gs_lpStrExpFuncName[CALL];
+ javascript << FX_WSTRC(L"Translate");
+ } else if (funcName.GetWideString() == FX_WSTRC(L"Exists")) {
+ isExistsFunc = TRUE;
+ javascript << gs_lpStrExpFuncName[CALL];
+ javascript << funcName;
+ } else {
+ javascript << gs_lpStrExpFuncName[CALL];
+ javascript << funcName;
+ }
+ } else {
+ javascript << funcName;
+ }
+ javascript << FX_WSTRC(L"(");
+ if (isExistsFunc) {
+ javascript << FX_WSTRC(L"\n(\nfunction ()\n{\ntry\n{\n");
+ if (m_pArguments && m_pArguments->GetSize() > 0) {
+ CXFA_FMSimpleExpression* e =
+ (CXFA_FMSimpleExpression*)m_pArguments->GetAt(0);
+ javascript << FX_WSTRC(L"return ");
+ e->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L";\n}\n");
+ } else {
+ javascript << FX_WSTRC(L"return 0;\n}\n");
+ }
+ javascript << FX_WSTRC(
+ L"catch(accessExceptions)\n{\nreturn 0;\n}\n}\n).call(this)\n");
+ } else if (m_pArguments) {
+ int32_t argc = m_pArguments->GetSize();
+ int32_t index = 0;
+ CXFA_FMSimpleExpression* e = 0;
+ while (index < argc) {
+ e = (CXFA_FMSimpleExpression*)m_pArguments->GetAt(index);
+ e->ToJavaScript(javascript);
+ if (index + 1 < argc) {
+ javascript << FX_WSTRC(L", ");
+ }
+ index++;
+ }
+ }
+ javascript << FX_WSTRC(L")");
+ if (isEvalFunc) {
+ javascript << FX_WSTRC(L")");
+ }
+ }
+}
+CXFA_FMDotAccessorExpression::CXFA_FMDotAccessorExpression(
+ FX_DWORD line,
+ CXFA_FMSimpleExpression* pAccessor,
+ XFA_FM_TOKEN op,
+ CFX_WideStringC wsIdentifier,
+ CXFA_FMSimpleExpression* pIndexExp)
+ : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+ m_wsIdentifier(wsIdentifier) {}
+void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[DOT];
+ javascript << FX_WSTRC(L"(");
+ if (m_pExp1) {
+ m_pExp1->ToJavaScript(javascript);
+ } else {
+ javascript << FX_WSTRC(L"null");
+ }
+ javascript << FX_WSTRC(L", ");
+ javascript << FX_WSTRC(L"\"");
+ if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
+ m_pExp1->ToJavaScript(javascript);
+ }
+ javascript << FX_WSTRC(L"\", ");
+ if (m_op == TOKdotscream) {
+ javascript << FX_WSTRC(L"\"#");
+ javascript << m_wsIdentifier;
+ javascript << FX_WSTRC(L"\", ");
+ } else if (m_op == TOKdotstar) {
+ javascript << FX_WSTRC(L"\"*\", ");
+ } else if (m_op == TOKcall) {
+ javascript << FX_WSTRC(L"\"\", ");
+ } else {
+ javascript << FX_WSTRC(L"\"");
+ javascript << m_wsIdentifier;
+ javascript << FX_WSTRC(L"\", ");
+ }
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMIndexExpression::CXFA_FMIndexExpression(
+ FX_DWORD line,
+ XFA_FM_AccessorIndex accessorIndex,
+ CXFA_FMSimpleExpression* pIndexExp,
+ FX_BOOL bIsStarIndex)
+ : CXFA_FMUnaryExpression(line, TOKlbracket, pIndexExp),
+ m_accessorIndex(accessorIndex),
+ m_bIsStarIndex(bIsStarIndex) {}
+void CXFA_FMIndexExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ switch (m_accessorIndex) {
+ case ACCESSOR_NO_INDEX:
+ javascript << FX_WSTRC(L"0");
+ break;
+ case ACCESSOR_NO_RELATIVEINDEX:
+ javascript << FX_WSTRC(L"1");
+ break;
+ case ACCESSOR_POSITIVE_INDEX:
+ javascript << FX_WSTRC(L"2");
+ break;
+ case ACCESSOR_NEGATIVE_INDEX:
+ javascript << FX_WSTRC(L"3");
+ break;
+ default:
+ javascript << FX_WSTRC(L"0");
+ }
+ if (!m_bIsStarIndex) {
+ javascript << FX_WSTRC(L", ");
+ if (m_pExp) {
+ m_pExp->ToJavaScript(javascript);
+ } else {
+ javascript << FX_WSTRC(L"0");
+ }
+ }
+}
+CXFA_FMDotDotAccessorExpression::CXFA_FMDotDotAccessorExpression(
+ FX_DWORD line,
+ CXFA_FMSimpleExpression* pAccessor,
+ XFA_FM_TOKEN op,
+ CFX_WideStringC wsIdentifier,
+ CXFA_FMSimpleExpression* pIndexExp)
+ : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
+ m_wsIdentifier(wsIdentifier) {}
+void CXFA_FMDotDotAccessorExpression::ToJavaScript(
+ CFX_WideTextBuf& javascript) {
+ javascript << gs_lpStrExpFuncName[DOTDOT];
+ javascript << FX_WSTRC(L"(");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L", ");
+ javascript << FX_WSTRC(L"\"");
+ if (m_pExp1 && m_pExp1->GetOperatorToken() == TOKidentifier) {
+ m_pExp1->ToJavaScript(javascript);
+ }
+ javascript << FX_WSTRC(L"\", ");
+ javascript << FX_WSTRC(L"\"");
+ javascript << m_wsIdentifier;
+ javascript << FX_WSTRC(L"\", ");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L")");
+}
+CXFA_FMMethodCallExpression::CXFA_FMMethodCallExpression(
+ FX_DWORD line,
+ CXFA_FMSimpleExpression* pAccessorExp1,
+ CXFA_FMSimpleExpression* pCallExp)
+ : CXFA_FMBinExpression(line, TOKdot, pAccessorExp1, pCallExp) {}
+void CXFA_FMMethodCallExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
+ javascript << FX_WSTRC(L"(\nfunction ()\n{\n");
+ javascript << FX_WSTRC(L"var method_return_value = null;\n");
+ javascript << FX_WSTRC(L"var accessor_object = ");
+ m_pExp1->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L";\n");
+ javascript << FX_WSTRC(L"if (");
+ javascript << gs_lpStrExpFuncName[ISFMARRAY];
+ javascript << FX_WSTRC(L"(accessor_object))\n{\n");
+ javascript << FX_WSTRC(
+ L"for(var index = accessor_object.length - 1; index > 1; index--)\n{\n");
+ javascript << FX_WSTRC(L"method_return_value = accessor_object[index].");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L";\n}\n}\n");
+ javascript << FX_WSTRC(L"else\n{\nmethod_return_value = accessor_object.");
+ m_pExp2->ToJavaScript(javascript);
+ javascript << FX_WSTRC(L";\n}\n");
+ javascript << FX_WSTRC(L"return method_return_value;\n");
+ javascript << FX_WSTRC(L"}\n).call(this)");
+}