Chromium Code Reviews| 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..a46e7e22fde6f5e1aed8c72529a08b9dbf4dff16 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()); |
| + |
|
Tom Sepez
2016/06/07 20:36:19
nit: blank line not really needed here. I'd put i
dsinclair
2016/06/07 20:51:48
Done.
|
| + 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()) || |
|
Tom Sepez
2016/06/07 20:36:19
me not like the redundant calls to Is*() here. I
dsinclair
2016/06/07 20:51:48
This currently isn't great but until we move rgVal
|
| + 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())) { |
|
Tom Sepez
2016/06/07 20:36:19
Is this just cut n' paste?
dsinclair
2016/06/07 20:51:48
I moved the early return up, out-dented and then f
|
| + 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); |
|
Tom Sepez
2016/06/07 20:36:19
same here?
dsinclair
2016/06/07 20:51:48
ditto, early returns and cleanup.
|
| + 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,38 @@ 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') { |
| + chTemp += (ch - '0') * (!iCount ? 16 : 1); |
|
Tom Sepez
2016/06/07 20:36:19
this is stupid. Premultiply icount by 16 and add
dsinclair
2016/06/07 20:51:48
Acknowledged.
|
| + } 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 +3541,54 @@ 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; |
| + iCode *= 16; |
|
Tom Sepez
2016/06/07 20:36:19
Maybe as a follow-up when you consolidate these:
dsinclair
2016/06/07 20:51:48
Added todo.
|
| ch = pData[i]; |
| } |
| - strString[iStrIndex] = 0; |
| + iCode /= 16; |
|
Tom Sepez
2016/06/07 20:36:20
then you wont' have to post-divide and can avoid o
dsinclair
2016/06/07 20:51:48
Acknowledged.
|
| } |
| } 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 +3601,7 @@ void CXFA_FM2JSContext::DecodeHTML(const CFX_ByteStringC& szHTMLString, |
| ++i; |
| } |
| wsResultBuf.AppendChar(0); |
| + |
| szResultString.Clear(); |
| szResultString << FX_UTF8Encode(wsResultBuf.GetBuffer(), |
| wsResultBuf.GetLength()) |
| @@ -3626,51 +3622,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 +3705,7 @@ void CXFA_FM2JSContext::DecodeXML(const CFX_ByteStringC& szXMLString, |
| iCode = 0; |
| } |
| wsXMLBuf.AppendChar(0); |
| + |
| szResultString.Clear(); |
| szResultString << FX_UTF8Encode(wsXMLBuf.GetBuffer(), wsXMLBuf.GetLength()) |
| .AsStringC(); |