14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_formcalc_context.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <time.h> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm> 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <string> 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility> 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_decimal.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_widetextbuf.h" 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h" 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_random.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fxjs/cfxjse_class.h" 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fxjs/cfxjse_value.h" 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h" 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/stl_util.h" 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffnotify.h" 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/fm2js/cxfa_fmparser.h" 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/fm2js/cxfa_fmtojavascriptdepth.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h" 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localevalue.h" 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h" 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_timezoneprovider.h" 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h" 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst double kFinancialPrecision = 0.00000001; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstruct XFA_FMHtmlReserveCode { 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t m_uCode; 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* m_htmlReserve; 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Sorted by m_htmlReserve 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_FMHtmlReserveCode reservesForDecode[] = { 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {198, L"AElig"}, {193, L"Aacute"}, {194, L"Acirc"}, 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {192, L"Agrave"}, {913, L"Alpha"}, {197, L"Aring"}, 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {195, L"Atilde"}, {196, L"Auml"}, {914, L"Beta"}, 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {199, L"Ccedil"}, {935, L"Chi"}, {8225, L"Dagger"}, 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {916, L"Delta"}, {208, L"ETH"}, {201, L"Eacute"}, 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {202, L"Ecirc"}, {200, L"Egrave"}, {917, L"Epsilon"}, 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {919, L"Eta"}, {203, L"Euml"}, {915, L"Gamma"}, 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {922, L"Kappa"}, {923, L"Lambda"}, {924, L"Mu"}, 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {209, L"Ntilde"}, {925, L"Nu"}, {338, L"OElig"}, 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {211, L"Oacute"}, {212, L"Ocirc"}, {210, L"Ograve"}, 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {937, L"Omega"}, {927, L"Omicron"}, {216, L"Oslash"}, 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {213, L"Otilde"}, {214, L"Ouml"}, {934, L"Phi"}, 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {928, L"Pi"}, {936, L"Psi"}, {929, L"Rho"}, 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {352, L"Scaron"}, {931, L"Sigma"}, {222, L"THORN"}, 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {932, L"Tau"}, {920, L"Theta"}, {218, L"Uacute"}, 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {219, L"Ucirc"}, {217, L"Ugrave"}, {933, L"Upsilon"}, 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {220, L"Uuml"}, {926, L"Xi"}, {221, L"Yacute"}, 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {376, L"Yuml"}, {918, L"Zeta"}, {225, L"aacute"}, 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {226, L"acirc"}, {180, L"acute"}, {230, L"aelig"}, 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {224, L"agrave"}, {8501, L"alefsym"}, {945, L"alpha"}, 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {38, L"amp"}, {8743, L"and"}, {8736, L"ang"}, 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {39, L"apos"}, {229, L"aring"}, {8776, L"asymp"}, 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {227, L"atilde"}, {228, L"auml"}, {8222, L"bdquo"}, 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {946, L"beta"}, {166, L"brvbar"}, {8226, L"bull"}, 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8745, L"cap"}, {231, L"ccedil"}, {184, L"cedil"}, 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {162, L"cent"}, {967, L"chi"}, {710, L"circ"}, 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {9827, L"clubs"}, {8773, L"cong"}, {169, L"copy"}, 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8629, L"crarr"}, {8746, L"cup"}, {164, L"current"}, 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8659, L"dArr"}, {8224, L"dagger"}, {8595, L"darr"}, 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {176, L"deg"}, {948, L"delta"}, {9830, L"diams"}, 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {247, L"divide"}, {233, L"eacute"}, {234, L"ecirc"}, 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {232, L"egrave"}, {8709, L"empty"}, {8195, L"emsp"}, 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8194, L"ensp"}, {949, L"epsilon"}, {8801, L"equiv"}, 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {951, L"eta"}, {240, L"eth"}, {235, L"euml"}, 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8364, L"euro"}, {8707, L"exist"}, {402, L"fnof"}, 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8704, L"forall"}, {189, L"frac12"}, {188, L"frac14"}, 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {190, L"frac34"}, {8260, L"frasl"}, {947, L"gamma"}, 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8805, L"ge"}, {62, L"gt"}, {8660, L"hArr"}, 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8596, L"harr"}, {9829, L"hearts"}, {8230, L"hellip"}, 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {237, L"iacute"}, {238, L"icirc"}, {161, L"iexcl"}, 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {236, L"igrave"}, {8465, L"image"}, {8734, L"infin"}, 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8747, L"int"}, {953, L"iota"}, {191, L"iquest"}, 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8712, L"isin"}, {239, L"iuml"}, {954, L"kappa"}, 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8656, L"lArr"}, {205, L"lacute"}, {955, L"lambda"}, 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {9001, L"lang"}, {171, L"laquo"}, {8592, L"larr"}, 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8968, L"lceil"}, {206, L"lcirc"}, {8220, L"ldquo"}, 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8804, L"le"}, {8970, L"lfloor"}, {204, L"lgrave"}, 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {921, L"lota"}, {8727, L"lowast"}, {9674, L"loz"}, 93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8206, L"lrm"}, {8249, L"lsaquo"}, {8216, L"lsquo"}, 94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {60, L"lt"}, {207, L"luml"}, {175, L"macr"}, 95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8212, L"mdash"}, {181, L"micro"}, {183, L"middot"}, 96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8722, L"minus"}, {956, L"mu"}, {8711, L"nabla"}, 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {160, L"nbsp"}, {8211, L"ndash"}, {8800, L"ne"}, 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8715, L"ni"}, {172, L"not"}, {8713, L"notin"}, 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8836, L"nsub"}, {241, L"ntilde"}, {957, L"nu"}, 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {243, L"oacute"}, {244, L"ocirc"}, {339, L"oelig"}, 101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {242, L"ograve"}, {8254, L"oline"}, {969, L"omega"}, 102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {959, L"omicron"}, {8853, L"oplus"}, {8744, L"or"}, 103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {170, L"ordf"}, {186, L"ordm"}, {248, L"oslash"}, 104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {245, L"otilde"}, {8855, L"otimes"}, {246, L"ouml"}, 105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {182, L"para"}, {8706, L"part"}, {8240, L"permil"}, 106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8869, L"perp"}, {966, L"phi"}, {960, L"pi"}, 107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {982, L"piv"}, {177, L"plusmn"}, {8242, L"prime"}, 108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8719, L"prod"}, {8733, L"prop"}, {968, L"psi"}, 109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {163, L"pund"}, {34, L"quot"}, {8658, L"rArr"}, 110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8730, L"radic"}, {9002, L"rang"}, {187, L"raquo"}, 111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8594, L"rarr"}, {8969, L"rceil"}, {8476, L"real"}, 112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {174, L"reg"}, {8971, L"rfloor"}, {961, L"rho"}, 113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8207, L"rlm"}, {8250, L"rsaquo"}, {8217, L"rsquo"}, 114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {353, L"saron"}, {8218, L"sbquo"}, {8901, L"sdot"}, 115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {167, L"sect"}, {173, L"shy"}, {963, L"sigma"}, 116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {962, L"sigmaf"}, {8764, L"sim"}, {9824, L"spades"}, 117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8834, L"sub"}, {8838, L"sube"}, {8721, L"sum"}, 118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8835, L"sup"}, {185, L"sup1"}, {178, L"sup2"}, 119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {179, L"sup3"}, {8839, L"supe"}, {223, L"szlig"}, 120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {964, L"tau"}, {8221, L"tdquo"}, {8756, L"there4"}, 121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {952, L"theta"}, {977, L"thetasym"}, {8201, L"thinsp"}, 122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {254, L"thorn"}, {732, L"tilde"}, {215, L"times"}, 123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8482, L"trade"}, {8657, L"uArr"}, {250, L"uacute"}, 124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {8593, L"uarr"}, {251, L"ucirc"}, {249, L"ugrave"}, 125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {168, L"uml"}, {978, L"upsih"}, {965, L"upsilon"}, 126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {252, L"uuml"}, {8472, L"weierp"}, {958, L"xi"}, 127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {253, L"yacute"}, {165, L"yen"}, {255, L"yuml"}, 128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {950, L"zeta"}, {8205, L"zwj"}, {8204, L"zwnj"}, 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Sorted by m_uCode 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst XFA_FMHtmlReserveCode reservesForEncode[] = { 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {34, L"quot"}, {38, L"amp"}, {39, L"apos"}, 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {60, L"lt"}, {62, L"gt"}, {160, L"nbsp"}, 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {161, L"iexcl"}, {162, L"cent"}, {163, L"pund"}, 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {164, L"current"}, {165, L"yen"}, {166, L"brvbar"}, 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {167, L"sect"}, {168, L"uml"}, {169, L"copy"}, 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {170, L"ordf"}, {171, L"laquo"}, {172, L"not"}, 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {173, L"shy"}, {174, L"reg"}, {175, L"macr"}, 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {176, L"deg"}, {177, L"plusmn"}, {178, L"sup2"}, 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {179, L"sup3"}, {180, L"acute"}, {181, L"micro"}, 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {182, L"para"}, {183, L"middot"}, {184, L"cedil"}, 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {185, L"sup1"}, {186, L"ordm"}, {187, L"raquo"}, 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {188, L"frac14"}, {189, L"frac12"}, {190, L"frac34"}, 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {191, L"iquest"}, {192, L"Agrave"}, {193, L"Aacute"}, 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {194, L"Acirc"}, {195, L"Atilde"}, {196, L"Auml"}, 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {197, L"Aring"}, {198, L"AElig"}, {199, L"Ccedil"}, 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {200, L"Egrave"}, {201, L"Eacute"}, {202, L"Ecirc"}, 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {203, L"Euml"}, {204, L"lgrave"}, {205, L"lacute"}, 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {206, L"lcirc"}, {207, L"luml"}, {208, L"ETH"}, 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {209, L"Ntilde"}, {210, L"Ograve"}, {211, L"Oacute"}, 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {212, L"Ocirc"}, {213, L"Otilde"}, {214, L"Ouml"}, 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {215, L"times"}, {216, L"Oslash"}, {217, L"Ugrave"}, 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {218, L"Uacute"}, {219, L"Ucirc"}, {220, L"Uuml"}, 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {221, L"Yacute"}, {222, L"THORN"}, {223, L"szlig"}, 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {224, L"agrave"}, {225, L"aacute"}, {226, L"acirc"}, 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {227, L"atilde"}, {228, L"auml"}, {229, L"aring"}, 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {230, L"aelig"}, {231, L"ccedil"}, {232, L"egrave"}, 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {233, L"eacute"}, {234, L"ecirc"}, {235, L"euml"}, 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {236, L"igrave"}, {237, L"iacute"}, {238, L"icirc"}, 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {239, L"iuml"}, {240, L"eth"}, {241, L"ntilde"}, 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {242, L"ograve"}, {243, L"oacute"}, {244, L"ocirc"}, 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {245, L"otilde"}, {246, L"ouml"}, {247, L"divide"}, 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {248, L"oslash"}, {249, L"ugrave"}, {250, L"uacute"}, 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {251, L"ucirc"}, {252, L"uuml"}, {253, L"yacute"}, 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {254, L"thorn"}, {255, L"yuml"}, {338, L"OElig"}, 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {339, L"oelig"}, {352, L"Scaron"}, {353, L"saron"}, 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {376, L"Yuml"}, {402, L"fnof"}, {710, L"circ"}, 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {732, L"tilde"}, {913, L"Alpha"}, {914, L"Beta"}, 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {915, L"Gamma"}, {916, L"Delta"}, {917, L"Epsilon"}, 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {918, L"Zeta"}, {919, L"Eta"}, {920, L"Theta"}, 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {921, L"lota"}, {922, L"Kappa"}, {923, L"Lambda"}, 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {924, L"Mu"}, {925, L"Nu"}, {926, L"Xi"}, 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {927, L"Omicron"}, {928, L"Pi"}, {929, L"Rho"}, 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {931, L"Sigma"}, {932, L"Tau"}, {933, L"Upsilon"}, 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {934, L"Phi"}, {935, L"Chi"}, {936, L"Psi"}, 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {937, L"Omega"}, {945, L"alpha"}, {946, L"beta"}, 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {947, L"gamma"}, {948, L"delta"}, {949, L"epsilon"}, 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {950, L"zeta"}, {951, L"eta"}, {952, L"theta"}, 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {953, L"iota"}, {954, L"kappa"}, {955, L"lambda"}, 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {956, L"mu"}, {957, L"nu"}, {958, L"xi"}, 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {959, L"omicron"}, {960, L"pi"}, {961, L"rho"}, 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {962, L"sigmaf"}, {963, L"sigma"}, {964, L"tau"}, 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {965, L"upsilon"}, {966, L"phi"}, {967, L"chi"}, 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {968, L"psi"}, {969, L"omega"}, {977, L"thetasym"}, 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {978, L"upsih"}, {982, L"piv"}, {8194, L"ensp"}, 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8195, L"emsp"}, {8201, L"thinsp"}, {8204, L"zwnj"}, 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8205, L"zwj"}, {8206, L"lrm"}, {8207, L"rlm"}, 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8211, L"ndash"}, {8212, L"mdash"}, {8216, L"lsquo"}, 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8217, L"rsquo"}, {8218, L"sbquo"}, {8220, L"ldquo"}, 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8221, L"tdquo"}, {8222, L"bdquo"}, {8224, L"dagger"}, 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8225, L"Dagger"}, {8226, L"bull"}, {8230, L"hellip"}, 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8240, L"permil"}, {8242, L"prime"}, {8249, L"lsaquo"}, 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8250, L"rsaquo"}, {8254, L"oline"}, {8260, L"frasl"}, 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8364, L"euro"}, {8465, L"image"}, {8472, L"weierp"}, 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8476, L"real"}, {8482, L"trade"}, {8501, L"alefsym"}, 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8592, L"larr"}, {8593, L"uarr"}, {8594, L"rarr"}, 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8595, L"darr"}, {8596, L"harr"}, {8629, L"crarr"}, 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8656, L"lArr"}, {8657, L"uArr"}, {8658, L"rArr"}, 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8659, L"dArr"}, {8660, L"hArr"}, {8704, L"forall"}, 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8706, L"part"}, {8707, L"exist"}, {8709, L"empty"}, 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8711, L"nabla"}, {8712, L"isin"}, {8713, L"notin"}, 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8715, L"ni"}, {8719, L"prod"}, {8721, L"sum"}, 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8722, L"minus"}, {8727, L"lowast"}, {8730, L"radic"}, 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8733, L"prop"}, {8734, L"infin"}, {8736, L"ang"}, 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8743, L"and"}, {8744, L"or"}, {8745, L"cap"}, 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8746, L"cup"}, {8747, L"int"}, {8756, L"there4"}, 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8764, L"sim"}, {8773, L"cong"}, {8776, L"asymp"}, 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8800, L"ne"}, {8801, L"equiv"}, {8804, L"le"}, 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8805, L"ge"}, {8834, L"sub"}, {8835, L"sup"}, 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8836, L"nsub"}, {8838, L"sube"}, {8839, L"supe"}, 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8853, L"oplus"}, {8855, L"otimes"}, {8869, L"perp"}, 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8901, L"sdot"}, {8968, L"lceil"}, {8969, L"rceil"}, 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {8970, L"lfloor"}, {8971, L"rfloor"}, {9001, L"lang"}, 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {9002, L"rang"}, {9674, L"loz"}, {9824, L"spades"}, 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann {9827, L"clubs"}, {9829, L"hearts"}, {9830, L"diams"}, 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FXJSE_FUNCTION_DESCRIPTOR formcalc_fm2js_functions[] = { 220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Abs", CFXJSE_FormCalcContext::Abs}, 221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Avg", CFXJSE_FormCalcContext::Avg}, 222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Ceil", CFXJSE_FormCalcContext::Ceil}, 223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Count", CFXJSE_FormCalcContext::Count}, 224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Floor", CFXJSE_FormCalcContext::Floor}, 225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Max", CFXJSE_FormCalcContext::Max}, 226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Min", CFXJSE_FormCalcContext::Min}, 227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Mod", CFXJSE_FormCalcContext::Mod}, 228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Round", CFXJSE_FormCalcContext::Round}, 229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Sum", CFXJSE_FormCalcContext::Sum}, 230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Date", CFXJSE_FormCalcContext::Date}, 231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Date2Num", CFXJSE_FormCalcContext::Date2Num}, 232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"DateFmt", CFXJSE_FormCalcContext::DateFmt}, 233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"IsoDate2Num", CFXJSE_FormCalcContext::IsoDate2Num}, 234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"IsoTime2Num", CFXJSE_FormCalcContext::IsoTime2Num}, 235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"LocalDateFmt", CFXJSE_FormCalcContext::LocalDateFmt}, 236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"LocalTimeFmt", CFXJSE_FormCalcContext::LocalTimeFmt}, 237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Num2Date", CFXJSE_FormCalcContext::Num2Date}, 238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Num2GMTime", CFXJSE_FormCalcContext::Num2GMTime}, 239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Num2Time", CFXJSE_FormCalcContext::Num2Time}, 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Time", CFXJSE_FormCalcContext::Time}, 241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Time2Num", CFXJSE_FormCalcContext::Time2Num}, 242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"TimeFmt", CFXJSE_FormCalcContext::TimeFmt}, 243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Apr", CFXJSE_FormCalcContext::Apr}, 244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Cterm", CFXJSE_FormCalcContext::CTerm}, 245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"FV", CFXJSE_FormCalcContext::FV}, 246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Ipmt", CFXJSE_FormCalcContext::IPmt}, 247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"NPV", CFXJSE_FormCalcContext::NPV}, 248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Pmt", CFXJSE_FormCalcContext::Pmt}, 249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"PPmt", CFXJSE_FormCalcContext::PPmt}, 250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"PV", CFXJSE_FormCalcContext::PV}, 251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Rate", CFXJSE_FormCalcContext::Rate}, 252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Term", CFXJSE_FormCalcContext::Term}, 253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Choose", CFXJSE_FormCalcContext::Choose}, 254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Exists", CFXJSE_FormCalcContext::Exists}, 255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"HasValue", CFXJSE_FormCalcContext::HasValue}, 256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Oneof", CFXJSE_FormCalcContext::Oneof}, 257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Within", CFXJSE_FormCalcContext::Within}, 258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"If", CFXJSE_FormCalcContext::If}, 259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Eval", CFXJSE_FormCalcContext::Eval}, 260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Translate", CFXJSE_FormCalcContext::eval_translation}, 261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Ref", CFXJSE_FormCalcContext::Ref}, 262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"UnitType", CFXJSE_FormCalcContext::UnitType}, 263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"UnitValue", CFXJSE_FormCalcContext::UnitValue}, 264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"At", CFXJSE_FormCalcContext::At}, 265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Concat", CFXJSE_FormCalcContext::Concat}, 266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Decode", CFXJSE_FormCalcContext::Decode}, 267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Encode", CFXJSE_FormCalcContext::Encode}, 268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Format", CFXJSE_FormCalcContext::Format}, 269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Left", CFXJSE_FormCalcContext::Left}, 270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Len", CFXJSE_FormCalcContext::Len}, 271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Lower", CFXJSE_FormCalcContext::Lower}, 272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Ltrim", CFXJSE_FormCalcContext::Ltrim}, 273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Parse", CFXJSE_FormCalcContext::Parse}, 274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Replace", CFXJSE_FormCalcContext::Replace}, 275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Right", CFXJSE_FormCalcContext::Right}, 276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Rtrim", CFXJSE_FormCalcContext::Rtrim}, 277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Space", CFXJSE_FormCalcContext::Space}, 278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Str", CFXJSE_FormCalcContext::Str}, 279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Stuff", CFXJSE_FormCalcContext::Stuff}, 280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Substr", CFXJSE_FormCalcContext::Substr}, 281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Uuid", CFXJSE_FormCalcContext::Uuid}, 282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Upper", CFXJSE_FormCalcContext::Upper}, 283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"WordNum", CFXJSE_FormCalcContext::WordNum}, 284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Get", CFXJSE_FormCalcContext::Get}, 285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Post", CFXJSE_FormCalcContext::Post}, 286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"Put", CFXJSE_FormCalcContext::Put}, 287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"pos_op", CFXJSE_FormCalcContext::positive_operator}, 288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"neg_op", CFXJSE_FormCalcContext::negative_operator}, 289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"log_or_op", CFXJSE_FormCalcContext::logical_or_operator}, 290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"log_and_op", CFXJSE_FormCalcContext::logical_and_operator}, 291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"log_not_op", CFXJSE_FormCalcContext::logical_not_operator}, 292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"eq_op", CFXJSE_FormCalcContext::equality_operator}, 293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"neq_op", CFXJSE_FormCalcContext::notequality_operator}, 294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"lt_op", CFXJSE_FormCalcContext::less_operator}, 295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"le_op", CFXJSE_FormCalcContext::lessequal_operator}, 296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"gt_op", CFXJSE_FormCalcContext::greater_operator}, 297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"ge_op", CFXJSE_FormCalcContext::greaterequal_operator}, 298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"plus_op", CFXJSE_FormCalcContext::plus_operator}, 299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"minus_op", CFXJSE_FormCalcContext::minus_operator}, 300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"mul_op", CFXJSE_FormCalcContext::multiple_operator}, 301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"div_op", CFXJSE_FormCalcContext::divide_operator}, 302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"asgn_val_op", CFXJSE_FormCalcContext::assign_value_operator}, 303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"dot_acc", CFXJSE_FormCalcContext::dot_accessor}, 304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"dotdot_acc", CFXJSE_FormCalcContext::dotdot_accessor}, 305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"concat_obj", CFXJSE_FormCalcContext::concat_fm_object}, 306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"is_obj", CFXJSE_FormCalcContext::is_fm_object}, 307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"is_ary", CFXJSE_FormCalcContext::is_fm_array}, 308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"get_val", CFXJSE_FormCalcContext::get_fm_value}, 309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"get_jsobj", CFXJSE_FormCalcContext::get_fm_jsobj}, 310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann {"var_filter", CFXJSE_FormCalcContext::fm_var_filter}, 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FXJSE_CLASS_DESCRIPTOR formcalc_fm2js_descriptor = { 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "XFA_FM2JS_FormCalcClass", // name 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formcalc_fm2js_functions, // methods 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_ArraySize(formcalc_fm2js_functions), // number of methods 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // dynamic prop type 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // dynamic prop getter 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // dynamic prop setter 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nullptr, // dynamic prop method call 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint8_t g_sAltTable_Date[] = { 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255, 255, 255, 3, 9, 255, 255, 255, 255, 255, 255, 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255, 255, 1, 255, 255, 255, 255, 255, 255, 255, 255, 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic_assert(FX_ArraySize(g_sAltTable_Date) == L'a' - L'A' + 1, 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Invalid g_sAltTable_Date size."); 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint8_t g_sAltTable_Time[] = { 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14, 255, 255, 3, 9, 255, 255, 15, 255, 255, 255, 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255, 6, 255, 255, 255, 255, 255, 7, 255, 255, 255, 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 255, 255, 1, 17, 255, 255, 255, 255, 255, 255, 255, 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}; 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic_assert(FX_ArraySize(g_sAltTable_Time) == L'a' - L'A' + 1, 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann "Invalid g_sAltTable_Time size."); 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid AlternateDateTimeSymbols(WideString& wsPattern, 340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& wsAltSymbols, 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pAltTable) { 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t nLength = wsPattern.GetLength(); 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bInConstRange = false; 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bEscape = false; 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < nLength) { 347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t wc = wsPattern[i]; 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wc == L'\'') { 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bInConstRange = !bInConstRange; 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bEscape) { 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern.Delete(i); 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nLength--; 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bEscape = !bEscape; 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bInConstRange && wc >= L'A' && wc <= L'a') { 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t nAlt = pAltTable[wc - L'A']; 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nAlt != 255) 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern.SetAt(i, wsAltSymbols[nAlt]); 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bEscape = false; 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool PatternStringType(const ByteStringView& szPattern, uint32_t& patternType) { 370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsPattern = WideString::FromUTF8(szPattern); 37133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"datetime" == wsPattern.Left(8)) { 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_DATETIME; 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"date" == wsPattern.Left(4)) { 376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pos = wsPattern.Find(L"time"); 377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann patternType = 378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pos.has_value() && pos.value() != 0 ? XFA_VT_DATETIME : XFA_VT_DATE; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"time" == wsPattern.Left(4)) { 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TIME; 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"text" == wsPattern.Left(4)) { 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TEXT; 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"num" == wsPattern.Left(3)) { 39033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (L"integer" == wsPattern.Mid(4, 7)) { 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_INTEGER; 39233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (L"decimal" == wsPattern.Mid(4, 7)) { 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_DECIMAL; 39433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (L"currency" == wsPattern.Mid(4, 8)) { 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_FLOAT; 39633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann } else if (L"percent" == wsPattern.Mid(4, 7)) { 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_FLOAT; 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_FLOAT; 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_NULL; 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern.MakeLower(); 406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsPattern.c_str(); 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = wsPattern.GetLength(); 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSingleQuotation = false; 410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t patternChar; 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternChar = pData[iIndex]; 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (patternChar == 0x27) { 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSingleQuotation = !bSingleQuotation; 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bSingleQuotation && 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (patternChar == 'y' || patternChar == 'j')) { 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_DATE; 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex++; 419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t timePatternChar; 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann timePatternChar = pData[iIndex]; 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (timePatternChar == 0x27) { 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSingleQuotation = !bSingleQuotation; 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bSingleQuotation && timePatternChar == 't') { 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_DATETIME; 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex++; 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bSingleQuotation && 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (patternChar == 'h' || patternChar == 'k')) { 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TIME; 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bSingleQuotation && 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (patternChar == 'a' || patternChar == 'x' || 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternChar == 'o' || patternChar == '0')) { 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TEXT; 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (patternChar == 'x' || patternChar == 'o' || patternChar == '0') { 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!bSingleQuotation && 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (patternChar == 'z' || patternChar == 's' || 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternChar == 'e' || patternChar == 'v' || 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternChar == '8' || patternChar == ',' || 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternChar == '.' || patternChar == '$')) { 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_FLOAT; 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (patternChar == 'v' || patternChar == '8' || patternChar == '$') { 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex++; 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (patternType == XFA_VT_NULL) { 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TEXT | XFA_VT_FLOAT; 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFXJSE_FormCalcContext* ToJSContext(CFXJSE_Value* pValue, 461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Class* pClass) { 462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_HostObject* pHostObj = pValue->ToHostObject(pClass); 463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pHostObj || pHostObj->type() != CFXJSE_HostObject::kFM2JS) 464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return nullptr; 465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return static_cast<CFXJSE_FormCalcContext*>(pHostObj); 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsWhitespace(char c) { 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return c == 0x20 || c == 0x09 || c == 0x0B || c == 0x0C || c == 0x0A || 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann c == 0x0D; 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannIFX_Locale* LocaleFromString(CXFA_Document* pDoc, 474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleMgr* pMgr, 475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale) { 476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!szLocale.IsEmpty()) 477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pMgr->GetLocaleByName(WideString::FromUTF8(szLocale)); 478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); 480d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(pThisNode); 481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pThisNode->GetLocale(); 482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString FormatFromString(IFX_Locale* pLocale, 485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFormat) { 486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!szFormat.IsEmpty()) 487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString::FromUTF8(szFormat); 488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pLocale->GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY_Default); 490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_LOCALEDATETIMESUBCATEGORY SubCategoryFromInt(int32_t iStyle) { 493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann switch (iStyle) { 494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case 1: 495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FX_LOCALEDATETIMESUBCATEGORY_Short; 496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case 3: 497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FX_LOCALEDATETIMESUBCATEGORY_Long; 498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case 4: 499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FX_LOCALEDATETIMESUBCATEGORY_Full; 500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case 0: 501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann case 2: 502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann default: 503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FX_LOCALEDATETIMESUBCATEGORY_Medium; 504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool IsPartOfNumber(char ch) { 508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return std::isdigit(ch) || ch == '-' || ch == '.'; 509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool IsPartOfNumberW(wchar_t ch) { 512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return std::iswdigit(ch) || ch == L'-' || ch == L'.'; 513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString GUIDString(bool bSeparator) { 516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint8_t data[16]; 517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_Random_GenerateMT(reinterpret_cast<uint32_t*>(data), 4); 518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann data[6] = (data[6] & 0x0F) | 0x40; 519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsStr; 521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char* pBuf = bsStr.GetBuffer(40); 522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (int32_t i = 0; i < 16; ++i, pBuf += 2) { 523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bSeparator && (i == 4 || i == 6 || i == 8 || i == 10)) 524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *pBuf++ = L'-'; 525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXSYS_IntToTwoHexChars(data[i], pBuf); 527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsStr.ReleaseBuffer(bSeparator ? 36 : 32); 529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return bsStr; 530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanndouble ByteStringToDouble(const ByteStringView& szStringVal) { 533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsValue = WideString::FromUTF8(szStringVal); 534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsValue.Trim(); 535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t cc = 0; 537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bNegative = false; 538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* str = wsValue.c_str(); 540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t len = wsValue.GetLength(); 541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (str[0] == '+') { 542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (str[0] == '-') { 544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bNegative = true; 545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t nIntegralLen = 0; 549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int64_t nIntegral = 0; 550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (cc < len) { 551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (str[cc] == '.' || str[cc] == 'E' || str[cc] == 'e' || 552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIntegralLen > 17) { 553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!FXSYS_isDecimalDigit(str[cc])) { 556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0; 557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIntegral = nIntegral * 10 + str[cc] - '0'; 559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIntegralLen++; 561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nIntegral = bNegative ? -nIntegral : nIntegral; 563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t scale = 0; 565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double fraction = 0.0; 566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t dwFractional = 0; 567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cc < len && str[cc] == '.') { 568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (cc < len) { 570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann fraction += XFA_GetFractionalScale(scale) * (str[cc] - '0'); 571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann scale++; 572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cc == len) 574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (scale == XFA_GetMaxFractionalScale() || str[cc] == 'E' || 576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann str[cc] == 'e') { 577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann break; 578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!FXSYS_isDecimalDigit(str[cc])) 580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0; 581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dwFractional = static_cast<uint32_t>(fraction * 4294967296.0); 583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t nExponent = 0; 586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bExpSign = false; 587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { 588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (cc < len) { 590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (str[cc] == '+') { 591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (str[cc] == '-') { 593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bExpSign = true; 594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann while (cc < len) { 598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) 599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return 0; 600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nExponent = nExponent * 10 + str[cc] - '0'; 602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann cc++; 603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann nExponent = bExpSign ? -nExponent : nExponent; 605d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = dwFractional / 4294967296.0; 608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dValue = nIntegral + (nIntegral >= 0 ? dValue : -dValue); 609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (nExponent != 0) 610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dValue *= FXSYS_pow(10, static_cast<float>(nExponent)); 611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 612d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return dValue; 613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Abs(CFXJSE_Value* pThis, 619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Abs"); 6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, argOne.get()); 6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dValue < 0) 6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dValue = -dValue; 6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dValue); 6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Avg(CFXJSE_Value* pThis, 641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1) { 6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 6474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t uCount = 0; 651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dSum = 0.0; 6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); 6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsNull()) 6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argValue->IsArray()) { 6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, argValue.get()); 6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectProperty("length", lengthValue.get()); 6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 2) { 6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(1, propertyValue.get()); 6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto defaultPropValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), defaultPropValue.get()); 6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (defaultPropValue->IsNull()) 6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, defaultPropValue.get()); 6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 6864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, newPropertyValue.get()); 6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (uCount == 0) { 6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dSum / uCount); 7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Ceil(CFXJSE_Value* pThis, 708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 709d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Ceil"); 7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, args, 0); 7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argValue.get())) { 7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetFloat(ceil(ValueToFloat(pThis, argValue.get()))); 7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Count(CFXJSE_Value* pThis, 726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = 0; 7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < args.GetLength(); i++) { 7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); 7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsNull()) 7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsArray()) { 7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectProperty("length", lengthValue.get()); 7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 2) { 7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(1, propertyValue.get()); 7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); 7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!newPropertyValue->IsNull()) 7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount++; 7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount += newPropertyValue->IsNull() ? 0 : 1; 7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argValue->IsObject()) { 7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); 7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!newPropertyValue->IsNull()) 7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount++; 7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount++; 7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(iCount); 7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Floor(CFXJSE_Value* pThis, 780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Floor"); 7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = GetSimpleValue(pThis, args, 0); 7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argValue.get())) { 7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetFloat(floor(ValueToFloat(pThis, argValue.get()))); 7944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Max(CFXJSE_Value* pThis, 798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t uCount = 0; 803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dMaxValue = 0.0; 8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < args.GetLength(); i++) { 8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); 8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsNull()) 8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsArray()) { 8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectProperty("length", lengthValue.get()); 8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 2) { 8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(1, propertyValue.get()); 8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); 8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMaxValue = (uCount == 1) ? dValue : std::max(dMaxValue, dValue); 8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 838d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 843d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMaxValue = (uCount == 1) ? dValue : std::max(dMaxValue, dValue); 8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argValue->IsObject()) { 8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); 8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMaxValue = (uCount == 1) ? dValue : std::max(dMaxValue, dValue); 8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, argValue.get()); 8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMaxValue = (uCount == 1) ? dValue : std::max(dMaxValue, dValue); 8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (uCount == 0) { 8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 8644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dMaxValue); 8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Min(CFXJSE_Value* pThis, 872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t uCount = 0; 877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dMinValue = 0.0; 8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < args.GetLength(); i++) { 8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); 8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsNull()) 8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsArray()) { 8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectProperty("length", lengthValue.get()); 8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 2) { 8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(1, propertyValue.get()); 8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); 8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); 9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 912d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); 9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argValue->IsObject()) { 9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); 9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, newPropertyValue.get()); 9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); 9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ValueToDouble(pThis, argValue.get()); 9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dMinValue = uCount == 1 ? dValue : std::min(dMinValue, dValue); 9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (uCount == 0) { 9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dMinValue); 9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Mod(CFXJSE_Value* pThis, 946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 948d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Mod"); 9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); 9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull() || argTwo->IsNull()) { 9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool argOneResult; 962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dDividend = ExtractDouble(pThis, argOne.get(), &argOneResult); 9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool argTwoResult; 964d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dDivisor = ExtractDouble(pThis, argTwo.get(), &argTwoResult); 9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argOneResult || !argTwoResult) { 9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDivisor == 0.0) { 9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowDivideByZeroException(); 9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dDividend - 9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDivisor * (int32_t)(dDividend / dDivisor)); 9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 980d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Round(CFXJSE_Value* pThis, 981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 983d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Round"); 9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool dValueRet; 997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dValue = ExtractDouble(pThis, argOne.get(), &dValueRet); 9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!dValueRet) { 9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t uPrecision = 0; 10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = args.GetValue(1); 10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argTwo->IsNull()) { 10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool dPrecisionRet; 1012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dPrecision = ExtractDouble(pThis, argTwo.get(), &dPrecisionRet); 10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!dPrecisionRet) { 10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1018d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uPrecision = static_cast<uint8_t>(pdfium::clamp(dPrecision, 0.0, 12.0)); 10194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_Decimal decimalValue(static_cast<float>(dValue), uPrecision); 1022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetDouble(decimalValue); 10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1026d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Sum(CFXJSE_Value* pThis, 1027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 10294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 10304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc == 0) { 10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 10324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 10364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 10374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t uCount = 0; 1038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dSum = 0.0; 10394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 10404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argValue = args.GetValue(i); 10414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsNull()) 10424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 10434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValue->IsArray()) { 10454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 10464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectProperty("length", lengthValue.get()); 10474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 2) { 10494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 10504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 10544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(1, propertyValue.get()); 10554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 10564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 10574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 10584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 10594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 10614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 10624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, jsObjectValue.get()); 10654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 10664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 10684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 10694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValue->GetObjectPropertyByIdx(j, jsObjectValue.get()); 10704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 1071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, newPropertyValue.get()); 10764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 10774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argValue->IsObject()) { 10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 10814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argValue.get(), newPropertyValue.get()); 10824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (newPropertyValue->IsNull()) 10834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 10844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, argValue.get()); 10864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 10874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dSum += ValueToDouble(pThis, argValue.get()); 10894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uCount++; 10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (uCount == 0) { 10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 10954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 10964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 10974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dSum); 10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Date(CFXJSE_Value* pThis, 1102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 0) { 11054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date"); 11064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time_t currentTime; 11104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time(¤tTime); 11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* pTmStruct = gmtime(¤tTime); 11124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(DateString2Num( 1114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString::Format("%d%02d%02d", pTmStruct->tm_year + 1900, 1115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pTmStruct->tm_mon + 1, pTmStruct->tm_mday) 1116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .AsStringView())); 11174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Date2Num(CFXJSE_Value* pThis, 1121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 11234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 11254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date2Num"); 11264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); 11304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, dateValue.get())) { 11314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 11324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString dateString = ValueToUTF8String(dateValue.get()); 1136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatString; 11374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); 11394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, formatValue.get())) { 11404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 11414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString = ValueToUTF8String(formatValue.get()); 11444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localString; 11474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 11484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); 11494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, localValue.get())) { 11504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 11514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString = ValueToUTF8String(localValue.get()); 11544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szIsoDateString = 1157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Local2IsoDate(pThis, dateString.AsStringView(), 1158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString.AsStringView(), localString.AsStringView()); 11594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 1160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann DateString2Num(szIsoDateString.AsStringView())); 11614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::DateFmt(CFXJSE_Value* pThis, 1165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 11674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 11684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 11694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Date2Num"); 11704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = 0; 11744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 0) { 11754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); 11764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argStyle->IsNull()) { 11774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 11784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); 11824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle < 0 || iStyle > 4) 11834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = 0; 11844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocal; 11874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 11884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); 11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argLocal->IsNull()) { 11904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szLocal = ValueToUTF8String(argLocal.get()); 11944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 11954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatStr = 1197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetStandardDateFormat(pThis, iStyle, szLocal.AsStringView()); 1198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(formatStr.AsStringView()); 11994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::IsoDate2Num(CFXJSE_Value* pThis, 1203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 12054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 12064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr) 12074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ->ThrowParamCountMismatchException(L"IsoDate2Num"); 12084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 12114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 12124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 12134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szArgString = ValueToUTF8String(argOne.get()); 1216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(DateString2Num(szArgString.AsStringView())); 12174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::IsoTime2Num(CFXJSE_Value* pThis, 1221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 1223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 12244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 12254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"IsoTime2Num"); 12264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 12304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 12314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 12324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 1237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szArgString = ValueToUTF8String(argOne.get()); 1238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pos = szArgString.Find('T', 0); 1239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!pos.has_value() || pos.value() == szArgString.GetLength() - 1) { 12404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 12414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szArgString = szArgString.Right(szArgString.GetLength() - (pos.value() + 1)); 12444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue timeValue( 1246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_VT_TIME, WideString::FromUTF8(szArgString.AsStringView()), pMgr); 12474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!timeValue.IsValid()) { 12484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 12494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_DateTime uniTime = timeValue.GetTime(); 12534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t hour = uniTime.GetHour(); 12544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t min = uniTime.GetMinute(); 12554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t second = uniTime.GetSecond(); 12564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t milSecond = uniTime.GetMillisecond(); 12574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): See if there is other time conversion code in pdfium and 12594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // consolidate. 12604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t mins = hour * 60 + min; 1261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann mins -= (pMgr->GetDefLocale()->GetTimeZone().tzHour * 60); 12624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (mins > 1440) 12634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins -= 1440; 12644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (mins < 0) 12654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins += 1440; 12664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann hour = mins / 60; 12674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann min = mins % 60; 12684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(hour * 3600000 + min * 60000 + 12704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann second * 1000 + milSecond + 1); 12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::LocalDateFmt(CFXJSE_Value* pThis, 1275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 12774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 12794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr) 12804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ->ThrowParamCountMismatchException(L"LocalDateFmt"); 12814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = 0; 12854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 0) { 12864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); 12874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argStyle->IsNull()) { 12884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 12894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 12904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); 12924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle > 4 || iStyle < 0) 12934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = 0; 12944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 12954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocal; 12974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 12984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); 12994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argLocal->IsNull()) { 13004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szLocal = ValueToUTF8String(argLocal.get()); 13044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatStr = 1307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetLocalDateFormat(pThis, iStyle, szLocal.AsStringView(), false); 1308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(formatStr.AsStringView()); 13094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 13104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::LocalTimeFmt(CFXJSE_Value* pThis, 1313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 13154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 13164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 13174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr) 13184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ->ThrowParamCountMismatchException(L"LocalTimeFmt"); 13194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = 0; 13234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 0) { 13244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); 13254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argStyle->IsNull()) { 13264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); 13304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle > 4 || iStyle < 0) 13314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = 0; 13324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocal; 13354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 13364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); 13374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argLocal->IsNull()) { 13384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szLocal = ValueToUTF8String(argLocal.get()); 13424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatStr = 1345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetLocalTimeFormat(pThis, iStyle, szLocal.AsStringView(), false); 1346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(formatStr.AsStringView()); 13474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 13484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Num2Date(CFXJSE_Value* pThis, 1351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 13534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 13544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 13554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Num2Date"); 13564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> dateValue = GetSimpleValue(pThis, args, 0); 13604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, dateValue.get())) { 13614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t dDate = (int32_t)ValueToFloat(pThis, dateValue.get()); 13654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate < 1) { 13664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatString; 13714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 13724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); 13734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, formatValue.get())) { 13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString = ValueToUTF8String(formatValue.get()); 13784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localString; 13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 13824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); 13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, localValue.get())) { 13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 13864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString = ValueToUTF8String(localValue.get()); 13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear = 1900; 13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMonth = 1; 13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iDay = 1; 13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (dDate > 0) { 13954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth == 2) { 13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((!((iYear + i) % 4) && ((iYear + i) % 100)) || !((iYear + i) % 400)) { 13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 29) { 13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 29; 14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 28) { 14114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 28; 14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iMonth < 8) { 14244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((iMonth % 2 == 0)) { 14254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 30) { 14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 14274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 30; 14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 31) { 14394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 31; 14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth % 2 != 0) { 14534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 30) { 14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 30; 14614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (dDate > 31) { 14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iMonth; 14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12) { 14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate -= 31; 14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay += static_cast<int32_t>(dDate) - 1; 14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDate = 0; 14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocalDateString = IsoDate2Local( 1483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pThis, 1484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString::Format("%d%02d%02d", iYear + i, iMonth, iDay).AsStringView(), 1485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString.AsStringView(), localString.AsStringView()); 1486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(szLocalDateString.AsStringView()); 14874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 14884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Num2GMTime(CFXJSE_Value* pThis, 1491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 14934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 14944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr) 14964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ->ThrowParamCountMismatchException(L"Num2GMTime"); 14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 14984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0); 15014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (timeValue->IsNull()) { 15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iTime = (int32_t)ValueToFloat(pThis, timeValue.get()); 1506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (abs(iTime) < 1.0) { 15074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatString; 15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 15134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); 15144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (formatValue->IsNull()) { 15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString = ValueToUTF8String(formatValue.get()); 15194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localString; 15224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 15234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); 15244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (localValue->IsNull()) { 15254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString = ValueToUTF8String(localValue.get()); 15294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szGMTTimeString = 1532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Num2AllTime(pThis, iTime, formatString.AsStringView(), 1533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString.AsStringView(), true); 1534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(szGMTTimeString.AsStringView()); 15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Num2Time(CFXJSE_Value* pThis, 1539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 15414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 15424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 15434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Num2Time"); 15444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0); 15484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (timeValue->IsNull()) { 15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fTime = ValueToFloat(pThis, timeValue.get()); 1553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (fabs(fTime) < 1.0) { 15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatString; 15594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 15604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); 15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (formatValue->IsNull()) { 15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString = ValueToUTF8String(formatValue.get()); 15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localString; 15694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 15704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); 15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (localValue->IsNull()) { 15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 15734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString = ValueToUTF8String(localValue.get()); 15764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocalTimeString = Num2AllTime(pThis, static_cast<int32_t>(fTime), 1579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString.AsStringView(), 1580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString.AsStringView(), false); 1581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(szLocalTimeString.AsStringView()); 15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Time(CFXJSE_Value* pThis, 1586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 0) { 15894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Time"); 15904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 15924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time_t now; 15944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time(&now); 15954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 15964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* pGmt = gmtime(&now); 15974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 15984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (pGmt->tm_hour * 3600 + pGmt->tm_min * 60 + pGmt->tm_sec) * 1000); 15994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Time2Num(CFXJSE_Value* pThis, 1603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 16064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 16074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Time2Num"); 16084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString timeString; 16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> timeValue = GetSimpleValue(pThis, args, 0); 16134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, timeValue.get())) { 16144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann timeString = ValueToUTF8String(timeValue.get()); 16184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatString; 16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 16214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> formatValue = GetSimpleValue(pThis, args, 1); 16224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, formatValue.get())) { 16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatString = ValueToUTF8String(formatValue.get()); 16274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localString; 16304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 16314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localValue = GetSimpleValue(pThis, args, 2); 16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, localValue.get())) { 16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 16344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localString = ValueToUTF8String(localValue.get()); 16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IFX_Locale* pLocale = nullptr; 16424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (localString.IsEmpty()) { 16434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); 16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pThisNode); 1645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pLocale = pThisNode->GetLocale(); 16464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pLocale = 1648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pMgr->GetLocaleByName(WideString::FromUTF8(localString.AsStringView())); 16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormat; 16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (formatString.IsEmpty()) 1653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormat = pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Default); 16544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 1655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormat = WideString::FromUTF8(formatString.AsStringView()); 16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsFormat = L"time{" + wsFormat + L"}"; 16584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(XFA_VT_TIME, 1659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(timeString.AsStringView()), 16604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsFormat, pLocale, pMgr); 16614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 16624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_DateTime uniTime = localeValue.GetTime(); 16674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t hour = uniTime.GetHour(); 16684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t min = uniTime.GetMinute(); 16694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t second = uniTime.GetSecond(); 16704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t milSecond = uniTime.GetMillisecond(); 16714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t mins = hour * 60 + min; 16724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann mins -= (CXFA_TimeZoneProvider().GetTimeZone().tzHour * 60); 16744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (mins > 1440) 16754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins -= 1440; 16764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (mins < 0) 16784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann mins += 1440; 16794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann hour = mins / 60; 16814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann min = mins % 60; 16824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(hour * 3600000 + min * 60000 + 16834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann second * 1000 + milSecond + 1); 16844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 16854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::TimeFmt(CFXJSE_Value* pThis, 1688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 1689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 16904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 16914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 16924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"TimeFmt"); 16934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 16944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 16954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 16964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = 0; 16974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 0) { 16984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argStyle = GetSimpleValue(pThis, args, 0); 16994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argStyle->IsNull()) { 17004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 17014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 17024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = (int32_t)ValueToFloat(pThis, argStyle.get()); 17044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle > 4 || iStyle < 0) 17054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = 0; 17064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szLocal; 17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 17104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argLocal = GetSimpleValue(pThis, args, 1); 17114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argLocal->IsNull()) { 17124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 17134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 17144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szLocal = ValueToUTF8String(argLocal.get()); 17164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatStr = 1719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann GetStandardTimeFormat(pThis, iStyle, szLocal.AsStringView()); 1720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(formatStr.AsStringView()); 17214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::IsIsoDateFormat(const char* pData, 1725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iLength, 1726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iStyle, 1727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iYear, 1728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMonth, 1729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iDay) { 17304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = 0; 17314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 1; 17324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 1; 17334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 4) 17354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char strYear[5]; 17384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strYear[4] = '\0'; 17394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < 4; ++i) { 1740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[i])) 17414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strYear[i] = pData[i]; 17444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = FXSYS_atoi(strYear); 17464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = 0; 17474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength == 4) 17484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 17494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStyle = pData[4] == '-' ? 1 : 0; 17514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char strTemp[3]; 17534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[2] = '\0'; 17544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPosOff = iStyle == 0 ? 4 : 5; 1755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iPosOff]) || !std::isdigit(pData[iPosOff + 1])) 17564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[0] = pData[iPosOff]; 17594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[1] = pData[iPosOff + 1]; 17604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = FXSYS_atoi(strTemp); 17614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth > 12 || iMonth < 1) 17624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle == 0) { 17654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPosOff += 2; 17664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength == 6) 17674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 17684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 17694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPosOff += 3; 17704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength == 7) 17714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 17724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iPosOff]) || !std::isdigit(pData[iPosOff + 1])) 17744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[0] = pData[iPosOff]; 17774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[1] = pData[iPosOff + 1]; 17784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = FXSYS_atoi(strTemp); 17794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPosOff + 2 < iLength) 17804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 17824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) { 17834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth == 2 && iDay > 29) 17844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 17864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth == 2 && iDay > 28) 17874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth != 2) { 17904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMonth < 8) { 17914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iDay > (iMonth % 2 == 0 ? 30 : 31)) 17924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iDay > (iMonth % 2 == 0 ? 31 : 30)) { 17944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 17954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 17974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 17984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 17994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::IsIsoTimeFormat(const char* pData, 1802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iLength, 1803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iHour, 1804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMinute, 1805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iSecond, 1806d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMilliSecond, 1807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iZoneHour, 1808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iZoneMinute) { 18094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = 0; 18104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinute = 0; 18114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSecond = 0; 18124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMilliSecond = 0; 18134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneHour = 0; 18144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneMinute = 0; 18154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pData) 18164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char strTemp[3]; 18194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[2] = '\0'; 18204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZone = 0; 18214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 18224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLength) { 1823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[i]) && pData[i] != ':') { 18244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZone = i; 18254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 18264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 18284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == iLength) 18304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZone = iLength; 18314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPos = 0; 18334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 18344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iZone) { 1835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iIndex])) 18364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[0] = pData[iIndex]; 1839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iIndex + 1])) 18404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[1] = pData[iIndex + 1]; 18434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FXSYS_atoi(strTemp) > 60) 18444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[2] == ':') { 18474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPos == 0) { 18484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = FXSYS_atoi(strTemp); 18494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 18504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iPos == 1) { 18514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinute = FXSYS_atoi(strTemp); 18524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 18534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 18544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSecond = FXSYS_atoi(strTemp); 18554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 3; 18574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 18584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPos == 0) { 18594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = FXSYS_atoi(strTemp); 18604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 18614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iPos == 1) { 18624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinute = FXSYS_atoi(strTemp); 18634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 18644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iPos == 2) { 18654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSecond = FXSYS_atoi(strTemp); 18664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 18674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 2; 18694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 18714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndex < iLength && pData[iIndex] == '.') { 1873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann constexpr int kSubSecondLength = 3; 1874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndex + kSubSecondLength >= iLength) 18754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++iIndex; 1878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char strSec[kSubSecondLength + 1]; 1879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (int i = 0; i < kSubSecondLength; ++i) { 1880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char c = pData[iIndex + i]; 1881d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(c)) 1882d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 1883d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strSec[i] = c; 1884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 1885d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strSec[kSubSecondLength] = '\0'; 18864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMilliSecond = FXSYS_atoi(strSec); 18884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iMilliSecond > 100) { 18894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMilliSecond = 0; 18904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 18914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iIndex += kSubSecondLength; 18934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 1895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndex < iLength && FXSYS_tolower(pData[iIndex]) == 'z') 18964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 18974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 18984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSign = 1; 1899d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndex < iLength) { 1900d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (pData[iIndex] == '+') { 1901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++iIndex; 1902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (pData[iIndex] == '-') { 1903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iSign = -1; 1904d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ++iIndex; 1905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 19064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPos = 0; 19084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 1909d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iIndex])) 19104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[0] = pData[iIndex]; 1913d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pData[iIndex + 1])) 19144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTemp[1] = pData[iIndex + 1]; 19174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (FXSYS_atoi(strTemp) > 60) 19184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[2] == ':') { 19214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPos == 0) { 19224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneHour = FXSYS_atoi(strTemp); 19234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iPos == 1) { 19244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneMinute = FXSYS_atoi(strTemp); 19254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 3; 19274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 19284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!iPos) { 19294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneHour = FXSYS_atoi(strTemp); 19304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 19314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iPos == 1) { 19324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneMinute = FXSYS_atoi(strTemp); 19334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iPos; 19344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 2; 19364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex < iLength) 19394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iZoneHour *= iSign; 19424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 19434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 19444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::IsIsoDateTimeFormat(const char* pData, 1947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iLength, 1948d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iYear, 1949d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMonth, 1950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iDay, 1951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iHour, 1952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMinute, 1953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iSecond, 1954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMillionSecond, 1955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iZoneHour, 1956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iZoneMinute) { 19574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iYear = 0; 19584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMonth = 0; 19594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDay = 0; 19604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = 0; 19614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMinute = 0; 19624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSecond = 0; 19634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pData) 19644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 19674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pData[iIndex] != 'T' && pData[iIndex] != 't') { 19684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex >= iLength) 19694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iIndex; 19714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 19724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex != 8 && iIndex != 10) 19734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = -1; 19764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!IsIsoDateFormat(pData, iIndex, iStyle, iYear, iMonth, iDay)) 19774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 19784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] != 'T' && pData[iIndex] != 't') 19794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 19804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iIndex; 19824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (((iLength - iIndex > 13) && (iLength - iIndex < 6)) && 19834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (iLength - iIndex != 15)) { 19844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 19854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return IsIsoTimeFormat(pData + iIndex, iLength - iIndex, iHour, iMinute, 1987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iSecond, iMillionSecond, iZoneHour, iZoneMinute); 19884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 19894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 19904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 1991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::Local2IsoDate( 1992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 1993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szDate, 1994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFormat, 1995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale) { 19964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 19974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 1998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 19994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 2001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = LocaleFromString(pDoc, pMgr, szLocale); 20024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLocale) 2003d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 20044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormat = FormatFromString(pLocale, szFormat); 2006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_DateTime dt = CXFA_LocaleValue(XFA_VT_DATE, WideString::FromUTF8(szDate), 2007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsFormat, pLocale, pMgr) 2008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .GetDate(); 20094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString::Format("%4d-%02d-%02d", dt.GetYear(), dt.GetMonth(), 2011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dt.GetDay()); 20124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 20134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2015d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::IsoDate2Local( 2016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2017d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szDate, 2018d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFormat, 2019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale) { 20204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 20214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 2022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 20234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 2025d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = LocaleFromString(pDoc, pMgr, szLocale); 20264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLocale) 2027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 20284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormat = FormatFromString(pLocale, szFormat); 2030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsRet; 2031d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleValue(XFA_VT_DATE, WideString::FromUTF8(szDate), pMgr) 2032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann .FormatPatterns(wsRet, wsFormat, pLocale, XFA_VALUEPICTURE_Display); 2033d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsRet.UTF8Encode(); 20344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 20354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::IsoTime2Local( 2038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szTime, 2040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFormat, 2041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale) { 20424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 20434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 2044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 20454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 2047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = LocaleFromString(pDoc, pMgr, szLocale); 20484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLocale) 2049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 20504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsFormat = { 2052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"time{", FormatFromString(pLocale, szFormat).AsStringView(), L"}"}; 2053d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleValue widgetValue(XFA_VT_TIME, WideString::FromUTF8(szTime), pMgr); 2054d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsRet; 20554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann widgetValue.FormatPatterns(wsRet, wsFormat, pLocale, 20564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_VALUEPICTURE_Display); 2057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsRet.UTF8Encode(); 20584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 20594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CFXJSE_FormCalcContext::DateString2Num( 2062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szDateString) { 20634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = szDateString.GetLength(); 20644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iYear = 0; 20654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMonth = 0; 20664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iDay = 0; 20674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 10) { 20684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStyle = -1; 2069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!IsIsoDateFormat(szDateString.unterminated_c_str(), iLength, iStyle, 2070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iYear, iMonth, iDay)) { 20714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 20724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 20734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 20744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iHour = 0; 20754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMinute = 0; 20764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSecond = 0; 20774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMilliSecond = 0; 20784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZoneHour = 0; 20794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZoneMinute = 0; 2080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!IsIsoDateTimeFormat(szDateString.unterminated_c_str(), iLength, iYear, 2081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iMonth, iDay, iHour, iMinute, iSecond, 2082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iMilliSecond, iZoneHour, iZoneMinute)) { 20834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 20844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 20854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 20864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float dDays = 0; 20884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 1; 20894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iYear < 1900) 20904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 20914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 20924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iYear - i >= 1900) { 20934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDays += 20944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ((!((iYear - i) % 4) && ((iYear - i) % 100)) || !((iYear - i) % 400)) 20954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? 366 20964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : 365; 20974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 20984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 20994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 1; 21004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iMonth) { 21014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i == 2) 21024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDays += ((!(iYear % 4) && (iYear % 100)) || !(iYear % 400)) ? 29 : 28; 21034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (i <= 7) 21044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDays += (i % 2 == 0) ? 30 : 31; 21054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 21064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDays += (i % 2 == 0) ? 31 : 30; 21074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 21094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 21104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 0; 21114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iDay - i > 0) { 21124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dDays += 1; 21134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 21144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 21154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (int32_t)dDays; 21164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::GetLocalDateFormat( 2120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iStyle, 2122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale, 2123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bStandard) { 21244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 21254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 2126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 21274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 2129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = LocaleFromString(pDoc, pMgr, szLocale); 21304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLocale) 2131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 21324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString strRet = pLocale->GetDatePattern(SubCategoryFromInt(iStyle)); 21344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bStandard) { 2135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AlternateDateTimeSymbols(strRet, pLocale->GetDateTimeSymbols(), 2136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann g_sAltTable_Date); 21374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return strRet.UTF8Encode(); 21394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::GetLocalTimeFormat( 2143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iStyle, 2145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale, 2146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bStandard) { 21474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 21484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 2149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 21504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 2152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = LocaleFromString(pDoc, pMgr, szLocale); 21534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLocale) 2154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 21554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString strRet = pLocale->GetTimePattern(SubCategoryFromInt(iStyle)); 21574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bStandard) { 2158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann AlternateDateTimeSymbols(strRet, pLocale->GetDateTimeSymbols(), 2159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann g_sAltTable_Time); 21604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return strRet.UTF8Encode(); 21624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::GetStandardDateFormat( 2166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iStyle, 2168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocalStr) { 2169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetLocalDateFormat(pThis, iStyle, szLocalStr, true); 21704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::GetStandardTimeFormat( 2174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 2175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iStyle, 2176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocalStr) { 2177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return GetLocalTimeFormat(pThis, iStyle, szLocalStr, true); 21784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 21794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::Num2AllTime(CFXJSE_Value* pThis, 2182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iTime, 2183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFormat, 2184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szLocale, 2185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bGM) { 21864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iHour = 0; 21874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iMin = 0; 21884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iSec = 0; 21894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = static_cast<int>(iTime) / 3600000; 21904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMin = (static_cast<int>(iTime) - iHour * 3600000) / 60000; 21914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSec = (static_cast<int>(iTime) - iHour * 3600000 - iMin * 60000) / 1000; 21924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 21934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bGM) { 21944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZoneHour = 0; 21954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZoneMin = 0; 21964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iZoneSec = 0; 21974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetLocalTimeZone(iZoneHour, iZoneMin, iZoneSec); 21984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour += iZoneHour; 21994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMin += iZoneMin; 22004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSec += iZoneSec; 22014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return IsoTime2Local( 2204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pThis, 2205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString::Format("%02d:%02d:%02d", iHour, iMin, iSec).AsStringView(), 2206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szFormat, szLocale); 22074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 22084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::GetLocalTimeZone(int32_t& iHour, 2211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iMin, 2212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t& iSec) { 22134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time_t now; 22144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann time(&now); 22154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* pGmt = gmtime(&now); 22174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann struct tm* pLocal = localtime(&now); 22184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iHour = pLocal->tm_hour - pGmt->tm_hour; 22194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iMin = pLocal->tm_min - pGmt->tm_min; 22204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iSec = pLocal->tm_sec - pGmt->tm_sec; 22214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 22224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Apr(CFXJSE_Value* pThis, 2225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 22284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 22294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Apr"); 22304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 22344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 22354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 22364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 22374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 22384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 22394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nPrincipal = ValueToDouble(pThis, argOne.get()); 2243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nPayment = ValueToDouble(pThis, argTwo.get()); 2244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nPeriods = ValueToDouble(pThis, argThree.get()); 22454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nPrincipal <= 0 || nPayment <= 0 || nPeriods <= 0) { 22464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 22474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double r = 2 * (nPeriods * nPayment - nPrincipal) / (nPeriods * nPrincipal); 2251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nTemp = 1; 22524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < nPeriods; ++i) 22534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp *= (1 + r); 22544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; 22564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (fabs(nRet) > kFinancialPrecision) { 2257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nDerivative = 22584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ((nTemp + r * nPeriods * (nTemp / (1 + r))) * (nTemp - 1) - 22594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (r * nTemp * nPeriods * (nTemp / (1 + r)))) / 22604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ((nTemp - 1) * (nTemp - 1)); 22614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nDerivative == 0) { 22624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 22634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann r = r - nRet / nDerivative; 22674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp = 1; 22684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < nPeriods; ++i) { 22694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp *= (1 + r); 22704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nRet = r * nTemp / (nTemp - 1) - nPayment / nPrincipal; 22724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(r * 12); 22744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 22754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::CTerm(CFXJSE_Value* pThis, 2278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 22814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 22824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"CTerm"); 22834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 22864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 22874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 22884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 22894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 22904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 22914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 22924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 22934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 22944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRate = ValueToFloat(pThis, argOne.get()); 2296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nFutureValue = ValueToFloat(pThis, argTwo.get()); 2297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nInitAmount = ValueToFloat(pThis, argThree.get()); 22984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nRate <= 0) || (nFutureValue <= 0) || (nInitAmount <= 0)) { 22994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 23004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetFloat(log((float)(nFutureValue / nInitAmount)) / 2304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log((float)(1 + nRate))); 23054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 23064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::FV(CFXJSE_Value* pThis, 2309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 23124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 23134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"FV"); 23144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 23184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 23194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 23204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 23214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 23224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 23234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nAmount = ValueToDouble(pThis, argOne.get()); 2327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nRate = ValueToDouble(pThis, argTwo.get()); 2328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nPeriod = ValueToDouble(pThis, argThree.get()); 23294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nRate < 0) || (nPeriod <= 0) || (nAmount <= 0)) { 23304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 23314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dResult = 0; 23354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nRate) { 2336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nTemp = 1; 23374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int i = 0; i < nPeriod; ++i) { 23384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp *= 1 + nRate; 23394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = nAmount * (nTemp - 1) / nRate; 23414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 23424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = nAmount * nPeriod; 23434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dResult); 23464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 23474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::IPmt(CFXJSE_Value* pThis, 2350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 23534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 5) { 23544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"IPmt"); 23554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 23594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 23604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 23614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3); 23624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4); 23634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 23644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) || 23654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argFive.get())) { 23664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 23674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPrincipalAmount = ValueToFloat(pThis, argOne.get()); 2371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRate = ValueToFloat(pThis, argTwo.get()); 2372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPayment = ValueToFloat(pThis, argThree.get()); 2373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nFirstMonth = ValueToFloat(pThis, argFour.get()); 2374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nNumberOfMonths = ValueToFloat(pThis, argFive.get()); 23754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || 23764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (nFirstMonth < 0) || (nNumberOfMonths < 0)) { 23774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 23784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRateOfMonth = nRate / 12; 2382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iNums = 2383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (int32_t)((log10((float)(nPayment / nPrincipalAmount)) - 2384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log10((float)(nPayment / nPrincipalAmount - nRateOfMonth))) / 2385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log10((float)(1 + nRateOfMonth))); 23864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums); 23874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nPayment < nPrincipalAmount * nRateOfMonth) { 23894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetFloat(0); 23904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 23914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 23924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 23934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 23944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < nFirstMonth - 1; ++i) 23954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth; 23964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nSum = 0; 23984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; i < iEnd; ++i) { 23994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nSum += nPrincipalAmount * nRateOfMonth; 24004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth; 24014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetFloat(nSum); 24034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 24044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::NPV(CFXJSE_Value* pThis, 2407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 24104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 24114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 3) { 24124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"NPV"); 24134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> argValues; 24174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 24184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValues.push_back(GetSimpleValue(pThis, args, i)); 24194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argValues[i].get())) { 24204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 24214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nRate = ValueToDouble(pThis, argValues[0].get()); 24264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nRate <= 0) { 24274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 24284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<double> data(argc - 1); 24324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 1; i < argc; i++) 24334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann data.push_back(ValueToDouble(pThis, argValues[i].get())); 24344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nSum = 0; 24364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 24374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc - 1; i++) { 2438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nTemp = 1; 24394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 0; j <= i; j++) 24404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp *= 1 + nRate; 24414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nNum = data[iIndex++]; 24434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nSum += nNum / nTemp; 24444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(nSum); 24464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 24474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Pmt(CFXJSE_Value* pThis, 2450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 24534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 24544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Pmt"); 24554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 24594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 24604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 24614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 24624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 24634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 24644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPrincipal = ValueToFloat(pThis, argOne.get()); 2468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRate = ValueToFloat(pThis, argTwo.get()); 2469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPeriods = ValueToFloat(pThis, argThree.get()); 24704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nPrincipal <= 0) || (nRate <= 0) || (nPeriods <= 0)) { 24714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 24724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nTmp = 1 + nRate; 2476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nSum = nTmp; 24774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < nPeriods - 1; ++i) 24784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nSum *= nTmp; 24794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetFloat((nPrincipal * nRate * nSum) / (nSum - 1)); 24814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 24824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::PPmt(CFXJSE_Value* pThis, 2485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 24884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 5) { 24894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"PPmt"); 24904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 24914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 24924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 24934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 24944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 24954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 24964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3); 24974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4); 24984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 24994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get()) || ValueIsNull(pThis, argFour.get()) || 25004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argFive.get())) { 25014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 25024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPrincipalAmount = ValueToFloat(pThis, argOne.get()); 2506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRate = ValueToFloat(pThis, argTwo.get()); 2507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPayment = ValueToFloat(pThis, argThree.get()); 2508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nFirstMonth = ValueToFloat(pThis, argFour.get()); 2509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nNumberOfMonths = ValueToFloat(pThis, argFive.get()); 25104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nPrincipalAmount <= 0) || (nRate <= 0) || (nPayment <= 0) || 25114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (nFirstMonth < 0) || (nNumberOfMonths < 0)) { 25124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 25134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRateOfMonth = nRate / 12; 2517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iNums = 2518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (int32_t)((log10((float)(nPayment / nPrincipalAmount)) - 2519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log10((float)(nPayment / nPrincipalAmount - nRateOfMonth))) / 2520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log10((float)(1 + nRateOfMonth))); 25214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iEnd = std::min((int32_t)(nFirstMonth + nNumberOfMonths - 1), iNums); 25224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nPayment < nPrincipalAmount * nRateOfMonth) { 25234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 25244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 25284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (i = 0; i < nFirstMonth - 1; ++i) 25294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nPrincipalAmount -= nPayment - nPrincipalAmount * nRateOfMonth; 25304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nTemp = 0; 2532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nSum = 0; 25334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (; i < iEnd; ++i) { 25344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp = nPayment - nPrincipalAmount * nRateOfMonth; 25354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nSum += nTemp; 25364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nPrincipalAmount -= nTemp; 25374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetFloat(nSum); 25394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 25404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::PV(CFXJSE_Value* pThis, 2543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 25464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 25474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"PV"); 25484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 25524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 25534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 25544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 25554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 25564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 25574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nAmount = ValueToDouble(pThis, argOne.get()); 2561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nRate = ValueToDouble(pThis, argTwo.get()); 2562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nPeriod = ValueToDouble(pThis, argThree.get()); 25634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nAmount <= 0) || (nRate < 0) || (nPeriod <= 0)) { 25644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 25654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double nTemp = 1; 25694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < nPeriod; ++i) 25704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp *= 1 + nRate; 25714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nTemp = 1 / nTemp; 25734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(nAmount * ((1 - nTemp) / nRate)); 25744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 25754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Rate(CFXJSE_Value* pThis, 2578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 25814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 25824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Rate"); 25834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 25864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 25874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 25884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 25894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 25904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 25914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 25924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 25934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 25944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nFuture = ValueToFloat(pThis, argOne.get()); 2596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nPresent = ValueToFloat(pThis, argTwo.get()); 2597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nTotalNumber = ValueToFloat(pThis, argThree.get()); 25984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nFuture <= 0) || (nPresent < 0) || (nTotalNumber <= 0)) { 25994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 26004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetFloat( 2604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXSYS_pow((float)(nFuture / nPresent), (float)(1 / nTotalNumber)) - 1); 26054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 26064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Term(CFXJSE_Value* pThis, 2609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 26124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 26134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Term"); 26144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 26184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 26194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 26204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get()) || 26214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argThree.get())) { 26224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 26234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nMount = ValueToFloat(pThis, argOne.get()); 2627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nRate = ValueToFloat(pThis, argTwo.get()); 2628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float nFuture = ValueToFloat(pThis, argThree.get()); 26294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((nMount <= 0) || (nRate <= 0) || (nFuture <= 0)) { 26304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 26314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetFloat(log((float)(nFuture / nMount * nRate) + 1) / 2635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann log((float)(1 + nRate))); 26364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 26374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Choose(CFXJSE_Value* pThis, 2640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 26434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 26444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 2) { 26454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Choose"); 26464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 26504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 26514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 26524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = (int32_t)ValueToFloat(pThis, argOne.get()); 26564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex < 1) { 26574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 26584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 26594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFound = false; 26624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bStopCounterFlags = false; 26634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iArgIndex = 1; 26644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iValueIndex = 0; 26654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 26664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (!bFound && !bStopCounterFlags && (iArgIndex < argc)) { 26674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argIndexValue = args.GetValue(iArgIndex); 26684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argIndexValue->IsArray()) { 26694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 26704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndexValue->GetObjectProperty("length", lengthValue.get()); 26714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 26724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 3) 26734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bStopCounterFlags = true; 26744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 26754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iValueIndex += (iLength - 2); 26764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iValueIndex >= iIndex) { 26774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 26784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 26794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 26804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndexValue->GetObjectPropertyByIdx(1, propertyValue.get()); 26814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndexValue->GetObjectPropertyByIdx( 26824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (iLength - 1) - (iValueIndex - iIndex), jsObjectValue.get()); 26834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 26844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 26854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 26864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 2687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), newPropertyValue.get()); 26884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsChosen = ValueToUTF8String(newPropertyValue.get()); 2690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(bsChosen.AsStringView()); 26914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bFound = true; 26924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 26934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 26944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iValueIndex++; 26954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iValueIndex == iIndex) { 2696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsChosen = ValueToUTF8String(argIndexValue.get()); 2697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(bsChosen.AsStringView()); 26984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bFound = true; 26994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iArgIndex++; 27024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bFound) 27044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 27054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 27064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Exists(CFXJSE_Value* pThis, 2709d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 27114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 27124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Exists"); 27134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(args.GetValue(0)->IsObject()); 27164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 27174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::HasValue(CFXJSE_Value* pThis, 2720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 27224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 27234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"HasValue"); 27244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 27284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argOne->IsString()) { 27294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(argOne->IsNumber() || 27304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->IsBoolean()); 27314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2734d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString valueStr = argOne->ToString(); 27354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann valueStr.TrimLeft(); 27364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(!valueStr.IsEmpty()); 27374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 27384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Oneof(CFXJSE_Value* pThis, 2741d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2742d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 27434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() < 2) { 27444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Oneof"); 27454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFlags = false; 27494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 27504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> parameterValues; 27514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unfoldArgs(pThis, args, ¶meterValues, 1); 27524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (const auto& value : parameterValues) { 27534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (simpleValueCompare(pThis, argOne.get(), value.get())) { 27544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bFlags = true; 27554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 27564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(bFlags); 27604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 27614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Within(CFXJSE_Value* pThis, 2764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 27664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 27674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Within"); 27684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 27724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 27734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetUndefined(); 27744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argLow = GetSimpleValue(pThis, args, 1); 27784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argHigh = GetSimpleValue(pThis, args, 2); 27794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNumber()) { 2780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float oneNumber = ValueToFloat(pThis, argOne.get()); 2781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float lowNumber = ValueToFloat(pThis, argLow.get()); 2782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float heightNumber = ValueToFloat(pThis, argHigh.get()); 27834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((oneNumber >= lowNumber) && 27844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (oneNumber <= heightNumber)); 27854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 27864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 27874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString oneString = ValueToUTF8String(argOne.get()); 2789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString lowString = ValueToUTF8String(argLow.get()); 2790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString heightString = ValueToUTF8String(argHigh.get()); 27914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 2792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (oneString.Compare(lowString.AsStringView()) >= 0) && 2793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (oneString.Compare(heightString.AsStringView()) <= 0)); 27944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 27954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 27964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::If(CFXJSE_Value* pThis, 2798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 28004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 28014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"If"); 28024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(GetSimpleValue(pThis, args, 0)->ToBoolean() 28064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? GetSimpleValue(pThis, args, 1).get() 28074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : GetSimpleValue(pThis, args, 2).get()); 28084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 28094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Eval(CFXJSE_Value* pThis, 2812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2813d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 28154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 28164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Eval"); 28174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 28214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> scriptValue = GetSimpleValue(pThis, args, 0); 2822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString utf8ScriptString = ValueToUTF8String(scriptValue.get()); 28234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (utf8ScriptString.IsEmpty()) { 28244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 28254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsJavaScriptBuf; 2829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!CFXJSE_FormCalcContext::Translate( 2830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(utf8ScriptString.AsStringView()).AsStringView(), 2831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &wsJavaScriptBuf)) { 2832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pContext->ThrowCompilerErrorException(); 2833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 2834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 2835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 28364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Context> pNewContext( 28374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Context::Create(pIsolate, nullptr, nullptr)); 28384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto returnValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 2840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNewContext->ExecuteScript( 2841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).c_str(), returnValue.get()); 28424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(returnValue.get()); 28444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 28454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Ref(CFXJSE_Value* pThis, 2848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 2850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 28514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 28524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 28534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Ref"); 28544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 28584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argOne->IsArray() && !argOne->IsObject() && !argOne->IsBoolean() && 28594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !argOne->IsString() && !argOne->IsNull() && !argOne->IsNumber()) { 28604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 28614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsBoolean() || argOne->IsString() || argOne->IsNumber()) { 28654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(argOne.get()); 28664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 28704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < 3; i++) 28714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 28724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int intVal = 3; 28744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 28754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): Why is this 4 when the others are all 3? 28764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann intVal = 4; 28774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[2]->SetNull(); 28784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argOne->IsArray()) { 28794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef NDEBUG 28804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 28814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectProperty("length", lengthValue.get()); 28824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(lengthValue->ToInteger() >= 3); 28834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 28844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 28864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 28874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(1, propertyValue.get()); 28884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(2, jsObjectValue.get()); 28894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!propertyValue->IsNull() || jsObjectValue->IsNull()) { 28904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 28914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 28924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[2]->Assign(jsObjectValue.get()); 28954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argOne->IsObject()) { 28964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[2]->Assign(argOne.get()); 28974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 28984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 28994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(intVal); 29004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 29014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 29024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 29034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 29044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 2905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::UnitType(CFXJSE_Value* pThis, 2906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 2907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 29084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 29094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"UnitType"); 29104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 29114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 29134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0); 29144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (unitspanValue->IsNull()) { 29154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 29164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 29174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString unitspanString = ValueToUTF8String(unitspanValue.get()); 29204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (unitspanString.IsEmpty()) { 29214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("in"); 29224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 29234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 29254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann enum XFA_FM2JS_VALUETYPE_ParserStatus { 29264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_START, 29274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_HAVEINVALIDCHAR, 29284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_HAVEDIGIT, 29294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_HAVEDIGITWHITE, 29304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_ISCM, 29314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_ISMM, 29324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_ISPT, 29334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_ISMP, 29344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann VALUETYPE_ISIN, 29354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann }; 29364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unitspanString.MakeLower(); 2937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTypeString = WideString::FromUTF8(unitspanString.AsStringView()); 2938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsTypeString.c_str(); 29394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t u = 0; 29404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t uLen = wsTypeString.GetLength(); 29414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (IsWhitespace(pData[u])) 29424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann u++; 29434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 29444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_FM2JS_VALUETYPE_ParserStatus eParserStatus = VALUETYPE_START; 2945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t typeChar; 29464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): Cleanup this parser, figure out what the various checks 29474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // are for. 29484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (u < uLen) { 29494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann typeChar = pData[u]; 29504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsWhitespace(typeChar)) { 29514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eParserStatus != VALUETYPE_HAVEDIGIT && 29524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus != VALUETYPE_HAVEDIGITWHITE) { 29534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_ISIN; 29544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_HAVEDIGITWHITE; 2957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } else if (IsPartOfNumberW(typeChar)) { 29584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (eParserStatus == VALUETYPE_HAVEDIGITWHITE) { 29594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_ISIN; 29604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_HAVEDIGIT; 29634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if ((typeChar == 'c' || typeChar == 'p') && (u + 1 < uLen)) { 2964d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t nextChar = pData[u + 1]; 29654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((eParserStatus == VALUETYPE_START || 29664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus == VALUETYPE_HAVEDIGIT || 29674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus == VALUETYPE_HAVEDIGITWHITE) && 2968d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann !IsPartOfNumberW(nextChar)) { 29694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = (typeChar == 'c') ? VALUETYPE_ISCM : VALUETYPE_ISPT; 29704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_HAVEINVALIDCHAR; 29734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (typeChar == 'm' && (u + 1 < uLen)) { 2974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t nextChar = pData[u + 1]; 29754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((eParserStatus == VALUETYPE_START || 29764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus == VALUETYPE_HAVEDIGIT || 29774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus == VALUETYPE_HAVEDIGITWHITE) && 2978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann !IsPartOfNumberW(nextChar)) { 29794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_ISMM; 29804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nextChar == 'p' || ((u + 5 < uLen) && pData[u + 1] == 'i' && 29814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pData[u + 2] == 'l' && pData[u + 3] == 'l' && 29824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pData[u + 4] == 'i' && pData[u + 5] == 'p')) { 29834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_ISMP; 29844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 29884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann eParserStatus = VALUETYPE_HAVEINVALIDCHAR; 29894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann u++; 29914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 29924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (eParserStatus) { 29934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case VALUETYPE_ISCM: 29944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("cm"); 29954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case VALUETYPE_ISMM: 29974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("mm"); 29984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 29994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case VALUETYPE_ISPT: 30004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("pt"); 30014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case VALUETYPE_ISMP: 30034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("mp"); 30044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 30064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("in"); 30074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 30104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::UnitValue(CFXJSE_Value* pThis, 3013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 30154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 30164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 30174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"UnitValue"); 30184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 30194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> unitspanValue = GetSimpleValue(pThis, args, 0); 30224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (unitspanValue->IsNull()) { 30234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 30244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 30254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString unitspanString = ValueToUTF8String(unitspanValue.get()); 3028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pData = unitspanString.c_str(); 30294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pData) { 30304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 30314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 30324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3034d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t u = 0; 30354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (IsWhitespace(pData[u])) 30364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 30374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (u < unitspanString.GetLength()) { 3039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!IsPartOfNumber(pData[u])) 30404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 30424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char* pTemp = nullptr; 3045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dFirstNumber = strtod(pData, &pTemp); 30464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (IsWhitespace(pData[u])) 30474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 30484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t uLen = unitspanString.GetLength(); 3050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString strFirstUnit; 30514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (u < uLen) { 30524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[u] == ' ') 30534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strFirstUnit += pData[u]; 30564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 30574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strFirstUnit.MakeLower(); 30594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3060d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString strUnit; 30614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 30624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> unitValue = GetSimpleValue(pThis, args, 1); 3063d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString unitTempString = ValueToUTF8String(unitValue.get()); 3064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pChar = unitTempString.c_str(); 3065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t uVal = 0; 30664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (IsWhitespace(pChar[uVal])) 30674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++uVal; 30684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (uVal < unitTempString.GetLength()) { 3070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!std::isdigit(pChar[uVal]) && pChar[uVal] != '.') 30714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++uVal; 30734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (IsWhitespace(pChar[uVal])) 30754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++uVal; 30764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t uValLen = unitTempString.GetLength(); 30784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (uVal < uValLen) { 30794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pChar[uVal] == ' ') 30804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 30814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 30824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strUnit += pChar[uVal]; 30834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++uVal; 30844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strUnit.MakeLower(); 30864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 30874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strUnit = strFirstUnit; 30884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 30894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double dResult = 0; 30914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strFirstUnit == "in" || strFirstUnit == "inches") { 30924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strUnit == "mm" || strUnit == "millimeters") 30934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber * 25.4; 30944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "cm" || strUnit == "centimeters") 30954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber * 2.54; 30964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "pt" || strUnit == "points") 30974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72; 30984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "mp" || strUnit == "millipoints") 30994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72000; 31004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 31014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber; 31024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (strFirstUnit == "mm" || strFirstUnit == "millimeters") { 31034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strUnit == "mm" || strUnit == "millimeters") 31044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber; 31054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "cm" || strUnit == "centimeters") 31064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 10; 31074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "pt" || strUnit == "points") 31084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 25.4 / 72; 31094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "mp" || strUnit == "millipoints") 31104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 25.4 / 72000; 31114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 31124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 25.4; 31134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (strFirstUnit == "cm" || strFirstUnit == "centimeters") { 31144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strUnit == "mm" || strUnit == "millimeters") 31154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber * 10; 31164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "cm" || strUnit == "centimeters") 31174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber; 31184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "pt" || strUnit == "points") 31194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 2.54 / 72; 31204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "mp" || strUnit == "millipoints") 31214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 2.54 / 72000; 31224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 31234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 2.54; 31244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (strFirstUnit == "pt" || strFirstUnit == "points") { 31254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strUnit == "mm" || strUnit == "millimeters") 31264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72 * 25.4; 31274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "cm" || strUnit == "centimeters") 31284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72 * 2.54; 31294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "pt" || strUnit == "points") 31304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber; 31314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "mp" || strUnit == "millipoints") 31324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber * 1000; 31334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 31344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72; 31354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (strFirstUnit == "mp" || strFirstUnit == "millipoints") { 31364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strUnit == "mm" || strUnit == "millimeters") 31374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72000 * 25.4; 31384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "cm" || strUnit == "centimeters") 31394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72000 * 2.54; 31404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "pt" || strUnit == "points") 31414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 1000; 31424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (strUnit == "mp" || strUnit == "millipoints") 31434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber; 31444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 31454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dResult = dFirstNumber / 72000; 31464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(dResult); 31484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 31494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::At(CFXJSE_Value* pThis, 3152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 31544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 31554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"At"); 31564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 31574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 31604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 31614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { 31624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 31634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 31644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString stringTwo = ValueToUTF8String(argTwo.get()); 31674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (stringTwo.IsEmpty()) { 31684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(1); 31694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 31704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString stringOne = ValueToUTF8String(argOne.get()); 3173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pos = stringOne.Find(stringTwo.AsStringView()); 3174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(pos.has_value() ? pos.value() + 1 : 0); 31754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 31764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Concat(CFXJSE_Value* pThis, 3179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 31814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 31824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1) { 31834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Concat"); 31844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 31854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString resultString; 31884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllNull = true; 31894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 31904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> value = GetSimpleValue(pThis, args, i); 31914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, value.get())) 31924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 31934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bAllNull = false; 3195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString += ValueToUTF8String(value.get()); 31964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 31974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 31984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAllNull) { 31994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 32004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 32014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(resultString.AsStringView()); 32044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 32054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Decode(CFXJSE_Value* pThis, 3208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 32104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 32114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 32124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Decode"); 32134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 32144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc == 1) { 32174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 32184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 32194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 32204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 32214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString decoded = DecodeURL( 3224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(ValueToUTF8String(argOne.get()).AsStringView())); 3225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 3226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 3227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(decoded.AsStringView()).AsStringView()); 32284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 32294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 32324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 32334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { 32344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 32354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 32364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString toDecodeString = ValueToUTF8String(argOne.get()); 3239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString identifyString = ValueToUTF8String(argTwo.get()); 3240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString decoded; 32414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString toDecodeWideString = 3243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(toDecodeString.AsStringView()); 32444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (identifyString.EqualNoCase("html")) 3246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann decoded = DecodeHTML(toDecodeWideString); 32474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (identifyString.EqualNoCase("xml")) 3248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann decoded = DecodeXML(toDecodeWideString); 32494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 3250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann decoded = DecodeURL(toDecodeWideString); 32514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 3253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(decoded.AsStringView()).AsStringView()); 32544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 32554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::DecodeURL(const WideString& wsURLString) { 3258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsURLString.c_str(); 3259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t i = 0; 32604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsResultBuf; 32614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < wsURLString.GetLength()) { 3262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t ch = pData[i]; 32634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ('%' != ch) { 32644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(ch); 32654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 32664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 32674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t chTemp = 0; 32704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = 0; 32714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iCount < 2) { 32724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 32734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 32744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch <= '9' && ch >= '0') { 32754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): Premultiply and add rather then scale. 32764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann chTemp += (ch - '0') * (!iCount ? 16 : 1); 32774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'F' && ch >= 'A') { 32784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann chTemp += (ch - 'A' + 10) * (!iCount ? 16 : 1); 32794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'f' && ch >= 'a') { 32804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann chTemp += (ch - 'a' + 10) * (!iCount ? 16 : 1); 32814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(); 32834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iCount; 32854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(chTemp); 32874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 32884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 32894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(0); 3290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 32914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 32924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 32934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::DecodeHTML(const WideString& wsHTMLString) { 3295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strString[9]; 3296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t iStrIndex = 0; 3297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t iLen = wsHTMLString.GetLength(); 3298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t i = 0; 32994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCode = 0; 3300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsHTMLString.c_str(); 33014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsResultBuf; 33024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLen) { 3303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t ch = pData[i]; 33044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '&') { 33054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(ch); 33064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 33084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 33104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '#') { 33134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != 'x' && ch != 'X') { 3316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(); 33174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 33194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || 33224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ch <= 'F' && ch >= 'A')) { 33234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ch != ';' && i < iLen) { 33244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= '0' && ch <= '9') { 33254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - '0'; 33264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'f' && ch >= 'a') { 33274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - 'a' + 10; 33284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'F' && ch >= 'A') { 33294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - 'A' + 10; 33304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(); 33324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): Postmultiply seems wrong, start at zero 33354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // and pre-multiply then can remove the post divide. 33364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode *= 16; 33374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode /= 16; 33404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 33424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ch != ';' && i < iLen) { 33434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex++] = ch; 33444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex] = 0; 33484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t iData = 0; 3350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (HTMLSTR2Code(strString, &iData)) { 3351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar((wchar_t)iData); 33524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 33534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(iCode); 33544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStrIndex = 0; 33564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex] = 0; 33574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(0); 33604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 33624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 33634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 33644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::DecodeXML(const WideString& wsXMLString) { 3366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strString[9]; 33674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStrIndex = 0; 33684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = wsXMLString.GetLength(); 33694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 33704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCode = 0; 3371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t ch = 0; 3372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsXMLString.c_str(); 3373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf wsResultBuf; 33744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLen) { 33754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '&') { 3377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar(ch); 33784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 33804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 33824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // TODO(dsinclair): This is very similar to DecodeHTML, can they be 33834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // combined? 33844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '#') { 33874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != 'x' && ch != 'X') { 3390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(); 33914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 33924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 33934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 33944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 33954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ch >= '0' && ch <= '9') || (ch <= 'f' && ch >= 'a') || 33964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ch <= 'F' && ch >= 'A')) { 33974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ch != ';') { 33984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= '0' && ch <= '9') { 33994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - '0'; 34004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'f' && ch >= 'a') { 34014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - 'a' + 10; 34024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch <= 'F' && ch >= 'A') { 34034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode += ch - 'A' + 10; 34044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(); 34064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 34084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode *= 16; 34094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 34104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode /= 16; 34124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 34144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ch != ';' && i < iLen) { 34154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex++] = ch; 34164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 34174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = pData[i]; 34184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex] = 0; 34204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* const strName[] = {L"quot", L"amp", L"apos", L"lt", L"gt"}; 34234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 34244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < 5) { 3425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (memcmp(strString, strName[iIndex], wcslen(strName[iIndex])) == 0) { 34264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iIndex; 34294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (iIndex) { 34314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 0: 3432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar('"'); 34334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 1: 3435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar('&'); 34364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 2: 3438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar('\''); 34394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 3: 3441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar('<'); 34424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 4: 3444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar('>'); 34454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: 3447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar(iCode); 34484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 34494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStrIndex = 0; 34514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strString[iStrIndex] = 0; 34524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 34534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCode = 0; 34544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar(0); 3456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 34574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 34584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 34594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Encode(CFXJSE_Value* pThis, 3461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 34634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 34644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 34654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Encode"); 34664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 34674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 34694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc == 1) { 34704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 34714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 34724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 34734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 34744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString encoded = EncodeURL(ValueToUTF8String(argOne.get())); 3477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 3478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(encoded.AsStringView()).AsStringView()); 34794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 34804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 34824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 34834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 34844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get()) || ValueIsNull(pThis, argTwo.get())) { 34854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 34864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 34874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 34884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString toEncodeString = ValueToUTF8String(argOne.get()); 3490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString identifyString = ValueToUTF8String(argTwo.get()); 3491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString encoded; 34924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (identifyString.EqualNoCase("html")) 3493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann encoded = EncodeHTML(toEncodeString); 34944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (identifyString.EqualNoCase("xml")) 3495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann encoded = EncodeXML(toEncodeString); 34964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 3497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann encoded = EncodeURL(toEncodeString); 34984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 3500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(encoded.AsStringView()).AsStringView()); 35014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 35024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::EncodeURL(const ByteString& szURLString) { 3505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsURLString = WideString::FromUTF8(szURLString.AsStringView()); 35064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsResultBuf; 3507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strEncode[4]; 35084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[0] = '%'; 35094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[3] = 0; 3510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strUnsafe[] = {' ', '<', '>', '"', '#', '%', '{', '}', 3511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann '|', '\\', '^', '~', '[', ']', '`'}; 3512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strReserved[] = {';', '/', '?', ':', '@', '=', '&'}; 3513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strSpecial[] = {'$', '-', '+', '!', '*', '\'', '(', ')', ','}; 3514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* strCode = L"0123456789abcdef"; 3515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (auto ch : wsURLString) { 35164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 35174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = FX_ArraySize(strUnsafe); 35184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iCount) { 35194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == strUnsafe[i]) { 35204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = ch / 16; 35214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = strCode[iIndex]; 35224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[2] = strCode[ch - iIndex * 16]; 352333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 35244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 35254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 35274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < iCount) 35294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 35304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 0; 35324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = FX_ArraySize(strReserved); 35334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iCount) { 35344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == strReserved[i]) { 35354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = ch / 16; 35364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = strCode[iIndex]; 35374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[2] = strCode[ch - iIndex * 16]; 353833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 35394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 35404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 35424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < iCount) 35444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 35454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 0; 35474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = FX_ArraySize(strSpecial); 35484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iCount) { 35494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == strSpecial[i]) { 35504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(ch); 35514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 35524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 35544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < iCount) 35564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 35574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ch >= 0x80 && ch <= 0xff) || ch <= 0x1f || ch == 0x7f) { 35594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = ch / 16; 35604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = strCode[iIndex]; 35614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[2] = strCode[ch - iIndex * 16]; 356233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 35634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch >= 0x20 && ch <= 0x7e) { 35644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(ch); 35654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t iRadix = 16; 3567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString strTmp; 35684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ch >= iRadix) { 3569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t tmp = strCode[ch % iRadix]; 35704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch /= iRadix; 35714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTmp += tmp; 35724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strTmp += strCode[ch]; 35744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = strTmp.GetLength(); 35754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLen < 2) 35764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 35774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 35784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 35794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLen % 2 != 0) { 35804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = '0'; 3581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strEncode[2] = strTmp[iLen - 1]; 35824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex = iLen - 2; 35834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 3584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strEncode[1] = strTmp[iLen - 1]; 3585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strEncode[2] = strTmp[iLen - 2]; 35864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex = iLen - 3; 35874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 358833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 35894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex > 0) { 3590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strEncode[1] = strTmp[iIndex]; 3591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strEncode[2] = strTmp[iIndex - 1]; 35924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex -= 2; 359333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 35944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 35974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(0); 3598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 35994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 36004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 36014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::EncodeHTML(const ByteString& szHTMLString) { 3603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsHTMLString = WideString::FromUTF8(szHTMLString.AsStringView()); 3604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* strCode = L"0123456789abcdef"; 3605d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strEncode[9]; 36064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[0] = '&'; 36074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = '#'; 36084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[2] = 'x'; 36094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = ';'; 36104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = 0; 36114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[7] = ';'; 36124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[8] = 0; 36134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsResultBuf; 36144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLen = wsHTMLString.GetLength(); 36154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 3616d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsHTMLString.c_str(); 36174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLen) { 36184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t ch = pData[i]; 3619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString htmlReserve; 3620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (HTMLCode2STR(ch, &htmlReserve)) { 36214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(L'&'); 36224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf << htmlReserve; 36234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(L';'); 36244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch >= 32 && ch <= 126) { 3625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf.AppendChar((wchar_t)ch); 36264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch < 256) { 36274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = ch / 16; 36284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[3] = strCode[iIndex]; 36294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[4] = strCode[ch - iIndex * 16]; 36304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = ';'; 36314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = 0; 363233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 36334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 36344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBigByte = ch / 256; 36354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLittleByte = ch % 256; 36364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[3] = strCode[iBigByte / 16]; 36374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[4] = strCode[iBigByte % 16]; 36384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = strCode[iLittleByte / 16]; 36394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = strCode[iLittleByte % 16]; 364033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 36414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 36424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 36434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 36444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(0); 3645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 36464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 36474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 36484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFXJSE_FormCalcContext::EncodeXML(const ByteString& szXMLString) { 3650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsXMLString = WideString::FromUTF8(szXMLString.AsStringView()); 36514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsResultBuf; 3652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t strEncode[9]; 36534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[0] = '&'; 36544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[1] = '#'; 36554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[2] = 'x'; 36564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = ';'; 36574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = 0; 36584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[7] = ';'; 36594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[8] = 0; 3660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* strCode = L"0123456789abcdef"; 3661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (const auto& ch : wsXMLString) { 36624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (ch) { 36634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '"': 36644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar('&'); 3665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf << WideStringView(L"quot"); 36664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(';'); 36674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 36684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '&': 36694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar('&'); 3670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf << WideStringView(L"amp"); 36714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(';'); 36724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 36734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '\'': 36744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar('&'); 3675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf << WideStringView(L"apos"); 36764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(';'); 36774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 36784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '<': 36794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar('&'); 3680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf << WideStringView(L"lt"); 36814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(';'); 36824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 36834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case '>': 36844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar('&'); 3685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsResultBuf << WideStringView(L"gt"); 36864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(';'); 36874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 36884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: { 36894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= 32 && ch <= 126) { 36904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(ch); 36914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch < 256) { 36924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = ch / 16; 36934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[3] = strCode[iIndex]; 36944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[4] = strCode[ch - iIndex * 16]; 36954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = ';'; 36964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = 0; 369733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 36984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 36994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iBigByte = ch / 256; 37004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLittleByte = ch % 256; 37014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[3] = strCode[iBigByte / 16]; 37024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[4] = strCode[iBigByte % 16]; 37034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[5] = strCode[iLittleByte / 16]; 37044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strEncode[6] = strCode[iLittleByte % 16]; 370533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsResultBuf << strEncode; 37064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 37084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsResultBuf.AppendChar(0); 3712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wsResultBuf.MakeString(); 37134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 37144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::HTMLSTR2Code(const WideStringView& pData, 3717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint32_t* iCode) { 3718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto cmpFunc = [](const XFA_FMHtmlReserveCode& iter, 3719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& val) { 3720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // TODO(tsepez): check usage of c_str() below. 3721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return wcscmp(val.unterminated_c_str(), iter.m_htmlReserve) > 0; 3722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann }; 3723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const XFA_FMHtmlReserveCode* result = 3724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::lower_bound(std::begin(reservesForDecode), 3725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::end(reservesForDecode), pData, cmpFunc); 3726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (result != std::end(reservesForEncode) && 3727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann !wcscmp(pData.unterminated_c_str(), result->m_htmlReserve)) { 3728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *iCode = result->m_uCode; 3729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 3730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 37314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 37324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 37334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::HTMLCode2STR(uint32_t iCode, 3736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString* wsHTMLReserve) { 3737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto cmpFunc = [](const XFA_FMHtmlReserveCode iter, const uint32_t& val) { 3738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return iter.m_uCode < val; 3739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann }; 3740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const XFA_FMHtmlReserveCode* result = 3741d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::lower_bound(std::begin(reservesForEncode), 3742d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::end(reservesForEncode), iCode, cmpFunc); 3743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (result != std::end(reservesForEncode) && result->m_uCode == iCode) { 3744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *wsHTMLReserve = result->m_htmlReserve; 3745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 3746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 37474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 37484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 37494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3751d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Format(CFXJSE_Value* pThis, 3752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 3754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 37554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() < 2) { 37564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Format"); 37574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 37584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 37594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 3761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szPattern = ValueToUTF8String(argOne.get()); 37624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 3764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szValue = ValueToUTF8String(argTwo.get()); 37654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 37664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 37674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 37684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); 37694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pThisNode); 37704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = pThisNode->GetLocale(); 37724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t patternType; 3773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsPattern = WideString::FromUTF8(szPattern.AsStringView()); 3774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsValue = WideString::FromUTF8(szValue.AsStringView()); 3775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!PatternStringType(szPattern.AsStringView(), patternType)) { 37764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (patternType) { 37774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_DATETIME: { 3778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto iTChar = wsPattern.Find(L'T'); 3779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!iTChar.has_value()) { 3780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(""); 3781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 3782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 3783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsDatePattern(L"date{"); 3784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsDatePattern += wsPattern.Left(iTChar.value()) + L"} "; 37854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3786d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTimePattern(L"time{"); 3787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsTimePattern += 3788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsPattern.Right(wsPattern.GetLength() - (iTChar.value() + 1)) + 3789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"}"; 37904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = wsDatePattern + wsTimePattern; 37914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 37924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_DATE: { 37934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"date{" + wsPattern + L"}"; 37944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 37954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_TIME: { 37964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"time{" + wsPattern + L"}"; 37974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 37984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_TEXT: { 37994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"text{" + wsPattern + L"}"; 38004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 38014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_FLOAT: { 38024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"num{" + wsPattern + L"}"; 38034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 38044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: { 3805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTestPattern; 38064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsTestPattern = L"num{" + wsPattern + L"}"; 38074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue tempLocaleValue(XFA_VT_FLOAT, wsValue, wsTestPattern, 38084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLocale, pMgr); 38094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (tempLocaleValue.IsValid()) { 38104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = wsTestPattern; 38114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_FLOAT; 38124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 38134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsTestPattern = L"text{" + wsPattern + L"}"; 38144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = wsTestPattern; 38154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann patternType = XFA_VT_TEXT; 38164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } break; 38184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, pMgr); 3821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsRet; 38224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.FormatPatterns(wsRet, wsPattern, pLocale, 38234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_VALUEPICTURE_Display)) { 38244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 38254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(wsRet.UTF8Encode().AsStringView()); 38294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 38304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Left(CFXJSE_Value* pThis, 3833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 38354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 38364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Left"); 38374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 38414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 38424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ValueIsNull(pThis, argOne.get())) || 38434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ValueIsNull(pThis, argTwo.get()))) { 38444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 38454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString = ValueToUTF8String(argOne.get()); 38494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get())); 3850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(sourceString.Left(count).AsStringView()); 38514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 38524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Len(CFXJSE_Value* pThis, 3855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 38574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 38584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Len"); 38594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 38634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 38644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 38654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString = ValueToUTF8String(argOne.get()); 38694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(sourceString.GetLength()); 38704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 38714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Lower(CFXJSE_Value* pThis, 3874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 38764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 38774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 38784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Lower"); 38794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 38834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 38844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 38854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 38864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 38874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 38884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf lowStringBuf; 3889d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString argString = ValueToUTF8String(argOne.get()); 3890d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsArgString = WideString::FromUTF8(argString.AsStringView()); 3891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsArgString.c_str(); 3892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t i = 0; 38934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < argString.GetLength()) { 38944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t ch = pData[i]; 38954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0xC0 && ch <= 0xDE)) 38964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch += 32; 38974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (ch == 0x100 || ch == 0x102 || ch == 0x104) 38984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch += 1; 38994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lowStringBuf.AppendChar(ch); 39014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 39024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lowStringBuf.AppendChar(0); 39044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 3906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(lowStringBuf.AsStringView()).AsStringView()); 39074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 39084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3910d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Ltrim(CFXJSE_Value* pThis, 3911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3912d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 39134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 39144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Ltrim"); 39154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 39194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 39204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 39214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString = ValueToUTF8String(argOne.get()); 39254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sourceString.TrimLeft(); 3926d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(sourceString.AsStringView()); 39274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 39284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 3930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Parse(CFXJSE_Value* pThis, 3931d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 3932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 3933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 39344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 39354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Parse"); 39364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 39404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 39414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argTwo.get())) { 39424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 39434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szPattern = ValueToUTF8String(argOne.get()); 3947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szValue = ValueToUTF8String(argTwo.get()); 39484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 39494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleMgr* pMgr = pDoc->GetLocalMgr(); 39504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Node* pThisNode = ToNode(pDoc->GetScriptContext()->GetThisObject()); 39514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pThisNode); 39524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann IFX_Locale* pLocale = pThisNode->GetLocale(); 3954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsPattern = WideString::FromUTF8(szPattern.AsStringView()); 3955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsValue = WideString::FromUTF8(szValue.AsStringView()); 39564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t patternType; 3957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (PatternStringType(szPattern.AsStringView(), patternType)) { 39584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, 39594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 39604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 39614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 39624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 3965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue.GetValue().UTF8Encode().AsStringView()); 39664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 39694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (patternType) { 39704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_DATETIME: { 3971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto iTChar = wsPattern.Find(L'T'); 3972d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!iTChar.has_value()) { 3973d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(""); 3974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 3975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 3976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsDatePattern(L"date{" + wsPattern.Left(iTChar.value()) + 3977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"} "); 3978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTimePattern( 3979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"time{" + 3980d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsPattern.Right(wsPattern.GetLength() - (iTChar.value() + 1)) + L"}"); 39814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = wsDatePattern + wsTimePattern; 39824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, 39834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 39844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 39854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 39864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 3989d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue.GetValue().UTF8Encode().AsStringView()); 39904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 39924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_DATE: { 39934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"date{" + wsPattern + L"}"; 39944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, 39954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 39964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 39974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 39984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 39994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 4001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue.GetValue().UTF8Encode().AsStringView()); 40024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_TIME: { 40054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"time{" + wsPattern + L"}"; 40064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(patternType, wsValue, wsPattern, pLocale, 40074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 40084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 40094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 40104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 4013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue.GetValue().UTF8Encode().AsStringView()); 40144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_TEXT: { 40174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"text{" + wsPattern + L"}"; 40184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(XFA_VT_TEXT, wsValue, wsPattern, pLocale, 40194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 40204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 40214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 40224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 4025d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue.GetValue().UTF8Encode().AsStringView()); 40264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case XFA_VT_FLOAT: { 40294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsPattern = L"num{" + wsPattern + L"}"; 40304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsPattern, pLocale, 40314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pMgr); 40324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue.IsValid()) { 40334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 40344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); 40374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann default: { 4040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsTestPattern; 40414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsTestPattern = L"num{" + wsPattern + L"}"; 40424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue(XFA_VT_FLOAT, wsValue, wsTestPattern, 40434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLocale, pMgr); 40444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (localeValue.IsValid()) { 40454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(localeValue.GetDoubleNum()); 40464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 40494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsTestPattern = L"text{" + wsPattern + L"}"; 40504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_LocaleValue localeValue2(XFA_VT_TEXT, wsValue, wsTestPattern, 40514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pLocale, pMgr); 40524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!localeValue2.IsValid()) { 40534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 40544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 4057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeValue2.GetValue().UTF8Encode().AsStringView()); 40584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 40624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 40634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Replace(CFXJSE_Value* pThis, 4065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 40674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 40684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 2 || argc > 3) { 40694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Replace"); 40704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 40714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 40734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 40744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 4075d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString oneString; 4076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString twoString; 40774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!ValueIsNull(pThis, argOne.get()) && !ValueIsNull(pThis, argTwo.get())) { 4078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann oneString = ValueToUTF8String(argOne.get()); 4079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann twoString = ValueToUTF8String(argTwo.get()); 40804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString threeString; 40834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 40844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 4085d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann threeString = ValueToUTF8String(argThree.get()); 40864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4088d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t iFindLen = twoString.GetLength(); 4089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream resultString; 4090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t iFindIndex = 0; 4091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (size_t u = 0; u < oneString.GetLength(); ++u) { 4092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann char ch = static_cast<char>(oneString[u]); 4093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ch != static_cast<char>(twoString[iFindIndex])) { 4094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << ch; 40954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 40964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 40974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4098d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t iTemp = u + 1; 40994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iFindIndex; 41004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iFindIndex < iFindLen) { 4101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint8_t chTemp = oneString[iTemp]; 4102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (chTemp != twoString[iFindIndex]) { 41034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iFindIndex = 0; 41044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 41054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iTemp; 41084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iFindIndex; 41094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iFindIndex == iFindLen) { 4111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << threeString; 41124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann u += iFindLen - 1; 41134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iFindIndex = 0; 41144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << ch; 41164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << '\0'; 4119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(resultString.str().c_str())); 41204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 41214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Right(CFXJSE_Value* pThis, 4124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 41264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 41274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Right"); 41284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 41324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 41334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ValueIsNull(pThis, argOne.get())) || 41344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ValueIsNull(pThis, argTwo.get()))) { 41354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 41364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString = ValueToUTF8String(argOne.get()); 41404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get())); 4141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(sourceString.Right(count).AsStringView()); 41424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 41434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Rtrim(CFXJSE_Value* pThis, 4146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 41484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 41494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Rtrim"); 41504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 41544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 41554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 41564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString = ValueToUTF8String(argOne.get()); 41604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann sourceString.TrimRight(); 4161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(sourceString.AsStringView()); 41624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 41634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Space(CFXJSE_Value* pThis, 4166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 41684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 41694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Space"); 41704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 41744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 41754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 41764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t count = std::max(0, ValueToInteger(pThis, argOne.get())); 4180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream spaceString; 41814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t index = 0; 41824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (index < count) { 4183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann spaceString << ' '; 41844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 41854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann spaceString << '\0'; 4187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(spaceString.str().c_str())); 41884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 41894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 41904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Str(CFXJSE_Value* pThis, 4192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 41944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 41954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 41964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Str"); 41974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 41984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 41994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); 42014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (numberValue->IsNull()) { 42024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 42034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 42044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fNumber = ValueToFloat(pThis, numberValue.get()); 42064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iWidth = 10; 42084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 42094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> widthValue = GetSimpleValue(pThis, args, 1); 42104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWidth = static_cast<int32_t>(ValueToFloat(pThis, widthValue.get())); 42114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iPrecision = 0; 42144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 42154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> precisionValue = 42164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetSimpleValue(pThis, args, 2); 42174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iPrecision = std::max( 42184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, static_cast<int32_t>(ValueToFloat(pThis, precisionValue.get()))); 42194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString formatStr = "%"; 42224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPrecision) { 42234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatStr += "."; 4224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann formatStr += ByteString::FormatInteger(iPrecision); 42254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann formatStr += "f"; 4227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString numberString = ByteString::Format(formatStr.c_str(), fNumber); 42284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pData = numberString.c_str(); 42304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = numberString.GetLength(); 42314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t u = 0; 42324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (u < iLength) { 42334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[u] == '.') 42344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 42354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 42374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream resultBuf; 42404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (u > iWidth || (iPrecision + u) >= iWidth) { 42414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 42424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iWidth) { 4243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '*'; 42444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '\0'; 4247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str())); 42484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 42494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (u == iLength) { 42524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > iWidth) { 42534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 42544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iWidth) { 4255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '*'; 42564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 42594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 42604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iWidth - iLength) { 4261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << ' '; 42624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultBuf << pData; 42654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str())); 42674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 42684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLeavingSpace = iWidth - u - iPrecision; 42714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPrecision != 0) 42724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLeavingSpace--; 42734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 42754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLeavingSpace) { 4276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << ' '; 42774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 0; 42804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < u) { 4281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << pData[i]; 42824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iPrecision != 0) 4285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '.'; 42864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 42874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann u++; 42884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = 0; 42894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (u < iLength) { 42904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i >= iPrecision) 42914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 42924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << pData[u]; 42944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 42954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++u; 42964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 42974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iPrecision) { 4298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '0'; 42994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 43004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultBuf << '\0'; 4302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(resultBuf.str().c_str())); 43034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 43044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Stuff(CFXJSE_Value* pThis, 4307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 43094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 43104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 3 || argc > 4) { 43114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Stuff"); 43124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 43134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString sourceString; 4316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString insertString; 43174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = 0; 43184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart = 0; 43194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iDelete = 0; 43204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> sourceValue = GetSimpleValue(pThis, args, 0); 43214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); 43224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> deleteValue = GetSimpleValue(pThis, args, 2); 43234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!sourceValue->IsNull() && !startValue->IsNull() && 43244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !deleteValue->IsNull()) { 4325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann sourceString = ValueToUTF8String(sourceValue.get()); 43264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength = sourceString.GetLength(); 4327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iStart = pdfium::clamp( 4328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static_cast<int32_t>(ValueToFloat(pThis, startValue.get())), 1, 4329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iLength); 43304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iDelete = std::max( 43314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 0, static_cast<int32_t>(ValueToFloat(pThis, deleteValue.get()))); 43324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 3) { 43354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> insertValue = GetSimpleValue(pThis, args, 3); 4336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann insertString = ValueToUTF8String(insertValue.get()); 43374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStart -= 1; 4340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream resultString; 43414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t i = 0; 43424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iStart) { 4343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << static_cast<char>(sourceString[i]); 43444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 43454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << insertString.AsStringView(); 43474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i = iStart + iDelete; 43484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < iLength) { 4349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << static_cast<char>(sourceString[i]); 43504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 43514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultString << '\0'; 4353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(resultString.str().c_str())); 43544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 43554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Substr(CFXJSE_Value* pThis, 4358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 43604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 3) { 43614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Substr"); 43624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 43634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> stringValue = GetSimpleValue(pThis, args, 0); 43664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> startValue = GetSimpleValue(pThis, args, 1); 43674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> endValue = GetSimpleValue(pThis, args, 2); 43684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, stringValue.get()) || 43694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ValueIsNull(pThis, startValue.get())) || 43704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (ValueIsNull(pThis, endValue.get()))) { 43714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 43724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 43734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart = 0; 43764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = 0; 4377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szSourceStr = ValueToUTF8String(stringValue.get()); 43784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = szSourceStr.GetLength(); 43794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength == 0) { 43804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 43814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 43824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 43834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iStart = pdfium::clamp( 4385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iLength, 1, static_cast<int32_t>(ValueToFloat(pThis, startValue.get()))); 43864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = 43874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::max(0, static_cast<int32_t>(ValueToFloat(pThis, endValue.get()))); 43884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iStart -= 1; 4390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 4391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szSourceStr.Mid(iStart, iCount).AsStringView()); 43924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 43934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 43944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Uuid(CFXJSE_Value* pThis, 4396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 43984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 43994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 0 || argc > 1) { 44004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Uuid"); 44014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iNum = 0; 44054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 0) { 44064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 44074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iNum = static_cast<int32_t>(ValueToFloat(pThis, argOne.get())); 44084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(GUIDString(!!iNum).AsStringView()); 44104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 44114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Upper(CFXJSE_Value* pThis, 4414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 44164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 44174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 2) { 44184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"Upper"); 44194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 44234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argOne.get())) { 44244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 44254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf upperStringBuf; 4429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString argString = ValueToUTF8String(argOne.get()); 4430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsArgString = WideString::FromUTF8(argString.AsStringView()); 4431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* pData = wsArgString.c_str(); 4432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t i = 0; 44334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < wsArgString.GetLength()) { 44344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t ch = pData[i]; 44354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((ch >= 0x61 && ch <= 0x7A) || (ch >= 0xE0 && ch <= 0xFE)) 44364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch -= 32; 44374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (ch == 0x101 || ch == 0x103 || ch == 0x105) 44384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch -= 1; 44394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann upperStringBuf.AppendChar(ch); 44414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++i; 44424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann upperStringBuf.AppendChar(0); 44444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 4446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(upperStringBuf.AsStringView()).AsStringView()); 44474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 44484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::WordNum(CFXJSE_Value* pThis, 4451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 44534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 44544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 1 || argc > 3) { 44554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowParamCountMismatchException(L"WordNum"); 44564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> numberValue = GetSimpleValue(pThis, args, 0); 44604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (numberValue->IsNull()) { 44614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 44624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float fNumber = ValueToFloat(pThis, numberValue.get()); 44654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIdentifier = 0; 44674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 1) { 44684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> identifierValue = 44694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetSimpleValue(pThis, args, 1); 44704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (identifierValue->IsNull()) { 44714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 44724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIdentifier = 44754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann static_cast<int32_t>(ValueToFloat(pThis, identifierValue.get())); 44764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString localeString; 44794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 44804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> localeValue = GetSimpleValue(pThis, args, 2); 44814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (localeValue->IsNull()) { 44824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 44834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann localeString = ValueToUTF8String(localeValue.get()); 44864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 44884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fNumber < 0.0f || fNumber > 922337203685477550.0f) { 44894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString("*"); 44904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 44914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 44924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString( 4494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WordUS(ByteString::Format("%.2f", fNumber), iIdentifier).AsStringView()); 4495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 4496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 4497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// static 4498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::TrillionUS(const ByteStringView& szData) { 4499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream strBuf; 4500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringView pUnits[] = {"zero", "one", "two", "three", "four", 4501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "five", "six", "seven", "eight", "nine"}; 4502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringView pCapUnits[] = {"Zero", "One", "Two", "Three", "Four", 4503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "Five", "Six", "Seven", "Eight", "Nine"}; 4504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringView pTens[] = {"Ten", "Eleven", "Twelve", "Thirteen", 4505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "Fourteen", "Fifteen", "Sixteen", "Seventeen", 4506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "Eighteen", "Nineteen"}; 4507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringView pLastTens[] = {"Twenty", "Thirty", "Forty", "Fifty", 4508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "Sixty", "Seventy", "Eighty", "Ninety"}; 4509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringView pComm[] = {" Hundred ", " Thousand ", " Million ", " Billion ", 4510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "Trillion"}; 4511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pData = szData.unterminated_c_str(); 45124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = szData.GetLength(); 45134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iComm = 0; 45144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 12) 45154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iComm = 4; 45164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (iLength > 9) 45174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iComm = 3; 45184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (iLength > 6) 45194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iComm = 2; 45204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else if (iLength > 3) 45214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iComm = 1; 45224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 45234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFirstCount = iLength % 3; 45244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iFirstCount == 0) 45254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iFirstCount = 3; 45264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 45274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 45284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iFirstCount == 3) { 45294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] != '0') { 45304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex] - '0']; 45314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pComm[0]; 45324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex + 1] == '0') { 45344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 2] - '0']; 45354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 45364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex + 1] > '1') { 45374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pLastTens[pData[iIndex + 1] - '2']; 45384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << "-"; 45394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pUnits[pData[iIndex + 2] - '0']; 45404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex + 1] == '1') { 45414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pTens[pData[iIndex + 2] - '0']; 45424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex + 1] == '0') { 45434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 2] - '0']; 45444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 3; 45474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iFirstCount == 2) { 45484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] == '0') { 45494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 1] - '0']; 45504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 45514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] > '1') { 45524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pLastTens[pData[iIndex] - '2']; 45534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << "-"; 45544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pUnits[pData[iIndex + 1] - '0']; 45554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex] == '1') { 45564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pTens[pData[iIndex + 1] - '0']; 45574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex] == '0') { 45584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 1] - '0']; 45594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 2; 45624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iFirstCount == 1) { 45634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex] - '0']; 45644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 1; 45654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength > 3 && iFirstCount > 0) { 45674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pComm[iComm]; 45684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann --iComm; 45694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 45714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] != '0') { 45724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex] - '0']; 45734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pComm[0]; 45744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex + 1] == '0') { 45764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 2] - '0']; 45774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 45784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex + 1] > '1') { 45794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pLastTens[pData[iIndex + 1] - '2']; 45804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << "-"; 45814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pUnits[pData[iIndex + 2] - '0']; 45824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex + 1] == '1') { 45834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pTens[pData[iIndex + 2] - '0']; 45844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (pData[iIndex + 1] == '0') { 45854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pCapUnits[pData[iIndex + 2] - '0']; 45864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex < iLength - 3) { 45894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << pComm[iComm]; 45904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann --iComm; 45914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 45924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += 3; 45934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(strBuf); 45954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 45964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 45974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::WordUS(const ByteString& szData, 4599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iStyle) { 4600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const char* pData = szData.c_str(); 46014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = szData.GetLength(); 46024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle < 0 || iStyle > 2) { 4603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 46044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::ostringstream strBuf; 4607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 46084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 0; 46094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 46104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[iIndex] == '.') 46114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 46124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iIndex; 46134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iInteger = iIndex; 46154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex = 0; 46164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iInteger) { 46174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = (iInteger - iIndex) % 12; 46184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!iCount && iInteger - iIndex > 0) 46194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = 12; 46204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strBuf << TrillionUS(ByteStringView(pData + iIndex, iCount)); 46224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += iCount; 46234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex < iInteger) 46244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << " Trillion "; 46254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle > 0) 46284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << " Dollars"; 46294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iStyle > 1 && iInteger < iLength) { 46314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << " And "; 46324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex = iInteger + 1; 46334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iIndex < iLength) { 46344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = (iLength - iIndex) % 12; 46354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!iCount && iLength - iIndex > 0) 46364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount = 12; 46374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann strBuf << TrillionUS(ByteStringView(pData + iIndex, iCount)); 46394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex += iCount; 46404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndex < iLength) 46414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << " Trillion "; 46424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strBuf << " Cents"; 46444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(strBuf); 46464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 46474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Get(CFXJSE_Value* pThis, 4650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 4652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 46534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 46544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Get"); 46554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 46594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 46604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IXFA_AppProvider* pAppProvider = pDoc->GetNotify()->GetAppProvider(); 46634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAppProvider) 46644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 4667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString urlString = ValueToUTF8String(argOne.get()); 4668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RetainPtr<IFX_SeekableReadStream> pFile = 4669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pAppProvider->DownloadURL(WideString::FromUTF8(urlString.AsStringView())); 46704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pFile) 46714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t size = pFile->GetSize(); 4674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::vector<uint8_t> dataBuf(size); 4675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pFile->ReadBlock(dataBuf.data(), size); 4676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(ByteStringView(dataBuf)); 46774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 46784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Post(CFXJSE_Value* pThis, 4681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 4683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 46844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 46854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 2 || argc > 5) { 46864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Post"); 46874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 46894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 46914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 46924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IXFA_AppProvider* pAppProvider = pDoc->GetNotify()->GetAppProvider(); 46954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAppProvider) 46964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 46974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 46984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 4699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsURL = ValueToUTF8String(argOne.get()); 47004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 4702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsData = ValueToUTF8String(argTwo.get()); 47034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsContentType; 47054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 47064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 4707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsContentType = ValueToUTF8String(argThree.get()); 47084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsEncode; 47114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 3) { 47124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFour = GetSimpleValue(pThis, args, 3); 4713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsEncode = ValueToUTF8String(argFour.get()); 47144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsHeader; 47174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 4) { 47184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFive = GetSimpleValue(pThis, args, 4); 4719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsHeader = ValueToUTF8String(argFive.get()); 47204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString decodedResponse; 47234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAppProvider->PostRequestURL( 4724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsURL.AsStringView()), 4725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsData.AsStringView()), 4726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsContentType.AsStringView()), 4727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsEncode.AsStringView()), 4728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsHeader.AsStringView()), decodedResponse)) { 47294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowServerDeniedException(); 47304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetString(decodedResponse.UTF8Encode().AsStringView()); 47334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 47344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::Put(CFXJSE_Value* pThis, 4737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 4739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 47404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 47414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 2 || argc > 3) { 47424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Put"); 47434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = pContext->GetDocument(); 47474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 47484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IXFA_AppProvider* pAppProvider = pDoc->GetNotify()->GetAppProvider(); 47514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAppProvider) 47524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 4755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsURL = ValueToUTF8String(argOne.get()); 47564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argTwo = GetSimpleValue(pThis, args, 1); 4758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsData = ValueToUTF8String(argTwo.get()); 47594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsEncode; 47614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 2) { 47624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argThree = GetSimpleValue(pThis, args, 2); 4763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsEncode = ValueToUTF8String(argThree.get()); 47644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pAppProvider->PutRequestURL( 4767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsURL.AsStringView()), 4768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsData.AsStringView()), 4769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(bsEncode.AsStringView()))) { 47704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowServerDeniedException(); 47714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString(""); 47754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 47764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::assign_value_operator( 4779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 4780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 4782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 47834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 47844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 47854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 47864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 47874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 47884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> lValue = args.GetValue(0); 47894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> rValue = GetSimpleValue(pThis, args, 1); 47904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (lValue->IsArray()) { 47914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 47924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto leftLengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 47934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lValue->GetObjectProperty("length", leftLengthValue.get()); 47944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLeftLength = leftLengthValue->ToInteger(); 47954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 47964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 47974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lValue->GetObjectPropertyByIdx(1, propertyValue.get()); 47984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 47994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 2; i < iLeftLength; i++) { 48004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lValue->GetObjectPropertyByIdx(i, jsObjectValue.get()); 48014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!SetObjectDefaultValue(jsObjectValue.get(), rValue.get())) { 48024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowNoDefaultPropertyException(szFuncName); 48034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 48074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 2; i < iLeftLength; i++) { 48084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lValue->GetObjectPropertyByIdx(i, jsObjectValue.get()); 4809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->SetObjectProperty( 4810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), rValue.get()); 48114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (lValue->IsObject()) { 48144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!SetObjectDefaultValue(lValue.get(), rValue.get())) { 48154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowNoDefaultPropertyException(szFuncName); 48164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(rValue.get()); 48204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 48214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::logical_or_operator( 4824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 4825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 48274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 48284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 48294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 48334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 48344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() && argSecond->IsNull()) { 48354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 48364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float first = ValueToFloat(pThis, argFirst.get()); 4840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float second = ValueToFloat(pThis, argSecond.get()); 48414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first || second) ? 1 : 0); 48424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 48434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4845d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::logical_and_operator( 4846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 4847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 48494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 48504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 48514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 48554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 48564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() && argSecond->IsNull()) { 48574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 48584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float first = ValueToFloat(pThis, argFirst.get()); 4862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float second = ValueToFloat(pThis, argSecond.get()); 48634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first && second) ? 1 : 0); 48644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 48654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::equality_operator(CFXJSE_Value* pThis, 4868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 48704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 48714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 48724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fm_ref_equal(pThis, args)) { 48764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(1); 48774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 48814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 48824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 48834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 48844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 48854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 48894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(argFirst->ToString() == 48904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argSecond->ToString()); 48914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 48924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 48934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 4895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 48964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first == second) ? 1 : 0); 48974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 48984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 48994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4900d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::notequality_operator( 4901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 4902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 49044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 49054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 49064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (fm_ref_equal(pThis, args)) { 49104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 49114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 49154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 49164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 49174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 49184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argFirst->IsNull() && argSecond->IsNull()) ? 0 : 1); 49194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 49234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(argFirst->ToString() != 49244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argSecond->ToString()); 49254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 4929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 49304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(first != second); 49314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 49324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4934d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::fm_ref_equal(CFXJSE_Value* pThis, 4935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 49364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0); 49374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1); 49384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argFirst->IsArray() || !argSecond->IsArray()) 49394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 49404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 49424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto firstFlagValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 49434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto secondFlagValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 49444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argFirst->GetObjectPropertyByIdx(0, firstFlagValue.get()); 49454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argSecond->GetObjectPropertyByIdx(0, secondFlagValue.get()); 49464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (firstFlagValue->ToInteger() != 3 || secondFlagValue->ToInteger() != 3) 49474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 49484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto firstJSObject = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 49504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto secondJSObject = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 49514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argFirst->GetObjectPropertyByIdx(2, firstJSObject.get()); 49524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argSecond->GetObjectPropertyByIdx(2, secondJSObject.get()); 49534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (firstJSObject->IsNull() || secondJSObject->IsNull()) 49544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 49554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (firstJSObject->ToHostObject(nullptr) == 49574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann secondJSObject->ToHostObject(nullptr)); 49584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 49594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::less_operator(CFXJSE_Value* pThis, 4962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 49644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 49654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 49664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 49704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 49714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 49724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 49734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 4977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int result = 4978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann argFirst->ToString().Compare(argSecond->ToString().AsStringView()) < 0; 4979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(result); 49804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4983d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 4984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 49854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first < second) ? 1 : 0); 49864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 49874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 4989d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::lessequal_operator( 4990d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 4991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 4992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 49934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 49944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 49954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 49964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 49974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 49984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 49994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 50004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 50014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 50024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 50034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 5007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int result = 5008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann argFirst->ToString().Compare(argSecond->ToString().AsStringView()) <= 0; 5009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(result); 50104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 50154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first <= second) ? 1 : 0); 50164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 50174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::greater_operator(CFXJSE_Value* pThis, 5020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 50224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 50234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 50244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 50284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 50294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 50304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger(0); 50314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 5035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int result = 5036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann argFirst->ToString().Compare(argSecond->ToString().AsStringView()) > 0; 5037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(result); 50384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 50434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first > second) ? 1 : 0); 50444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 50454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::greaterequal_operator( 5048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 5049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 50514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 50524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 50534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 50574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 50584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() || argSecond->IsNull()) { 50594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger( 50604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argFirst->IsNull() && argSecond->IsNull()) ? 1 : 0); 50614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsString() && argSecond->IsString()) { 5065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int result = 5066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann argFirst->ToString().Compare(argSecond->ToString().AsStringView()) >= 0; 5067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann args.GetReturnValue()->SetInteger(result); 50684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 50734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first >= second) ? 1 : 0); 50744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 50754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::plus_operator(CFXJSE_Value* pThis, 5078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 50804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 50814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 50824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = args.GetValue(0); 50864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = args.GetValue(1); 50874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ValueIsNull(pThis, argFirst.get()) && 50884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ValueIsNull(pThis, argSecond.get())) { 50894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 50904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 50914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 50924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 50954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(first + second); 50964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 50974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 50984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5099d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::minus_operator(CFXJSE_Value* pThis, 5100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 51024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 51034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 51044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 51084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 51094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() && argSecond->IsNull()) { 51104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 51114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 51164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(first - second); 51174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 51184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::multiple_operator(CFXJSE_Value* pThis, 5121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 51234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 51244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 51254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 51294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 51304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() && argSecond->IsNull()) { 51314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 51324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 5136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 51374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(first * second); 51384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 51394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::divide_operator(CFXJSE_Value* pThis, 5142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 51454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 2) { 51464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 51474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argFirst = GetSimpleValue(pThis, args, 0); 51514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argSecond = GetSimpleValue(pThis, args, 1); 51524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argFirst->IsNull() && argSecond->IsNull()) { 51534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 51544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double second = ValueToDouble(pThis, argSecond.get()); 51584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (second == 0.0) { 51594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowDivideByZeroException(); 51604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argFirst.get()); 51644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(first / second); 51654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 51664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::positive_operator(CFXJSE_Value* pThis, 5169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 51714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 51724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 51734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 51774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 51784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 51794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(0.0 + ValueToDouble(pThis, argOne.get())); 51824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 51834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::negative_operator(CFXJSE_Value* pThis, 5186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 51884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 51894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 51904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 51934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 51944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 51954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 51964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 51974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 51984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetDouble(0.0 - ValueToDouble(pThis, argOne.get())); 51994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 52004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::logical_not_operator( 5203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pThis, 5204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 52064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 52074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 52084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 52124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsNull()) { 52134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetNull(); 52144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann double first = ValueToDouble(pThis, argOne.get()); 52184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetInteger((first == 0.0) ? 1 : 0); 52194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 52204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::dot_accessor(CFXJSE_Value* pThis, 5223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 52264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 52274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 52284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 4 || argc > 5) { 52294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 52304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsStar = true; 52344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndexValue = 0; 52354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 4) { 52364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsStar = false; 52374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndexValue = ValueToInteger(pThis, args.GetValue(4).get()); 52384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szName = args.GetUTF8String(2); 5241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szSomExp = GenerateSomExpression( 5242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szName.AsStringView(), args.GetInt32(3), iIndexValue, bIsStar); 52434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); 52454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argAccessor->IsArray()) { 52464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pLengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 52474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argAccessor->GetObjectProperty("length", pLengthValue.get()); 52484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pLengthValue->ToInteger(); 52494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 3) { 52504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 52514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto hJSObjValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 52554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::vector<std::unique_ptr<CFXJSE_Value>>> resolveValues( 52564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength - 2); 52574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAttribute = false; 52584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCounter = 0; 52594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 2; i < iLength; i++) { 52604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); 52614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS resolveNodeRS; 5263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringView(), 5264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, true, szName.IsEmpty())) { 5265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ParseResolveResult(pThis, resolveNodeRS, hJSObjValue.get(), 52664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &resolveValues[i - 2], &bAttribute); 52674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCounter += resolveValues[i - 2].size(); 52684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCounter < 1) { 52714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowPropertyNotInObjectException( 5272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szName.AsStringView()), 5273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szSomExp.AsStringView())); 52744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 52784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iCounter + 2; i++) 52794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 52804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(1); 52824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAttribute) 5283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann values[1]->SetString(szName.AsStringView()); 52844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 52854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 52864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 52874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 2; 52884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLength - 2; i++) { 52894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < resolveValues[i].size(); j++) { 52904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[iIndex]->Assign(resolveValues[i][j].get()); 52914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex++; 52924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 52954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 52964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 52974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS resolveNodeRS; 5299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool iRet = false; 5300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsAccessorName = args.GetUTF8String(1); 53014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argAccessor->IsObject() || 53024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { 5303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringView(), 5304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, true, szName.IsEmpty()); 53054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty() && 53064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectForName(pThis, argAccessor.get(), 5307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsAccessorName.AsStringView())) { 5308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringView(), 5309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, true, szName.IsEmpty()); 53104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!iRet) { 53124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowPropertyNotInObjectException( 5313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szName.AsStringView()), 5314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szSomExp.AsStringView())); 53154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 53164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> resolveValues; 53194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAttribute = false; 5320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ParseResolveResult(pThis, resolveNodeRS, argAccessor.get(), &resolveValues, 53214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &bAttribute); 53224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 53244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < resolveValues.size() + 2; i++) 53254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 53264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(1); 53284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAttribute) 5329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann values[1]->SetString(szName.AsStringView()); 53304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 53314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 53324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < resolveValues.size(); i++) 53344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[i + 2]->Assign(resolveValues[i].get()); 53354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 53374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 53384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::dotdot_accessor(CFXJSE_Value* pThis, 5341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 53444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 53454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 53464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc < 4 || argc > 5) { 53474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 53484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 53494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsStar = true; 53524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndexValue = 0; 53534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argc > 4) { 53544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsStar = false; 53554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndexValue = ValueToInteger(pThis, args.GetValue(4).get()); 53564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szName = args.GetUTF8String(2); 5359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szSomExp = GenerateSomExpression( 5360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szName.AsStringView(), args.GetInt32(3), iIndexValue, bIsStar); 53614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argAccessor = args.GetValue(0); 53634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argAccessor->IsArray()) { 53644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pLengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 53654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argAccessor->GetObjectProperty("length", pLengthValue.get()); 53664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = pLengthValue->ToInteger(); 53674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 3) { 53684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 53694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 53704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCounter = 0; 53734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::vector<std::unique_ptr<CFXJSE_Value>>> resolveValues( 53754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength - 2); 53764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto hJSObjValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 53774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAttribute = false; 53784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 2; i < iLength; i++) { 53794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argAccessor->GetObjectPropertyByIdx(i, hJSObjValue.get()); 5380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS resolveNodeRS; 5381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ResolveObjects(pThis, hJSObjValue.get(), szSomExp.AsStringView(), 5382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, false, false)) { 5383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ParseResolveResult(pThis, resolveNodeRS, hJSObjValue.get(), 53844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &resolveValues[i - 2], &bAttribute); 53854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCounter += resolveValues[i - 2].size(); 53864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iCounter < 1) { 53894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowPropertyNotInObjectException( 5390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szName.AsStringView()), 5391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szSomExp.AsStringView())); 53924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 53934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 53944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 53964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iCounter + 2; i++) 53974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 53984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 53994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(1); 54004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAttribute) 5401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann values[1]->SetString(szName.AsStringView()); 54024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 54034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 54044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iIndex = 2; 54064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iLength - 2; i++) { 54074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t j = 0; j < resolveValues[i].size(); j++) { 54084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[iIndex]->Assign(resolveValues[i][j].get()); 54094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndex++; 54104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 54134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS resolveNodeRS; 5417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool iRet = false; 5418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString bsAccessorName = args.GetUTF8String(1); 54194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argAccessor->IsObject() || 54204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (argAccessor->IsNull() && bsAccessorName.IsEmpty())) { 5421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringView(), 5422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, false, false); 54234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (!argAccessor->IsObject() && !bsAccessorName.IsEmpty() && 54244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectForName(pThis, argAccessor.get(), 5425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bsAccessorName.AsStringView())) { 5426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann iRet = ResolveObjects(pThis, argAccessor.get(), szSomExp.AsStringView(), 5427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &resolveNodeRS, false, false); 54284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!iRet) { 54304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowPropertyNotInObjectException( 5431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szName.AsStringView()), 5432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szSomExp.AsStringView())); 54334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> resolveValues; 54374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAttribute = false; 5438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ParseResolveResult(pThis, resolveNodeRS, argAccessor.get(), &resolveValues, 54394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann &bAttribute); 54404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 54424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < resolveValues.size() + 2; i++) 54434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 54444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(1); 54464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bAttribute) 5447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann values[1]->SetString(szName.AsStringView()); 54484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 54494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 54504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (size_t i = 0; i < resolveValues.size(); i++) 54524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[i + 2]->Assign(resolveValues[i].get()); 54534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 54554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 54564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::eval_translation(CFXJSE_Value* pThis, 5459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 54624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 54634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowParamCountMismatchException(L"Eval"); 54644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = GetSimpleValue(pThis, args, 0); 5468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString argString = ValueToUTF8String(argOne.get()); 54694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argString.IsEmpty()) { 54704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowArgumentMismatchException(); 54714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString scriptString = WideString::FromUTF8(argString.AsStringView()); 54754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideTextBuf wsJavaScriptBuf; 5476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!CFXJSE_FormCalcContext::Translate(scriptString.AsStringView(), 5477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &wsJavaScriptBuf)) { 54784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 54794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetString( 5483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FX_UTF8Encode(wsJavaScriptBuf.AsStringView()).AsStringView()); 54844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 54854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::is_fm_object(CFXJSE_Value* pThis, 5488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 54904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 54914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetBoolean(false); 54924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 54934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 54944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 54964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetBoolean(argOne->IsObject()); 54974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 54984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::is_fm_array(CFXJSE_Value* pThis, 5501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 55034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 55044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetBoolean(false); 55054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 55094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetBoolean(argOne->IsArray()); 55104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 55114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::get_fm_value(CFXJSE_Value* pThis, 5514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 55174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 55184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 55194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 55234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsArray()) { 55244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 55254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 55264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 55274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(1, propertyValue.get()); 55284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(2, jsObjectValue.get()); 55294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 55304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), args.GetReturnValue()); 55314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 55354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()); 55364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argOne->IsObject()) { 55404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argOne.get(), args.GetReturnValue()); 55414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(argOne.get()); 55454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 55464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::get_fm_jsobj(CFXJSE_Value* pThis, 5549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 55514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 55524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ToJSContext(pThis, nullptr)->ThrowCompilerErrorException(); 55534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 55574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argOne->IsArray()) { 55584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(argOne.get()); 55594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef NDEBUG 5563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 55644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 55654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 55664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectProperty("length", lengthValue.get()); 55674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(lengthValue->ToInteger() >= 3); 55684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 55694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(2, args.GetReturnValue()); 55714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 55724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::fm_var_filter(CFXJSE_Value* pThis, 5575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 5577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 55784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (args.GetLength() != 1) { 55794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 55804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 55844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argOne = args.GetValue(0); 55854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argOne->IsArray()) { 55864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0); 55874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(simpleValue.get()); 55884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 55894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 55904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef NDEBUG 55924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 55934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectProperty("length", lengthValue.get()); 55944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(lengthValue->ToInteger() >= 3); 55954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif 55964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 55974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto flagsValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 55984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(0, flagsValue.get()); 55994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iFlags = flagsValue->ToInteger(); 56004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iFlags != 3 && iFlags != 4) { 56014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> simpleValue = GetSimpleValue(pThis, args, 0); 56024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(simpleValue.get()); 56034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 56044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iFlags == 4) { 56074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> values; 56084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < 3; i++) 56094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 56104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[0]->SetInteger(3); 56124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[1]->SetNull(); 56134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann values[2]->SetNull(); 56144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(values); 56154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 56164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto objectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argOne->GetObjectPropertyByIdx(2, objectValue.get()); 56204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (objectValue->IsNull()) { 56214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pContext->ThrowCompilerErrorException(); 56224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 56234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->Assign(argOne.get()); 56254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 56264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::concat_fm_object(CFXJSE_Value* pThis, 5629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szFuncName, 5630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Arguments& args) { 56314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 56324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t iLength = 0; 56334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 56344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> argValues; 56354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 56364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValues.push_back(args.GetValue(i)); 56374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValues[i]->IsArray()) { 56384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValues[i]->GetObjectProperty("length", lengthValue.get()); 56404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t length = lengthValue->ToInteger(); 56414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength = iLength + ((length > 2) ? (length - 2) : 0); 56424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iLength += 1; 56444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> returnValues; 56474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < (int32_t)iLength; i++) 56484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann returnValues.push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 56494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t index = 0; 56514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc; i++) { 56524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argValues[i]->IsArray()) { 56534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValues[i]->GetObjectProperty("length", lengthValue.get()); 56554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t length = lengthValue->ToInteger(); 56574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < length; j++) { 56584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argValues[i]->GetObjectPropertyByIdx(j, returnValues[index].get()); 56594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 56604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann returnValues[index]->Assign(argValues[i].get()); 56634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 56644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann args.GetReturnValue()->SetArray(returnValues); 56664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 56674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::unique_ptr<CFXJSE_Value> CFXJSE_FormCalcContext::GetSimpleValue( 56704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* pThis, 56714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Arguments& args, 56724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t index) { 56734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 56744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(index < (uint32_t)args.GetLength()); 56754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CFXJSE_Value> argIndex = args.GetValue(index); 56774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!argIndex->IsArray() && !argIndex->IsObject()) 56784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return argIndex; 56794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argIndex->IsArray()) { 56814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndex->GetObjectProperty("length", lengthValue.get()); 56834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 56844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto simpleValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 3) { 56864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann simpleValue.get()->SetUndefined(); 56874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return simpleValue; 56884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 56904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 56924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndex->GetObjectPropertyByIdx(1, propertyValue.get()); 56934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argIndex->GetObjectPropertyByIdx(2, jsObjectValue.get()); 56944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 56954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), simpleValue.get()); 56964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return simpleValue; 56974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 56984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 57004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann simpleValue.get()); 57014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return simpleValue; 57024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto defaultValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argIndex.get(), defaultValue.get()); 57064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return defaultValue; 57074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 57084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::ValueIsNull(CFXJSE_Value* pThis, 5711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* arg) { 57124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!arg || arg->IsNull()) 57134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 57144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!arg->IsArray() && !arg->IsObject()) 57164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 57174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 57194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsArray()) { 57204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = hvalue_get_array_length(pThis, arg); 57214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 3) 57224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 57234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(1, propertyValue.get()); 57274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); 57284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 57294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto defaultValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), defaultValue.get()); 57314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return defaultValue->IsNull(); 57324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 5735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 57364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newPropertyValue.get()); 57374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return newPropertyValue->IsNull(); 57384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto defaultValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(arg, defaultValue.get()); 57424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return defaultValue->IsNull(); 57434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 57444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CFXJSE_FormCalcContext::hvalue_get_array_length(CFXJSE_Value* pThis, 5747d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* arg) { 57484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!arg || !arg->IsArray()) 57494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 57504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 57524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectProperty("length", lengthValue.get()); 57544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return lengthValue->ToInteger(); 57554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 57564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::simpleValueCompare(CFXJSE_Value* pThis, 5759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* firstValue, 5760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* secondValue) { 57614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!firstValue) 57624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 57634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (firstValue->IsString()) { 5765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString firstString = ValueToUTF8String(firstValue); 5766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString secondString = ValueToUTF8String(secondValue); 57674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return firstString == secondString; 57684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (firstValue->IsNumber()) { 5770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float first = ValueToFloat(pThis, firstValue); 5771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float second = ValueToFloat(pThis, secondValue); 5772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return first == second; 57734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 57744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (firstValue->IsBoolean()) 5775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return firstValue->ToBoolean() == secondValue->ToBoolean(); 57764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return firstValue->IsNull() && secondValue && secondValue->IsNull(); 57784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 57794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::unfoldArgs( 57824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* pThis, 57834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Arguments& args, 57844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues, 57854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iStart) { 57864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->clear(); 57874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 57884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iCount = 0; 57894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 57904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t argc = args.GetLength(); 57914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>> argsValue; 57924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc - iStart; i++) { 57934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue.push_back(args.GetValue(i + iStart)); 57944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argsValue[i]->IsArray()) { 57954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 57964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue[i]->GetObjectProperty("length", lengthValue.get()); 57974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 57984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount += ((iLength > 2) ? (iLength - 2) : 0); 57994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 58004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iCount += 1; 58014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < iCount; i++) 58054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 58064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t index = 0; 58084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t i = 0; i < argc - iStart; i++) { 58094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (argsValue[i]->IsArray()) { 58104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 58114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue[i]->GetObjectProperty("length", lengthValue.get()); 58124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 58134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength < 3) 58144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 58154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 58174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 58184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue[i]->GetObjectPropertyByIdx(1, propertyValue.get()); 58194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 58204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 58214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); 58224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), 58234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*resultValues)[index].get()); 58244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 58254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 58274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int32_t j = 2; j < iLength; j++) { 58284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann argsValue[i]->GetObjectPropertyByIdx(j, jsObjectValue.get()); 58294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann jsObjectValue->GetObjectProperty( 5830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann propertyValue->ToString().AsStringView(), 58314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*resultValues)[index].get()); 58324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 58334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (argsValue[i]->IsObject()) { 58364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(argsValue[i].get(), (*resultValues)[index].get()); 58374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 58384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 58394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (*resultValues)[index]->Assign(argsValue[i].get()); 58404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 58414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 58434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 58444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::GetObjectDefaultValue( 5847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pValue, 5848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pDefaultValue) { 5849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = ToNode(CFXJSE_Engine::ToObject(pValue, nullptr)); 58504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) { 58514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDefaultValue->SetNull(); 58524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 58534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->JSObject()->Script_Som_DefaultValue(pDefaultValue, false, 5855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::Unknown); 58564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 58574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5859d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::SetObjectDefaultValue(CFXJSE_Value* pValue, 5860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* hNewValue) { 5861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Node* pNode = ToNode(CFXJSE_Engine::ToObject(pValue, nullptr)); 58624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pNode) 58634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 58644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode->JSObject()->Script_Som_DefaultValue(hNewValue, true, 5866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_Attribute::Unknown); 58674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 58684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 58694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 58704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::GenerateSomExpression( 5872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szName, 5873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iIndexFlags, 5874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int32_t iIndexValue, 5875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bIsStar) { 5876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (bIsStar) 5877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(szName, "[*]"); 5878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndexFlags == 0) 5880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(szName); 5881d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 58824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iIndexFlags == 1 || iIndexValue == 0) { 5883d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(szName, "[") + ByteString::FormatInteger(iIndexValue) + 5884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann "]"; 5885d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 5886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString szSomExp; 5887d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iIndexFlags == 2) { 58884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann szSomExp = (iIndexValue < 0) ? (szName + "[-") : (szName + "[+"); 58894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; 5890d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szSomExp += ByteString::FormatInteger(iIndexValue); 58914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann szSomExp += "]"; 58924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 58934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann szSomExp = (iIndexValue < 0) ? (szName + "[") : (szName + "[-"); 58944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iIndexValue = (iIndexValue < 0) ? (0 - iIndexValue) : iIndexValue; 5895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann szSomExp += ByteString::FormatInteger(iIndexValue); 58964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann szSomExp += "]"; 58974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return szSomExp; 58994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 59004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 59014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::GetObjectForName( 59034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* pThis, 59044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* accessorValue, 5905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& szAccessorName) { 59064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 59074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 59084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 59094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5910d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext = pDoc->GetScriptContext(); 5911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS resolveNodeRS; 59124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwFlags = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | 59134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; 5914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool iRet = pScriptContext->ResolveObjects( 59154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pScriptContext->GetThisObject(), 5916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString::FromUTF8(szAccessorName).AsStringView(), &resolveNodeRS, 5917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann dwFlags, nullptr); 5918d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (iRet && resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { 59194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann accessorValue->Assign( 5920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pScriptContext->GetJSValueFromMap(resolveNodeRS.objects.front())); 59214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 59224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 59244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 59254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 59264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::ResolveObjects(CFXJSE_Value* pThis, 5928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pRefValue, 5929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& bsSomExp, 5930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann XFA_RESOLVENODE_RS* resolveNodeRS, 5931d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bdotAccessor, 5932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool bHasNoResolveName) { 59334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Document* pDoc = ToJSContext(pThis, nullptr)->GetDocument(); 59344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDoc) 5935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 59364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsSomExpression = WideString::FromUTF8(bsSomExp); 5938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext = pDoc->GetScriptContext(); 59394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CXFA_Object* pNode = nullptr; 59404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dFlags = 0UL; 59414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bdotAccessor) { 59424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pRefValue && pRefValue->IsNull()) { 59434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pNode = pScriptContext->GetThisObject(); 59444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dFlags = XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; 59454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = CFXJSE_Engine::ToObject(pRefValue, nullptr); 59474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(pNode); 59484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bHasNoResolveName) { 5949d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsName; 5950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (CXFA_Node* pXFANode = pNode->AsNode()) { 5951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<WideString> ret = 5952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pXFANode->JSObject()->TryAttribute(XFA_Attribute::Name, false); 5953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (ret) 5954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsName = *ret; 5955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 59564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsName.IsEmpty()) 595733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann wsName = L"#" + pNode->GetClassName(); 59584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 59594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann wsSomExpression = wsName + wsSomExpression; 59604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dFlags = XFA_RESOLVENODE_Siblings; 59614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 59624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dFlags = (bsSomExp == "*") 59634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ? (XFA_RESOLVENODE_Children) 59644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : (XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes | 59654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann XFA_RESOLVENODE_Properties); 59664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5969d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pNode = CFXJSE_Engine::ToObject(pRefValue, nullptr); 59704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dFlags = XFA_RESOLVENODE_AnyChild; 59714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5972d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return pScriptContext->ResolveObjects(pNode, wsSomExpression.AsStringView(), 5973d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resolveNodeRS, dFlags, nullptr); 59744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 59754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 59764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 5977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ParseResolveResult( 59784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* pThis, 5979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const XFA_RESOLVENODE_RS& resolveNodeRS, 59804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFXJSE_Value* pParentValue, 59814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::vector<std::unique_ptr<CFXJSE_Value>>* resultValues, 59824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool* bAttribute) { 59834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(bAttribute); 59844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 59854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->clear(); 59864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_FormCalcContext* pContext = ToJSContext(pThis, nullptr); 59884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = pContext->GetScriptRuntime(); 59894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5990d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) { 59914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *bAttribute = false; 5992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Engine* pScriptContext = pContext->GetDocument()->GetScriptContext(); 5993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Object* pObject : resolveNodeRS.objects) { 59944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 5995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultValues->back()->Assign(pScriptContext->GetJSValueFromMap(pObject)); 59964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 59984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 59994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *bAttribute = true; 6001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (resolveNodeRS.pScriptAttribute && 6002d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resolveNodeRS.pScriptAttribute->eValueType == XFA_ScriptType::Object) { 6003d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann for (CXFA_Object* pObject : resolveNodeRS.objects) { 6004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann auto pValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CJX_Object* jsObject = pObject->JSObject(); 6006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann (jsObject->*(resolveNodeRS.pScriptAttribute->callback))( 6007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann pValue.get(), false, resolveNodeRS.pScriptAttribute->attribute); 6008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann resultValues->push_back(std::move(pValue)); 6010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann *bAttribute = false; 60114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!*bAttribute) 6014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return; 60154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pParentValue || !pParentValue->IsObject()) 60164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 60174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->push_back(pdfium::MakeUnique<CFXJSE_Value>(pIsolate)); 60194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann resultValues->back()->Assign(pParentValue); 60204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 60214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 6023d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CFXJSE_FormCalcContext::ValueToInteger(CFXJSE_Value* pThis, 6024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* pValue) { 60254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pValue) 60264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 60274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 60294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pValue->IsArray()) { 60304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pValue->GetObjectPropertyByIdx(1, propertyValue.get()); 60344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pValue->GetObjectPropertyByIdx(2, jsObjectValue.get()); 60354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 60364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 60374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToInteger(pThis, newPropertyValue.get()); 60384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 60414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newPropertyValue.get()); 60424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToInteger(pThis, newPropertyValue.get()); 60434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pValue->IsObject()) { 60454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(pValue, newPropertyValue.get()); 60474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToInteger(pThis, newPropertyValue.get()); 60484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pValue->IsString()) 60504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FXSYS_atoi(pValue->ToString().c_str()); 60514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pValue->ToInteger(); 60524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 60534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 6055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CFXJSE_FormCalcContext::ValueToFloat(CFXJSE_Value* pThis, 6056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* arg) { 60574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!arg) 60584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0.0f; 60594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 60614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsArray()) { 60624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(1, propertyValue.get()); 60664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); 60674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 60684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 60694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToFloat(pThis, newPropertyValue.get()); 60704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 60724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newPropertyValue.get()); 60734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToFloat(pThis, newPropertyValue.get()); 60744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 60754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsObject()) { 60764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(arg, newPropertyValue.get()); 60784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToFloat(pThis, newPropertyValue.get()); 60794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (arg->IsString()) { 6081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return static_cast<float>( 6082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteStringToDouble(arg->ToString().AsStringView())); 6083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 60844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsUndefined()) 60854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 60864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return arg->ToFloat(); 60884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 60894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 6091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanndouble CFXJSE_FormCalcContext::ValueToDouble(CFXJSE_Value* pThis, 6092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* arg) { 60934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!arg) 60944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 60954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 60964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 60974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsArray()) { 60984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 60994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(1, propertyValue.get()); 61024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann arg->GetObjectPropertyByIdx(2, jsObjectValue.get()); 61034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) { 61044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(jsObjectValue.get(), newPropertyValue.get()); 61054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, newPropertyValue.get()); 61064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 61084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newPropertyValue.get()); 61094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, newPropertyValue.get()); 61104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 61114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsObject()) { 61124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetObjectDefaultValue(arg, newPropertyValue.get()); 61144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, newPropertyValue.get()); 61154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 61164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsString()) 6117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteStringToDouble(arg->ToString().AsStringView()); 61184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (arg->IsUndefined()) 61194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 61204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return arg->ToDouble(); 61214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 61224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static. 6124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanndouble CFXJSE_FormCalcContext::ExtractDouble(CFXJSE_Value* pThis, 6125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Value* src, 6126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool* ret) { 61274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(ret); 61284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *ret = true; 61294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!src) 61314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0; 61324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!src->IsArray()) 61344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, src); 61354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann v8::Isolate* pIsolate = ToJSContext(pThis, nullptr)->GetScriptRuntime(); 61374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto lengthValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src->GetObjectProperty("length", lengthValue.get()); 61394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int32_t iLength = lengthValue->ToInteger(); 61404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iLength <= 2) { 61414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann *ret = false; 61424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return 0.0; 61434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 61444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto propertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto jsObjectValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 61474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src->GetObjectPropertyByIdx(1, propertyValue.get()); 61484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src->GetObjectPropertyByIdx(2, jsObjectValue.get()); 61494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (propertyValue->IsNull()) 61504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, jsObjectValue.get()); 61514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto newPropertyValue = pdfium::MakeUnique<CFXJSE_Value>(pIsolate); 6153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann jsObjectValue->GetObjectProperty(propertyValue->ToString().AsStringView(), 61544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann newPropertyValue.get()); 61554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return ValueToDouble(pThis, newPropertyValue.get()); 61564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 61574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static 6159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CFXJSE_FormCalcContext::ValueToUTF8String(CFXJSE_Value* arg) { 6160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!arg || arg->IsNull() || arg->IsUndefined()) 6161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return ByteString(); 6162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (arg->IsBoolean()) 6163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return arg->ToBoolean() ? "1" : "0"; 6164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return arg->ToString(); 61654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 61664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 61674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// static. 6168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFXJSE_FormCalcContext::Translate(const WideStringView& wsFormcalc, 6169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFX_WideTextBuf* wsJavascript) { 61704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (wsFormcalc.IsEmpty()) { 6171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsJavascript->Clear(); 6172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return true; 61734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 6174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMParser parser(wsFormcalc); 6176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::unique_ptr<CXFA_FMFunctionDefinition> func = parser.Parse(); 6177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!func || parser.HasError()) 6178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 6179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_FMToJavaScriptDepth::Reset(); 6181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann if (!func->ToJavaScript(*wsJavascript)) 6182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return false; 6183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wsJavascript->AppendChar(0); 6185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return !CXFA_IsTooBig(*wsJavascript); 61874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 61884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFXJSE_FormCalcContext::CFXJSE_FormCalcContext(v8::Isolate* pScriptIsolate, 6190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CFXJSE_Context* pScriptContext, 6191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CXFA_Document* pDoc) 6192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann : CFXJSE_HostObject(kFM2JS), 6193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pIsolate(pScriptIsolate), 6194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann m_pFMClass(CFXJSE_Class::Create(pScriptContext, 6195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann &formcalc_fm2js_descriptor, 6196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann false)), 61974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pValue(pdfium::MakeUnique<CFXJSE_Value>(pScriptIsolate)), 61984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDocument(pDoc) { 61994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pValue.get()->SetObject(this, m_pFMClass); 62004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFXJSE_FormCalcContext::~CFXJSE_FormCalcContext() {} 62034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::GlobalPropertyGetter(CFXJSE_Value* pValue) { 62054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pValue->Assign(m_pValue.get()); 62064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowNoDefaultPropertyException( 6209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const ByteStringView& name) const { 6210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // TODO(tsepez): check usage of c_str() below. 6211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ThrowException(L"%.16S doesn't have a default property.", 6212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann name.unterminated_c_str()); 62134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowCompilerErrorException() const { 62164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ThrowException(L"Compiler error."); 62174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowDivideByZeroException() const { 62204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ThrowException(L"Divide by zero."); 62214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowServerDeniedException() const { 62244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ThrowException(L"Server does not permit operation."); 62254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowPropertyNotInObjectException( 6228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& name, 6229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& exp) const { 62304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ThrowException( 6231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"An attempt was made to reference property '%.16s' of a non-object " 6232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann L"in SOM expression %.16s.", 62334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann name.c_str(), exp.c_str()); 62344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowParamCountMismatchException( 6237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& method) const { 6238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ThrowException(L"Incorrect number of parameters calling method '%.16s'.", 62394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann method.c_str()); 62404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowArgumentMismatchException() const { 62434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ThrowException(L"Argument mismatch in property or function argument."); 62444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 62454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFXJSE_FormCalcContext::ThrowException(const wchar_t* str, ...) const { 62474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann va_list arg_ptr; 62484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann va_start(arg_ptr, str); 6249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString wsMessage = WideString::FormatV(str, arg_ptr); 62504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann va_end(arg_ptr); 6251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 6252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(!wsMessage.IsEmpty()); 6253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann FXJSE_ThrowMessage(wsMessage.UTF8Encode().AsStringView()); 62544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6255