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(&currentTime);
11114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  struct tm* pTmStruct = gmtime(&currentTime);
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, &parameterValues, 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