Index: xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
index 0ad2635c64f0ba87aff95590b2a30d25b11200de..01c77e25b5adf80f4661a77bdb6182b6582cfcb5 100644 |
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp |
@@ -2959,56 +2959,55 @@ void CXFA_FM2JSContext::Oneof(CFXJSE_Value* pThis, |
void CXFA_FM2JSContext::Within(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
- if (args.GetLength() == 3) { |
- std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
- if (FXJSE_Value_IsNull(argOne.get())) { |
- FXJSE_Value_SetUndefined(args.GetReturnValue()); |
- } else { |
- std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1); |
- std::unique_ptr<CFXJSE_Value> argHeight = GetSimpleValue(pThis, args, 2); |
- if (FXJSE_Value_IsNumber(argOne.get())) { |
- FX_FLOAT oneNumber = ValueToFloat(pThis, argOne.get()); |
- FX_FLOAT lowNumber = ValueToFloat(pThis, argLow.get()); |
- FX_FLOAT heightNumber = ValueToFloat(pThis, argHeight.get()); |
- FXJSE_Value_SetInteger( |
- args.GetReturnValue(), |
- ((oneNumber >= lowNumber) && (oneNumber <= heightNumber))); |
- } else { |
- CFX_ByteString oneString; |
- CFX_ByteString lowString; |
- CFX_ByteString heightString; |
- ValueToUTF8String(argOne.get(), oneString); |
- ValueToUTF8String(argLow.get(), lowString); |
- ValueToUTF8String(argHeight.get(), heightString); |
- FXJSE_Value_SetInteger( |
- args.GetReturnValue(), |
- ((oneString.Compare(lowString.AsStringC()) >= 0) && |
- (oneString.Compare(heightString.AsStringC()) <= 0))); |
- } |
- } |
- } else { |
+ if (args.GetLength() != 3) { |
ToJSContext(pThis, nullptr) |
->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Within"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
+ if (FXJSE_Value_IsNull(argOne.get())) { |
+ FXJSE_Value_SetUndefined(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1); |
+ std::unique_ptr<CFXJSE_Value> argHigh = GetSimpleValue(pThis, args, 2); |
+ if (FXJSE_Value_IsNumber(argOne.get())) { |
+ FX_FLOAT oneNumber = ValueToFloat(pThis, argOne.get()); |
+ FX_FLOAT lowNumber = ValueToFloat(pThis, argLow.get()); |
+ FX_FLOAT heightNumber = ValueToFloat(pThis, argHigh.get()); |
+ FXJSE_Value_SetInteger( |
+ args.GetReturnValue(), |
+ ((oneNumber >= lowNumber) && (oneNumber <= heightNumber))); |
+ return; |
} |
+ |
+ CFX_ByteString oneString; |
+ CFX_ByteString lowString; |
+ CFX_ByteString heightString; |
+ ValueToUTF8String(argOne.get(), oneString); |
+ ValueToUTF8String(argLow.get(), lowString); |
+ ValueToUTF8String(argHigh.get(), heightString); |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), |
+ ((oneString.Compare(lowString.AsStringC()) >= 0) && |
+ (oneString.Compare(heightString.AsStringC()) <= 0))); |
} |
// static |
void CXFA_FM2JSContext::If(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
- if (args.GetLength() == 3) { |
- std::unique_ptr<CFXJSE_Value> argCondition = GetSimpleValue(pThis, args, 0); |
- std::unique_ptr<CFXJSE_Value> argFirstValue = |
- GetSimpleValue(pThis, args, 1); |
- std::unique_ptr<CFXJSE_Value> argSecondValue = |
- GetSimpleValue(pThis, args, 2); |
- FX_BOOL bCondition = FXJSE_Value_ToBoolean(argCondition.get()); |
- FXJSE_Value_Set(args.GetReturnValue(), |
- bCondition ? argFirstValue.get() : argSecondValue.get()); |
- } else { |
+ if (args.GetLength() != 3) { |
ToJSContext(pThis, nullptr) |
->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"If"); |
+ return; |
} |
+ |
+ FXJSE_Value_Set(args.GetReturnValue(), |
+ FXJSE_Value_ToBoolean(GetSimpleValue(pThis, args, 0).get()) |
+ ? GetSimpleValue(pThis, args, 1).get() |
+ : GetSimpleValue(pThis, args, 2).get()); |
} |
// static |
@@ -3016,34 +3015,37 @@ void CXFA_FM2JSContext::Eval(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
- if (args.GetLength() == 1) { |
- v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
- std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0); |
- CFX_ByteString utf8ScriptString; |
- ValueToUTF8String(scriptValue.get(), utf8ScriptString); |
- if (utf8ScriptString.IsEmpty()) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CFX_WideTextBuf wsJavaScriptBuf; |
- CFX_WideString javaScript; |
- CFX_WideString wsError; |
- CXFA_FM2JSContext::Translate( |
- CFX_WideString::FromUTF8(utf8ScriptString.AsStringC()).AsStringC(), |
- wsJavaScriptBuf, wsError); |
- CFXJSE_Context* pNewContext = |
- FXJSE_Context_Create(pIsolate, nullptr, nullptr); |
- std::unique_ptr<CFXJSE_Value> returnValue(new CFXJSE_Value(pIsolate)); |
- javaScript = wsJavaScriptBuf.AsStringC(); |
- FXJSE_ExecuteScript( |
- pNewContext, |
- FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).c_str(), |
- returnValue.get()); |
- FXJSE_Value_Set(args.GetReturnValue(), returnValue.get()); |
- FXJSE_Context_Release(pNewContext); |
- } |
- } else { |
+ if (args.GetLength() != 1) { |
pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Eval"); |
+ return; |
+ } |
+ |
+ v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
+ std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0); |
+ CFX_ByteString utf8ScriptString; |
+ ValueToUTF8String(scriptValue.get(), utf8ScriptString); |
+ if (utf8ScriptString.IsEmpty()) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
} |
+ |
+ CFX_WideTextBuf wsJavaScriptBuf; |
+ CFX_WideString wsError; |
+ CXFA_FM2JSContext::Translate( |
+ CFX_WideString::FromUTF8(utf8ScriptString.AsStringC()).AsStringC(), |
+ wsJavaScriptBuf, wsError); |
+ CFXJSE_Context* pNewContext = |
+ FXJSE_Context_Create(pIsolate, nullptr, nullptr); |
+ |
+ std::unique_ptr<CFXJSE_Value> returnValue(new CFXJSE_Value(pIsolate)); |
+ CFX_WideString javaScript(wsJavaScriptBuf.AsStringC()); |
+ FXJSE_ExecuteScript( |
+ pNewContext, |
+ FX_UTF8Encode(javaScript.c_str(), javaScript.GetLength()).c_str(), |
+ returnValue.get()); |
+ |
+ FXJSE_Value_Set(args.GetReturnValue(), returnValue.get()); |
+ FXJSE_Context_Release(pNewContext); |
} |
// static |
@@ -3052,182 +3054,180 @@ void CXFA_FM2JSContext::Ref(CFXJSE_Value* pThis, |
CFXJSE_Arguments& args) { |
CXFA_FM2JSContext* pContext = ToJSContext(pThis, nullptr); |
v8::Isolate* pIsolate = pContext->GetScriptRuntime(); |
- if (args.GetLength() == 1) { |
- std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
- if (FXJSE_Value_IsNull(argOne.get())) { |
- CFXJSE_Value* rgValues[3]; |
- for (int32_t i = 0; i < 3; i++) |
- rgValues[i] = new CFXJSE_Value(pIsolate); |
- |
- FXJSE_Value_SetInteger(rgValues[0], 4); |
- FXJSE_Value_SetNull(rgValues[1]); |
- FXJSE_Value_SetNull(rgValues[2]); |
- FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); |
- for (int32_t i = 0; i < 3; i++) |
- delete rgValues[i]; |
+ if (args.GetLength() != 1) { |
+ pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ref"); |
+ return; |
+ } |
- } else if (FXJSE_Value_IsArray(argOne.get())) { |
-#ifndef NDEBUG |
- std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get()); |
- ASSERT(FXJSE_Value_ToInteger(lengthValue.get()) >= 3); |
-#endif |
- std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
- std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); |
- FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); |
- if (FXJSE_Value_IsNull(jsObjectValue.get())) { |
- pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); |
- } else if (FXJSE_Value_IsNull(propertyValue.get()) && |
- (!FXJSE_Value_IsNull(jsObjectValue.get()))) { |
- CFXJSE_Value* rgValues[3]; |
- for (int32_t i = 0; i < 3; i++) |
- rgValues[i] = new CFXJSE_Value(pIsolate); |
+ std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); |
+ if (!FXJSE_Value_IsArray(argOne.get()) && |
+ !FXJSE_Value_IsObject(argOne.get()) && |
+ !FXJSE_Value_IsBoolean(argOne.get()) && |
+ !FXJSE_Value_IsUTF8String(argOne.get()) && |
+ !FXJSE_Value_IsNull(argOne.get()) && |
+ !FXJSE_Value_IsNumber(argOne.get())) { |
+ pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
+ } |
- FXJSE_Value_SetInteger(rgValues[0], 3); |
- FXJSE_Value_SetNull(rgValues[1]); |
- FXJSE_Value_Set(rgValues[2], jsObjectValue.get()); |
- FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); |
- for (int32_t i = 0; i < 3; i++) |
- delete rgValues[i]; |
+ if (FXJSE_Value_IsBoolean(argOne.get()) || |
+ FXJSE_Value_IsUTF8String(argOne.get()) || |
+ FXJSE_Value_IsNumber(argOne.get())) { |
+ FXJSE_Value_Set(args.GetReturnValue(), argOne.get()); |
+ return; |
+ } |
- } else { |
- pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); |
- } |
- } else if (FXJSE_Value_IsObject(argOne.get())) { |
- CFXJSE_Value* rgValues[3]; |
- for (int32_t i = 0; i < 3; i++) |
- rgValues[i] = new CFXJSE_Value(pIsolate); |
+ CFXJSE_Value* rgValues[3]; |
+ for (int32_t i = 0; i < 3; i++) |
+ rgValues[i] = new CFXJSE_Value(pIsolate); |
- FXJSE_Value_SetInteger(rgValues[0], 3); |
- FXJSE_Value_SetNull(rgValues[1]); |
- FXJSE_Value_Set(rgValues[2], argOne.get()); |
- FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); |
+ int intVal = 3; |
+ if (FXJSE_Value_IsNull(argOne.get())) { |
+ intVal = 4; |
+ FXJSE_Value_SetNull(rgValues[2]); |
+ } else if (FXJSE_Value_IsArray(argOne.get())) { |
+#ifndef NDEBUG |
+ std::unique_ptr<CFXJSE_Value> lengthValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectProp(argOne.get(), "length", lengthValue.get()); |
+ ASSERT(FXJSE_Value_ToInteger(lengthValue.get()) >= 3); |
+#endif |
+ std::unique_ptr<CFXJSE_Value> propertyValue(new CFXJSE_Value(pIsolate)); |
+ std::unique_ptr<CFXJSE_Value> jsObjectValue(new CFXJSE_Value(pIsolate)); |
+ FXJSE_Value_GetObjectPropByIdx(argOne.get(), 1, propertyValue.get()); |
+ FXJSE_Value_GetObjectPropByIdx(argOne.get(), 2, jsObjectValue.get()); |
+ if (!FXJSE_Value_IsNull(propertyValue.get()) || |
+ FXJSE_Value_IsNull(jsObjectValue.get())) { |
for (int32_t i = 0; i < 3; i++) |
delete rgValues[i]; |
- } else if (FXJSE_Value_IsBoolean(argOne.get()) || |
- FXJSE_Value_IsUTF8String(argOne.get()) || |
- FXJSE_Value_IsNumber(argOne.get())) { |
- FXJSE_Value_Set(args.GetReturnValue(), argOne.get()); |
- } else { |
+ |
pContext->ThrowException(XFA_IDS_ARGUMENT_MISMATCH); |
+ return; |
} |
- } else { |
- pContext->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Ref"); |
+ |
+ FXJSE_Value_Set(rgValues[2], jsObjectValue.get()); |
+ } else if (FXJSE_Value_IsObject(argOne.get())) { |
+ FXJSE_Value_Set(rgValues[2], argOne.get()); |
} |
+ |
+ FXJSE_Value_SetInteger(rgValues[0], intVal); |
+ FXJSE_Value_SetNull(rgValues[1]); |
+ FXJSE_Value_SetArray(args.GetReturnValue(), 3, rgValues); |
+ |
+ for (int32_t i = 0; i < 3; i++) |
+ delete rgValues[i]; |
} |
// static |
void CXFA_FM2JSContext::UnitType(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
- if (args.GetLength() == 1) { |
- std::unique_ptr<CFXJSE_Value> unitspanValue = |
- GetSimpleValue(pThis, args, 0); |
- if (FXJSE_Value_IsNull(unitspanValue.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- return; |
- } |
- CFX_ByteString unitspanString; |
- ValueToUTF8String(unitspanValue.get(), unitspanString); |
- if (unitspanString.IsEmpty()) { |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); |
- } else { |
- enum XFA_FM2JS_VALUETYPE_ParserStatus { |
- VALUETYPE_START, |
- VALUETYPE_HAVEINVALIDCHAR, |
- VALUETYPE_HAVEDIGIT, |
- VALUETYPE_HAVEDIGITWHITE, |
- VALUETYPE_ISCM, |
- VALUETYPE_ISMM, |
- VALUETYPE_ISPT, |
- VALUETYPE_ISMP, |
- VALUETYPE_ISIN, |
- }; |
- unitspanString.MakeLower(); |
- CFX_WideString wsTypeString = |
- CFX_WideString::FromUTF8(unitspanString.AsStringC()); |
- const FX_WCHAR* pData = wsTypeString.c_str(); |
- int32_t u = 0; |
- int32_t uLen = wsTypeString.GetLength(); |
- while (IsWhitespace(pData[u])) |
- u++; |
- |
- XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START; |
- FX_WCHAR typeChar; |
- while (u < uLen) { |
- typeChar = pData[u]; |
- if (IsWhitespace(typeChar)) { |
- if (eParserStatus == VALUETYPE_HAVEDIGIT || |
- eParserStatus == VALUETYPE_HAVEDIGITWHITE) { |
- eParserStatus = VALUETYPE_HAVEDIGITWHITE; |
- } else { |
- eParserStatus = VALUETYPE_ISIN; |
- break; |
- } |
- } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' || |
- typeChar == '.') { |
- if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) { |
- eParserStatus = VALUETYPE_ISIN; |
- break; |
- } else { |
- eParserStatus = VALUETYPE_HAVEDIGIT; |
- } |
- } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) { |
- FX_WCHAR nextChar = pData[u + 1]; |
- if ((eParserStatus == VALUETYPE_START || |
- eParserStatus == VALUETYPE_HAVEDIGIT || |
- eParserStatus == VALUETYPE_HAVEDIGITWHITE) && |
- (nextChar > '9' || nextChar < '0') && nextChar != '.' && |
- nextChar != '-') { |
- eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT; |
- break; |
- } else { |
- eParserStatus = VALUETYPE_HAVEINVALIDCHAR; |
- } |
- } else if (typeChar == 'm' && (u + 1 < uLen)) { |
- FX_WCHAR nextChar = pData[u + 1]; |
- if ((eParserStatus == VALUETYPE_START || |
- eParserStatus == VALUETYPE_HAVEDIGIT || |
- eParserStatus == VALUETYPE_HAVEDIGITWHITE) && |
- (nextChar > '9' || nextChar < '0') && nextChar != '.' && |
- nextChar != '-') { |
- eParserStatus = VALUETYPE_ISMM; |
- if (nextChar == 'p' || |
- ((u + 5 < uLen) && pData[u + 1] == 'i' && pData[u + 2] == 'l' && |
- pData[u + 3] == 'l' && pData[u + 4] == 'i' && |
- pData[u + 5] == 'p')) { |
- eParserStatus = VALUETYPE_ISMP; |
- } |
- break; |
- } |
- } else { |
- eParserStatus = VALUETYPE_HAVEINVALIDCHAR; |
- } |
- u++; |
+ if (args.GetLength() != 1) { |
+ ToJSContext(pThis, nullptr) |
+ ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitType"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0); |
+ if (FXJSE_Value_IsNull(unitspanValue.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ CFX_ByteString unitspanString; |
+ ValueToUTF8String(unitspanValue.get(), unitspanString); |
+ if (unitspanString.IsEmpty()) { |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); |
+ return; |
+ } |
+ |
+ enum XFA_FM2JS_VALUETYPE_ParserStatus { |
+ VALUETYPE_START, |
+ VALUETYPE_HAVEINVALIDCHAR, |
+ VALUETYPE_HAVEDIGIT, |
+ VALUETYPE_HAVEDIGITWHITE, |
+ VALUETYPE_ISCM, |
+ VALUETYPE_ISMM, |
+ VALUETYPE_ISPT, |
+ VALUETYPE_ISMP, |
+ VALUETYPE_ISIN, |
+ }; |
+ unitspanString.MakeLower(); |
+ CFX_WideString wsTypeString = |
+ CFX_WideString::FromUTF8(unitspanString.AsStringC()); |
+ const FX_WCHAR* pData = wsTypeString.c_str(); |
+ int32_t u = 0; |
+ int32_t uLen = wsTypeString.GetLength(); |
+ while (IsWhitespace(pData[u])) |
+ u++; |
+ |
+ XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START; |
+ FX_WCHAR typeChar; |
+ // TODO(dsinclair): Cleanup this parser, figure out what the various checks |
+ // are for. |
+ while (u < uLen) { |
+ typeChar = pData[u]; |
+ if (IsWhitespace(typeChar)) { |
+ if (eParserStatus != VALUETYPE_HAVEDIGIT && |
+ eParserStatus != VALUETYPE_HAVEDIGITWHITE) { |
+ eParserStatus = VALUETYPE_ISIN; |
+ break; |
} |
- switch (eParserStatus) { |
- case VALUETYPE_ISCM: |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm"); |
- break; |
- case VALUETYPE_ISMM: |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm"); |
- break; |
- case VALUETYPE_ISPT: |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt"); |
- break; |
- case VALUETYPE_ISMP: |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp"); |
- break; |
- default: |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); |
- break; |
+ eParserStatus = VALUETYPE_HAVEDIGITWHITE; |
+ } else if ((typeChar >= '0' && typeChar <= '9') || typeChar == '-' || |
+ typeChar == '.') { |
+ if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) { |
+ eParserStatus = VALUETYPE_ISIN; |
+ break; |
+ } |
+ eParserStatus = VALUETYPE_HAVEDIGIT; |
+ } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) { |
+ FX_WCHAR nextChar = pData[u + 1]; |
+ if ((eParserStatus == VALUETYPE_START || |
+ eParserStatus == VALUETYPE_HAVEDIGIT || |
+ eParserStatus == VALUETYPE_HAVEDIGITWHITE) && |
+ (nextChar > '9' || nextChar < '0') && nextChar != '.' && |
+ nextChar != '-') { |
+ eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT; |
+ break; |
+ } |
+ eParserStatus = VALUETYPE_HAVEINVALIDCHAR; |
+ } else if (typeChar == 'm' && (u + 1 < uLen)) { |
+ FX_WCHAR nextChar = pData[u + 1]; |
+ if ((eParserStatus == VALUETYPE_START || |
+ eParserStatus == VALUETYPE_HAVEDIGIT || |
+ eParserStatus == VALUETYPE_HAVEDIGITWHITE) && |
+ (nextChar > '9' || nextChar < '0') && nextChar != '.' && |
+ nextChar != '-') { |
+ eParserStatus = VALUETYPE_ISMM; |
+ if (nextChar == 'p' || ((u + 5 < uLen) && pData[u + 1] == 'i' && |
+ pData[u + 2] == 'l' && pData[u + 3] == 'l' && |
+ pData[u + 4] == 'i' && pData[u + 5] == 'p')) { |
+ eParserStatus = VALUETYPE_ISMP; |
+ } |
+ break; |
} |
+ } else { |
+ eParserStatus = VALUETYPE_HAVEINVALIDCHAR; |
} |
- } else { |
- ToJSContext(pThis, nullptr) |
- ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitType"); |
+ u++; |
+ } |
+ switch (eParserStatus) { |
+ case VALUETYPE_ISCM: |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "cm"); |
+ break; |
+ case VALUETYPE_ISMM: |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mm"); |
+ break; |
+ case VALUETYPE_ISPT: |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "pt"); |
+ break; |
+ case VALUETYPE_ISMP: |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "mp"); |
+ break; |
+ default: |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), "in"); |
+ break; |
} |
} |
@@ -3236,174 +3236,174 @@ void CXFA_FM2JSContext::UnitValue(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
int32_t argc = args.GetLength(); |
- if ((argc == 1) || (argc == 2)) { |
- std::unique_ptr<CFXJSE_Value> unitspanValue = |
- GetSimpleValue(pThis, args, 0); |
- CFX_ByteString unitspanString; |
- FX_DOUBLE dFirstNumber = 0; |
- CFX_ByteString strFirstUnit; |
- CFX_ByteString strUnit; |
- if (FXJSE_Value_IsNull(unitspanValue.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- ValueToUTF8String(unitspanValue.get(), unitspanString); |
- const FX_CHAR* pData = unitspanString.c_str(); |
- if (pData) { |
- int32_t u = 0; |
- while (IsWhitespace(pData[u])) |
- ++u; |
- |
- while (u < unitspanString.GetLength()) { |
- if ((pData[u] > '9' || pData[u] < '0') && pData[u] != '.' && |
- pData[u] != '-') { |
- break; |
- } |
- ++u; |
- } |
- FX_CHAR* pTemp = nullptr; |
- dFirstNumber = strtod(pData, &pTemp); |
- while (IsWhitespace(pData[u])) |
- ++u; |
- |
- int32_t uLen = unitspanString.GetLength(); |
- while (u < uLen) { |
- if (pData[u] == ' ') { |
- break; |
- } |
- strFirstUnit += pData[u]; |
- ++u; |
- } |
- strFirstUnit.MakeLower(); |
- if (argc == 2) { |
- std::unique_ptr<CFXJSE_Value> unitValue = |
- GetSimpleValue(pThis, args, 1); |
- CFX_ByteString unitTempString; |
- ValueToUTF8String(unitValue.get(), unitTempString); |
- const FX_CHAR* pChar = unitTempString.c_str(); |
- int32_t uVal = 0; |
- while (IsWhitespace(pChar[uVal])) |
- ++uVal; |
- |
- while (uVal < unitTempString.GetLength()) { |
- if ((pChar[uVal] > '9' || pChar[uVal] < '0') && |
- pChar[uVal] != '.') { |
- break; |
- } |
- ++uVal; |
- } |
- while (IsWhitespace(pChar[uVal])) |
- ++uVal; |
+ if (argc < 1 || argc > 2) { |
+ ToJSContext(pThis, nullptr) |
+ ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitValue"); |
+ return; |
+ } |
- int32_t uValLen = unitTempString.GetLength(); |
- while (uVal < uValLen) { |
- if (pChar[uVal] == ' ') { |
- break; |
- } |
- strUnit += pChar[uVal]; |
- ++uVal; |
- } |
- strUnit.MakeLower(); |
- } else { |
- strUnit = strFirstUnit; |
- } |
- FX_DOUBLE dResult = 0; |
- if (strFirstUnit == "in" || strFirstUnit == "inches") { |
- if (strUnit == "mm" || strUnit == "millimeters") { |
- dResult = dFirstNumber * 25.4; |
- } else if (strUnit == "cm" || strUnit == "centimeters") { |
- dResult = dFirstNumber * 2.54; |
- } else if (strUnit == "pt" || strUnit == "points") { |
- dResult = dFirstNumber / 72; |
- } else if (strUnit == "mp" || strUnit == "millipoints") { |
- dResult = dFirstNumber / 72000; |
- } else { |
- dResult = dFirstNumber; |
- } |
- } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") { |
- if (strUnit == "mm" || strUnit == "millimeters") { |
- dResult = dFirstNumber; |
- } else if (strUnit == "cm" || strUnit == "centimeters") { |
- dResult = dFirstNumber / 10; |
- } else if (strUnit == "pt" || strUnit == "points") { |
- dResult = dFirstNumber / 25.4 / 72; |
- } else if (strUnit == "mp" || strUnit == "millipoints") { |
- dResult = dFirstNumber / 25.4 / 72000; |
- } else { |
- dResult = dFirstNumber / 25.4; |
- } |
- } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") { |
- if (strUnit == "mm" || strUnit == "millimeters") { |
- dResult = dFirstNumber * 10; |
- } else if (strUnit == "cm" || strUnit == "centimeters") { |
- dResult = dFirstNumber; |
- } else if (strUnit == "pt" || strUnit == "points") { |
- dResult = dFirstNumber / 2.54 / 72; |
- } else if (strUnit == "mp" || strUnit == "millipoints") { |
- dResult = dFirstNumber / 2.54 / 72000; |
- } else { |
- dResult = dFirstNumber / 2.54; |
- } |
- } else if (strFirstUnit == "pt" || strFirstUnit == "points") { |
- if (strUnit == "mm" || strUnit == "millimeters") { |
- dResult = dFirstNumber / 72 * 25.4; |
- } else if (strUnit == "cm" || strUnit == "centimeters") { |
- dResult = dFirstNumber / 72 * 2.54; |
- } else if (strUnit == "pt" || strUnit == "points") { |
- dResult = dFirstNumber; |
- } else if (strUnit == "mp" || strUnit == "millipoints") { |
- dResult = dFirstNumber * 1000; |
- } else { |
- dResult = dFirstNumber / 72; |
- } |
- } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") { |
- if (strUnit == "mm" || strUnit == "millimeters") { |
- dResult = dFirstNumber / 72000 * 25.4; |
- } else if (strUnit == "cm" || strUnit == "centimeters") { |
- dResult = dFirstNumber / 72000 * 2.54; |
- } else if (strUnit == "pt" || strUnit == "points") { |
- dResult = dFirstNumber / 1000; |
- } else if (strUnit == "mp" || strUnit == "millipoints") { |
- dResult = dFirstNumber; |
- } else { |
- dResult = dFirstNumber / 72000; |
- } |
- } |
- FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); |
- } else { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
+ std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0); |
+ if (FXJSE_Value_IsNull(unitspanValue.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ CFX_ByteString unitspanString; |
+ ValueToUTF8String(unitspanValue.get(), unitspanString); |
+ const FX_CHAR* pData = unitspanString.c_str(); |
+ if (!pData) { |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), 0); |
+ return; |
+ } |
+ |
+ int32_t u = 0; |
+ while (IsWhitespace(pData[u])) |
+ ++u; |
+ |
+ while (u < unitspanString.GetLength()) { |
+ if ((pData[u] > '9' || pData[u] < '0') && pData[u] != '.' && |
+ pData[u] != '-') { |
+ break; |
+ } |
+ ++u; |
+ } |
+ |
+ FX_CHAR* pTemp = nullptr; |
+ FX_DOUBLE dFirstNumber = strtod(pData, &pTemp); |
+ while (IsWhitespace(pData[u])) |
+ ++u; |
+ |
+ int32_t uLen = unitspanString.GetLength(); |
+ CFX_ByteString strFirstUnit; |
+ while (u < uLen) { |
+ if (pData[u] == ' ') |
+ break; |
+ |
+ strFirstUnit += pData[u]; |
+ ++u; |
+ } |
+ strFirstUnit.MakeLower(); |
+ |
+ CFX_ByteString strUnit; |
+ if (argc > 1) { |
+ std::unique_ptr<CFXJSE_Value> unitValue = GetSimpleValue(pThis, args, 1); |
+ CFX_ByteString unitTempString; |
+ ValueToUTF8String(unitValue.get(), unitTempString); |
+ const FX_CHAR* pChar = unitTempString.c_str(); |
+ int32_t uVal = 0; |
+ while (IsWhitespace(pChar[uVal])) |
+ ++uVal; |
+ |
+ while (uVal < unitTempString.GetLength()) { |
+ if ((pChar[uVal] > '9' || pChar[uVal] < '0') && pChar[uVal] != '.') { |
+ break; |
} |
+ ++uVal; |
} |
+ while (IsWhitespace(pChar[uVal])) |
+ ++uVal; |
+ |
+ int32_t uValLen = unitTempString.GetLength(); |
+ while (uVal < uValLen) { |
+ if (pChar[uVal] == ' ') |
+ break; |
+ |
+ strUnit += pChar[uVal]; |
+ ++uVal; |
+ } |
+ strUnit.MakeLower(); |
} else { |
- ToJSContext(pThis, nullptr) |
- ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"UnitValue"); |
+ strUnit = strFirstUnit; |
+ } |
+ |
+ FX_DOUBLE dResult = 0; |
+ if (strFirstUnit == "in" || strFirstUnit == "inches") { |
+ if (strUnit == "mm" || strUnit == "millimeters") |
+ dResult = dFirstNumber * 25.4; |
+ else if (strUnit == "cm" || strUnit == "centimeters") |
+ dResult = dFirstNumber * 2.54; |
+ else if (strUnit == "pt" || strUnit == "points") |
+ dResult = dFirstNumber / 72; |
+ else if (strUnit == "mp" || strUnit == "millipoints") |
+ dResult = dFirstNumber / 72000; |
+ else |
+ dResult = dFirstNumber; |
+ } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") { |
+ if (strUnit == "mm" || strUnit == "millimeters") |
+ dResult = dFirstNumber; |
+ else if (strUnit == "cm" || strUnit == "centimeters") |
+ dResult = dFirstNumber / 10; |
+ else if (strUnit == "pt" || strUnit == "points") |
+ dResult = dFirstNumber / 25.4 / 72; |
+ else if (strUnit == "mp" || strUnit == "millipoints") |
+ dResult = dFirstNumber / 25.4 / 72000; |
+ else |
+ dResult = dFirstNumber / 25.4; |
+ } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") { |
+ if (strUnit == "mm" || strUnit == "millimeters") |
+ dResult = dFirstNumber * 10; |
+ else if (strUnit == "cm" || strUnit == "centimeters") |
+ dResult = dFirstNumber; |
+ else if (strUnit == "pt" || strUnit == "points") |
+ dResult = dFirstNumber / 2.54 / 72; |
+ else if (strUnit == "mp" || strUnit == "millipoints") |
+ dResult = dFirstNumber / 2.54 / 72000; |
+ else |
+ dResult = dFirstNumber / 2.54; |
+ } else if (strFirstUnit == "pt" || strFirstUnit == "points") { |
+ if (strUnit == "mm" || strUnit == "millimeters") |
+ dResult = dFirstNumber / 72 * 25.4; |
+ else if (strUnit == "cm" || strUnit == "centimeters") |
+ dResult = dFirstNumber / 72 * 2.54; |
+ else if (strUnit == "pt" || strUnit == "points") |
+ dResult = dFirstNumber; |
+ else if (strUnit == "mp" || strUnit == "millipoints") |
+ dResult = dFirstNumber * 1000; |
+ else |
+ dResult = dFirstNumber / 72; |
+ } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") { |
+ if (strUnit == "mm" || strUnit == "millimeters") |
+ dResult = dFirstNumber / 72000 * 25.4; |
+ else if (strUnit == "cm" || strUnit == "centimeters") |
+ dResult = dFirstNumber / 72000 * 2.54; |
+ else if (strUnit == "pt" || strUnit == "points") |
+ dResult = dFirstNumber / 1000; |
+ else if (strUnit == "mp" || strUnit == "millipoints") |
+ dResult = dFirstNumber; |
+ else |
+ dResult = dFirstNumber / 72000; |
} |
+ FXJSE_Value_SetDouble(args.GetReturnValue(), dResult); |
} |
// static |
void CXFA_FM2JSContext::At(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
- if (args.GetLength() == 2) { |
- std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
- std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); |
- if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CFX_ByteString stringTwo; |
- ValueToUTF8String(argTwo.get(), stringTwo); |
- if (stringTwo.IsEmpty()) { |
- FXJSE_Value_SetInteger(args.GetReturnValue(), 1); |
- } else { |
- CFX_ByteString stringOne; |
- ValueToUTF8String(argOne.get(), stringOne); |
- FX_STRSIZE iPosition = stringOne.Find(stringTwo.AsStringC()); |
- FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1); |
- } |
- } |
- } else { |
+ if (args.GetLength() != 2) { |
ToJSContext(pThis, nullptr) |
->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"At"); |
+ return; |
+ } |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
+ std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); |
+ if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ CFX_ByteString stringTwo; |
+ ValueToUTF8String(argTwo.get(), stringTwo); |
+ if (stringTwo.IsEmpty()) { |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), 1); |
+ return; |
} |
+ |
+ CFX_ByteString stringOne; |
+ ValueToUTF8String(argOne.get(), stringOne); |
+ FX_STRSIZE iPosition = stringOne.Find(stringTwo.AsStringC()); |
+ FXJSE_Value_SetInteger(args.GetReturnValue(), iPosition + 1); |
} |
// static |
@@ -3411,30 +3411,32 @@ void CXFA_FM2JSContext::Concat(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
int32_t argc = args.GetLength(); |
- if (argc > 0) { |
- CFX_ByteString resultString; |
- FX_BOOL bAllNull = TRUE; |
- |
- for (int32_t i = 0; i < argc; i++) { |
- std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i); |
- if (!ValueIsNull(pThis, value.get())) { |
- CFX_ByteString valueStr; |
- ValueToUTF8String(value.get(), valueStr); |
- resultString += valueStr; |
- bAllNull = FALSE; |
- } |
- } |
- |
- if (bAllNull) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), |
- resultString.AsStringC()); |
- } |
- } else { |
+ if (argc < 1) { |
ToJSContext(pThis, nullptr) |
->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Concat"); |
+ return; |
+ } |
+ |
+ CFX_ByteString resultString; |
+ FX_BOOL bAllNull = TRUE; |
+ for (int32_t i = 0; i < argc; i++) { |
+ std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i); |
+ if (ValueIsNull(pThis, value.get())) |
+ continue; |
+ |
+ bAllNull = FALSE; |
+ |
+ CFX_ByteString valueStr; |
+ ValueToUTF8String(value.get(), valueStr); |
+ resultString += valueStr; |
} |
+ |
+ if (bAllNull) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultString.AsStringC()); |
} |
// static |
@@ -3442,41 +3444,49 @@ void CXFA_FM2JSContext::Decode(CFXJSE_Value* pThis, |
const CFX_ByteStringC& szFuncName, |
CFXJSE_Arguments& args) { |
int32_t argc = args.GetLength(); |
+ if (argc < 1 || argc > 2) { |
+ ToJSContext(pThis, nullptr) |
+ ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Decode"); |
+ return; |
+ } |
+ |
if (argc == 1) { |
std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
if (ValueIsNull(pThis, argOne.get())) { |
FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CFX_ByteString toDecodeString; |
- ValueToUTF8String(argOne.get(), toDecodeString); |
- CFX_ByteTextBuf resultBuf; |
- DecodeURL(toDecodeString.AsStringC(), resultBuf); |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC()); |
- } |
- } else if (argc == 2) { |
- std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
- std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); |
- if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { |
- FXJSE_Value_SetNull(args.GetReturnValue()); |
- } else { |
- CFX_ByteString toDecodeString; |
- ValueToUTF8String(argOne.get(), toDecodeString); |
- CFX_ByteString identifyString; |
- ValueToUTF8String(argTwo.get(), identifyString); |
- CFX_ByteTextBuf resultBuf; |
- if (identifyString.EqualNoCase("html")) { |
- DecodeHTML(toDecodeString.AsStringC(), resultBuf); |
- } else if (identifyString.EqualNoCase("xml")) { |
- DecodeXML(toDecodeString.AsStringC(), resultBuf); |
- } else { |
- DecodeURL(toDecodeString.AsStringC(), resultBuf); |
- } |
- FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC()); |
+ return; |
} |
- } else { |
- ToJSContext(pThis, nullptr) |
- ->ThrowException(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"Decode"); |
+ |
+ CFX_ByteString toDecodeString; |
+ ValueToUTF8String(argOne.get(), toDecodeString); |
+ CFX_ByteTextBuf resultBuf; |
+ DecodeURL(toDecodeString.AsStringC(), resultBuf); |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC()); |
+ return; |
} |
+ |
+ std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); |
+ std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); |
+ if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { |
+ FXJSE_Value_SetNull(args.GetReturnValue()); |
+ return; |
+ } |
+ |
+ CFX_ByteString toDecodeString; |
+ ValueToUTF8String(argOne.get(), toDecodeString); |
+ |
+ CFX_ByteString identifyString; |
+ ValueToUTF8String(argTwo.get(), identifyString); |
+ |
+ CFX_ByteTextBuf resultBuf; |
+ if (identifyString.EqualNoCase("html")) |
+ DecodeHTML(toDecodeString.AsStringC(), resultBuf); |
+ else if (identifyString.EqualNoCase("xml")) |
+ DecodeXML(toDecodeString.AsStringC(), resultBuf); |
+ else |
+ DecodeURL(toDecodeString.AsStringC(), resultBuf); |
+ |
+ FXJSE_Value_SetUTF8String(args.GetReturnValue(), resultBuf.AsStringC()); |
} |
// static |
@@ -3484,52 +3494,39 @@ void CXFA_FM2JSContext::DecodeURL(const CFX_ByteStringC& szURLString, |
CFX_ByteTextBuf& szResultString) { |
CFX_WideString wsURLString = CFX_WideString::FromUTF8(szURLString); |
const FX_WCHAR* pData = wsURLString.c_str(); |
- int32_t iLen = wsURLString.GetLength(); |
int32_t i = 0; |
- FX_WCHAR ch = 0; |
- FX_WCHAR chTemp = 0; |
CFX_WideTextBuf wsResultBuf; |
- while (i < iLen) { |
- ch = pData[i]; |
- if ('%' == ch) { |
- chTemp = 0; |
- int32_t iCount = 0; |
- while (iCount < 2) { |
- ++i; |
- ch = pData[i]; |
- if (ch <= '9' && ch >= '0') { |
- if (!iCount) { |
- chTemp += (ch - '0') * 16; |
- } else { |
- chTemp += (ch - '0'); |
- } |
- } else { |
- if (ch <= 'F' && ch >= 'A') { |
- if (!iCount) { |
- chTemp += (ch - 'A' + 10) * 16; |
- } else { |
- chTemp += (ch - 'A' + 10); |
- } |
- } else if (ch <= 'f' && ch >= 'a') { |
- if (!iCount) { |
- chTemp += (ch - 'a' + 10) * 16; |
- } else { |
- chTemp += (ch - 'a' + 10); |
- } |
- } else { |
- wsResultBuf.Clear(); |
- return; |
- } |
- } |
- ++iCount; |
- } |
- wsResultBuf.AppendChar(chTemp); |
- } else { |
+ while (i < wsURLString.GetLength()) { |
+ FX_WCHAR ch = pData[i]; |
+ if ('%' != ch) { |
wsResultBuf.AppendChar(ch); |
+ ++i; |
+ continue; |
+ } |
+ |
+ FX_WCHAR chTemp = 0; |
+ int32_t iCount = 0; |
+ while (iCount < 2) { |
+ ++i; |
+ ch = pData[i]; |
+ if (ch <= '9' && ch >= '0') { |
+ // TODO(dsinclair): Premultiply and add rather then scale. |
+ chTemp += (ch - '0') * (!iCount ? 16 : 1); |
+ } else if (ch <= 'F' && ch >= 'A') { |
+ chTemp += (ch - 'A' + 10) * (!iCount ? 16 : 1); |
+ } else if (ch <= 'f' && ch >= 'a') { |
+ chTemp += (ch - 'a' + 10) * (!iCount ? 16 : 1); |
+ } else { |
+ wsResultBuf.Clear(); |
+ return; |
+ } |
+ ++iCount; |
} |
+ wsResultBuf.AppendChar(chTemp); |
++i; |
} |
wsResultBuf.AppendChar(0); |
+ |
szResultString.Clear(); |
szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), |
wsResultBuf.GetLength()) |
@@ -3545,55 +3542,56 @@ void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString, |
int32_t iLen = wsHTMLString.GetLength(); |
int32_t i = 0; |
int32_t iCode = 0; |
- FX_WCHAR ch = 0; |
const FX_WCHAR* pData = wsHTMLString.c_str(); |
CFX_WideTextBuf wsResultBuf; |
while (i < iLen) { |
+ FX_WCHAR ch = pData[i]; |
+ if (ch != '&') { |
+ wsResultBuf.AppendChar(ch); |
+ ++i; |
+ continue; |
+ } |
+ |
+ ++i; |
ch = pData[i]; |
- if (ch == '&') { |
+ if (ch == '#') { |
++i; |
ch = pData[i]; |
- if (ch == '#') { |
- ++i; |
- ch = pData[i]; |
- if (ch == 'x' || ch == 'X') { |
- ++i; |
- ch = pData[i]; |
- if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || |
- (ch <= 'F' && ch >= 'A')) { |
- while (ch != ';' && i < iLen) { |
- if (ch >= '0' && ch <= '9') { |
- iCode += ch - '0'; |
- } else if (ch <= 'f' && ch >= 'a') { |
- iCode += ch - 'a' + 10; |
- } else if (ch <= 'F' && ch >= 'A') { |
- iCode += ch - 'A' + 10; |
- } else { |
- wsResultBuf.Clear(); |
- return; |
- } |
- ++i; |
- iCode *= 16; |
- ch = pData[i]; |
- } |
- iCode /= 16; |
- } |
- } else { |
- wsResultBuf.Clear(); |
- return; |
- } |
- } else { |
+ if (ch != 'x' && ch != 'X') { |
+ wsResultBuf.Clear(); |
+ return; |
+ } |
+ |
+ ++i; |
+ ch = pData[i]; |
+ if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || |
+ (ch <= 'F' && ch >= 'A')) { |
while (ch != ';' && i < iLen) { |
- strString[iStrIndex++] = ch; |
+ if (ch >= '0' && ch <= '9') { |
+ iCode += ch - '0'; |
+ } else if (ch <= 'f' && ch >= 'a') { |
+ iCode += ch - 'a' + 10; |
+ } else if (ch <= 'F' && ch >= 'A') { |
+ iCode += ch - 'A' + 10; |
+ } else { |
+ wsResultBuf.Clear(); |
+ return; |
+ } |
++i; |
+ // TODO(dsinclair): Postmultiply seems wrong, start at zero |
+ // and pre-multiply then can remove the post divide. |
+ iCode *= 16; |
ch = pData[i]; |
} |
- strString[iStrIndex] = 0; |
+ iCode /= 16; |
} |
} else { |
- wsResultBuf.AppendChar(ch); |
- ++i; |
- continue; |
+ while (ch != ';' && i < iLen) { |
+ strString[iStrIndex++] = ch; |
+ ++i; |
+ ch = pData[i]; |
+ } |
+ strString[iStrIndex] = 0; |
} |
uint32_t iData = 0; |
if (HTMLSTR2Code(strString, iData)) { |
@@ -3606,6 +3604,7 @@ void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString, |
++i; |
} |
wsResultBuf.AppendChar(0); |
+ |
szResultString.Clear(); |
szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), |
wsResultBuf.GetLength()) |
@@ -3626,51 +3625,54 @@ void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString, |
CFX_WideTextBuf wsXMLBuf; |
while (i < iLen) { |
ch = pData[i]; |
- if (ch == '&') { |
+ if (ch != '&') { |
+ wsXMLBuf.AppendChar(ch); |
+ ++i; |
+ continue; |
+ } |
+ |
+ // TODO(dsinclair): This is very similar to DecodeHTML, can they be |
+ // combined? |
+ ++i; |
+ ch = pData[i]; |
+ if (ch == '#') { |
++i; |
ch = pData[i]; |
- if (ch == '#') { |
- ++i; |
- ch = pData[i]; |
- if (ch == 'x' || ch == 'X') { |
- ++i; |
- ch = pData[i]; |
- if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || |
- (ch <= 'F' && ch >= 'A')) { |
- while (ch != ';') { |
- if (ch >= '0' && ch <= '9') { |
- iCode += ch - '0'; |
- } else if (ch <= 'f' && ch >= 'a') { |
- iCode += ch - 'a' + 10; |
- } else if (ch <= 'F' && ch >= 'A') { |
- iCode += ch - 'A' + 10; |
- } else { |
- wsXMLBuf.Clear(); |
- return; |
- } |
- ++i; |
- iCode *= 16; |
- ch = pData[i]; |
- } |
- iCode /= 16; |
+ if (ch != 'x' && ch != 'X') { |
+ wsXMLBuf.Clear(); |
+ return; |
+ } |
+ |
+ ++i; |
+ ch = pData[i]; |
+ if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || |
+ (ch <= 'F' && ch >= 'A')) { |
+ while (ch != ';') { |
+ if (ch >= '0' && ch <= '9') { |
+ iCode += ch - '0'; |
+ } else if (ch <= 'f' && ch >= 'a') { |
+ iCode += ch - 'a' + 10; |
+ } else if (ch <= 'F' && ch >= 'A') { |
+ iCode += ch - 'A' + 10; |
+ } else { |
+ wsXMLBuf.Clear(); |
+ return; |
} |
- } else { |
- wsXMLBuf.Clear(); |
- return; |
- } |
- } else { |
- while (ch != ';' && i < iLen) { |
- strString[iStrIndex++] = ch; |
++i; |
+ iCode *= 16; |
ch = pData[i]; |
} |
- strString[iStrIndex] = 0; |
+ iCode /= 16; |
} |
} else { |
- wsXMLBuf.AppendChar(ch); |
- ++i; |
- continue; |
+ while (ch != ';' && i < iLen) { |
+ strString[iStrIndex++] = ch; |
+ ++i; |
+ ch = pData[i]; |
+ } |
+ strString[iStrIndex] = 0; |
} |
+ |
const FX_WCHAR* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; |
int32_t iIndex = 0; |
while (iIndex < 5) { |
@@ -3706,6 +3708,7 @@ void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString, |
iCode = 0; |
} |
wsXMLBuf.AppendChar(0); |
+ |
szResultString.Clear(); |
szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()) |
.AsStringC(); |