OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "fpdfsdk/javascript/util.h" | 7 #include "fpdfsdk/javascript/util.h" |
8 | 8 |
9 #include <time.h> | 9 #include <time.h> |
10 | 10 |
| 11 #include <algorithm> |
11 #include <string> | 12 #include <string> |
12 #include <vector> | 13 #include <vector> |
13 | 14 |
14 #include "core/fxcrt/include/fx_ext.h" | 15 #include "core/fxcrt/include/fx_ext.h" |
15 #include "fpdfsdk/include/javascript/IJavaScript.h" | 16 #include "fpdfsdk/include/javascript/IJavaScript.h" |
16 #include "fpdfsdk/javascript/JS_Context.h" | 17 #include "fpdfsdk/javascript/JS_Context.h" |
17 #include "fpdfsdk/javascript/JS_Define.h" | 18 #include "fpdfsdk/javascript/JS_Define.h" |
18 #include "fpdfsdk/javascript/JS_EventHandler.h" | 19 #include "fpdfsdk/javascript/JS_EventHandler.h" |
19 #include "fpdfsdk/javascript/JS_Object.h" | 20 #include "fpdfsdk/javascript/JS_Object.h" |
20 #include "fpdfsdk/javascript/JS_Runtime.h" | 21 #include "fpdfsdk/javascript/JS_Runtime.h" |
(...skipping 14 matching lines...) Expand all Loading... |
35 BEGIN_JS_STATIC_METHOD(CJS_Util) | 36 BEGIN_JS_STATIC_METHOD(CJS_Util) |
36 JS_STATIC_METHOD_ENTRY(printd) | 37 JS_STATIC_METHOD_ENTRY(printd) |
37 JS_STATIC_METHOD_ENTRY(printf) | 38 JS_STATIC_METHOD_ENTRY(printf) |
38 JS_STATIC_METHOD_ENTRY(printx) | 39 JS_STATIC_METHOD_ENTRY(printx) |
39 JS_STATIC_METHOD_ENTRY(scand) | 40 JS_STATIC_METHOD_ENTRY(scand) |
40 JS_STATIC_METHOD_ENTRY(byteToChar) | 41 JS_STATIC_METHOD_ENTRY(byteToChar) |
41 END_JS_STATIC_METHOD() | 42 END_JS_STATIC_METHOD() |
42 | 43 |
43 IMPLEMENT_JS_CLASS(CJS_Util, util) | 44 IMPLEMENT_JS_CLASS(CJS_Util, util) |
44 | 45 |
45 util::util(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} | |
46 | |
47 util::~util() {} | |
48 | |
49 struct stru_TbConvert { | |
50 const FX_WCHAR* lpszJSMark; | |
51 const FX_WCHAR* lpszCppMark; | |
52 }; | |
53 | |
54 const stru_TbConvert fcTable[] = { | |
55 {L"mmmm", L"%B"}, | |
56 {L"mmm", L"%b"}, | |
57 {L"mm", L"%m"}, | |
58 // "m" | |
59 {L"dddd", L"%A"}, | |
60 {L"ddd", L"%a"}, | |
61 {L"dd", L"%d"}, | |
62 // "d", "%w", | |
63 {L"yyyy", L"%Y"}, | |
64 {L"yy", L"%y"}, | |
65 {L"HH", L"%H"}, | |
66 // "H" | |
67 {L"hh", L"%I"}, | |
68 // "h" | |
69 {L"MM", L"%M"}, | |
70 // "M" | |
71 {L"ss", L"%S"}, | |
72 // "s | |
73 {L"TT", L"%p"}, | |
74 // "t" | |
75 #if defined(_WIN32) | |
76 {L"tt", L"%p"}, | |
77 {L"h", L"%#I"}, | |
78 #else | |
79 {L"tt", L"%P"}, | |
80 {L"h", L"%l"}, | |
81 #endif | |
82 }; | |
83 | |
84 #define UTIL_INT 0 | 46 #define UTIL_INT 0 |
85 #define UTIL_DOUBLE 1 | 47 #define UTIL_DOUBLE 1 |
86 #define UTIL_STRING 2 | 48 #define UTIL_STRING 2 |
87 | 49 |
88 int util::ParstDataType(std::wstring* sFormat) { | 50 namespace { |
| 51 |
| 52 // Map PDF-style directives to equivalent wcsftime directives. Not |
| 53 // all have direct equivalents, though. |
| 54 struct TbConvert { |
| 55 const FX_WCHAR* lpszJSMark; |
| 56 const FX_WCHAR* lpszCppMark; |
| 57 }; |
| 58 |
| 59 // Map PDF-style directives lacking direct wcsftime directives to |
| 60 // the value with which they will be replaced. |
| 61 struct TbConvertAdditional { |
| 62 const FX_WCHAR* lpszJSMark; |
| 63 int iValue; |
| 64 }; |
| 65 |
| 66 const TbConvert TbConvertTable[] = { |
| 67 {L"mmmm", L"%B"}, {L"mmm", L"%b"}, {L"mm", L"%m"}, {L"dddd", L"%A"}, |
| 68 {L"ddd", L"%a"}, {L"dd", L"%d"}, {L"yyyy", L"%Y"}, {L"yy", L"%y"}, |
| 69 {L"HH", L"%H"}, {L"hh", L"%I"}, {L"MM", L"%M"}, {L"ss", L"%S"}, |
| 70 {L"TT", L"%p"}, |
| 71 #if defined(_WIN32) |
| 72 {L"tt", L"%p"}, {L"h", L"%#I"}, |
| 73 #else |
| 74 {L"tt", L"%P"}, {L"h", L"%l"}, |
| 75 #endif |
| 76 }; |
| 77 |
| 78 int ParseDataType(std::wstring* sFormat) { |
89 bool bPercent = FALSE; | 79 bool bPercent = FALSE; |
90 for (size_t i = 0; i < sFormat->length(); ++i) { | 80 for (size_t i = 0; i < sFormat->length(); ++i) { |
91 wchar_t c = (*sFormat)[i]; | 81 wchar_t c = (*sFormat)[i]; |
92 if (c == L'%') { | 82 if (c == L'%') { |
93 bPercent = true; | 83 bPercent = true; |
94 continue; | 84 continue; |
95 } | 85 } |
96 | 86 |
97 if (bPercent) { | 87 if (bPercent) { |
98 if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || | 88 if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || |
(...skipping 13 matching lines...) Expand all Loading... |
112 FXSYS_iswdigit(c)) { | 102 FXSYS_iswdigit(c)) { |
113 continue; | 103 continue; |
114 } | 104 } |
115 break; | 105 break; |
116 } | 106 } |
117 } | 107 } |
118 | 108 |
119 return -1; | 109 return -1; |
120 } | 110 } |
121 | 111 |
| 112 } // namespace |
| 113 |
| 114 util::util(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {} |
| 115 |
| 116 util::~util() {} |
| 117 |
122 FX_BOOL util::printf(IJS_Context* cc, | 118 FX_BOOL util::printf(IJS_Context* cc, |
123 const std::vector<CJS_Value>& params, | 119 const std::vector<CJS_Value>& params, |
124 CJS_Value& vRet, | 120 CJS_Value& vRet, |
125 CFX_WideString& sError) { | 121 CFX_WideString& sError) { |
126 int iSize = params.size(); | 122 int iSize = params.size(); |
127 if (iSize < 1) | 123 if (iSize < 1) |
128 return FALSE; | 124 return FALSE; |
129 std::wstring c_ConvChar(params[0].ToCFXWideString().c_str()); | 125 std::wstring c_ConvChar(params[0].ToCFXWideString().c_str()); |
130 std::vector<std::wstring> c_strConvers; | 126 std::vector<std::wstring> c_strConvers; |
131 int iOffset = 0; | 127 int iOffset = 0; |
132 int iOffend = 0; | 128 int iOffend = 0; |
133 c_ConvChar.insert(c_ConvChar.begin(), L'S'); | 129 c_ConvChar.insert(c_ConvChar.begin(), L'S'); |
134 while (iOffset != -1) { | 130 while (iOffset != -1) { |
135 iOffend = c_ConvChar.find(L"%", iOffset + 1); | 131 iOffend = c_ConvChar.find(L"%", iOffset + 1); |
136 std::wstring strSub; | 132 std::wstring strSub; |
137 if (iOffend == -1) | 133 if (iOffend == -1) |
138 strSub = c_ConvChar.substr(iOffset); | 134 strSub = c_ConvChar.substr(iOffset); |
139 else | 135 else |
140 strSub = c_ConvChar.substr(iOffset, iOffend - iOffset); | 136 strSub = c_ConvChar.substr(iOffset, iOffend - iOffset); |
141 c_strConvers.push_back(strSub); | 137 c_strConvers.push_back(strSub); |
142 iOffset = iOffend; | 138 iOffset = iOffend; |
143 } | 139 } |
144 | 140 |
145 std::wstring c_strResult; | 141 std::wstring c_strResult; |
146 | |
147 // for(int iIndex = 1;iIndex < params.size();iIndex++) | |
148 std::wstring c_strFormat; | 142 std::wstring c_strFormat; |
149 for (int iIndex = 0; iIndex < (int)c_strConvers.size(); iIndex++) { | 143 for (int iIndex = 0; iIndex < (int)c_strConvers.size(); iIndex++) { |
150 c_strFormat = c_strConvers[iIndex]; | 144 c_strFormat = c_strConvers[iIndex]; |
151 if (iIndex == 0) { | 145 if (iIndex == 0) { |
152 c_strResult = c_strFormat; | 146 c_strResult = c_strFormat; |
153 continue; | 147 continue; |
154 } | 148 } |
155 | 149 |
156 CFX_WideString strSegment; | 150 CFX_WideString strSegment; |
157 if (iIndex >= iSize) { | 151 if (iIndex >= iSize) { |
158 c_strResult += c_strFormat; | 152 c_strResult += c_strFormat; |
159 continue; | 153 continue; |
160 } | 154 } |
161 | 155 |
162 switch (ParstDataType(&c_strFormat)) { | 156 switch (ParseDataType(&c_strFormat)) { |
163 case UTIL_INT: | 157 case UTIL_INT: |
164 strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt()); | 158 strSegment.Format(c_strFormat.c_str(), params[iIndex].ToInt()); |
165 break; | 159 break; |
166 case UTIL_DOUBLE: | 160 case UTIL_DOUBLE: |
167 strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble()); | 161 strSegment.Format(c_strFormat.c_str(), params[iIndex].ToDouble()); |
168 break; | 162 break; |
169 case UTIL_STRING: | 163 case UTIL_STRING: |
170 strSegment.Format(c_strFormat.c_str(), | 164 strSegment.Format(c_strFormat.c_str(), |
171 params[iIndex].ToCFXWideString().c_str()); | 165 params[iIndex].ToCFXWideString().c_str()); |
172 break; | 166 break; |
(...skipping 11 matching lines...) Expand all Loading... |
184 | 178 |
185 FX_BOOL util::printd(IJS_Context* cc, | 179 FX_BOOL util::printd(IJS_Context* cc, |
186 const std::vector<CJS_Value>& params, | 180 const std::vector<CJS_Value>& params, |
187 CJS_Value& vRet, | 181 CJS_Value& vRet, |
188 CFX_WideString& sError) { | 182 CFX_WideString& sError) { |
189 int iSize = params.size(); | 183 int iSize = params.size(); |
190 if (iSize < 2) | 184 if (iSize < 2) |
191 return FALSE; | 185 return FALSE; |
192 | 186 |
193 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); | 187 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); |
194 CJS_Value p1(pRuntime); | 188 CJS_Value p1 = params[0]; |
195 p1 = params[0]; | |
196 | |
197 CJS_Value p2 = params[1]; | 189 CJS_Value p2 = params[1]; |
198 CJS_Date jsDate(pRuntime); | 190 CJS_Date jsDate(pRuntime); |
199 if (!p2.ConvertToDate(jsDate)) { | 191 if (!p2.ConvertToDate(jsDate)) { |
200 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1); | 192 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1); |
201 return FALSE; | 193 return FALSE; |
202 } | 194 } |
203 | 195 |
204 if (!jsDate.IsValidDate()) { | 196 if (!jsDate.IsValidDate()) { |
205 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2); | 197 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2); |
206 return FALSE; | 198 return FALSE; |
207 } | 199 } |
208 | 200 |
209 if (p1.GetType() == CJS_Value::VT_number) { | 201 if (p1.GetType() == CJS_Value::VT_number) { |
210 int nFormat = p1.ToInt(); | |
211 CFX_WideString swResult; | 202 CFX_WideString swResult; |
212 | 203 switch (p1.ToInt()) { |
213 switch (nFormat) { | |
214 case 0: | 204 case 0: |
215 swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", jsDate.GetYear(), | 205 swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", jsDate.GetYear(), |
216 jsDate.GetMonth() + 1, jsDate.GetDay(), | 206 jsDate.GetMonth() + 1, jsDate.GetDay(), |
217 jsDate.GetHours(), jsDate.GetMinutes(), | 207 jsDate.GetHours(), jsDate.GetMinutes(), |
218 jsDate.GetSeconds()); | 208 jsDate.GetSeconds()); |
219 break; | 209 break; |
220 case 1: | 210 case 1: |
221 swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", jsDate.GetYear(), | 211 swResult.Format(L"%04d.%02d.%02d %02d:%02d:%02d", jsDate.GetYear(), |
222 jsDate.GetMonth() + 1, jsDate.GetDay(), | 212 jsDate.GetMonth() + 1, jsDate.GetDay(), |
223 jsDate.GetHours(), jsDate.GetMinutes(), | 213 jsDate.GetHours(), jsDate.GetMinutes(), |
224 jsDate.GetSeconds()); | 214 jsDate.GetSeconds()); |
225 break; | 215 break; |
226 case 2: | 216 case 2: |
227 swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", jsDate.GetYear(), | 217 swResult.Format(L"%04d/%02d/%02d %02d:%02d:%02d", jsDate.GetYear(), |
228 jsDate.GetMonth() + 1, jsDate.GetDay(), | 218 jsDate.GetMonth() + 1, jsDate.GetDay(), |
229 jsDate.GetHours(), jsDate.GetMinutes(), | 219 jsDate.GetHours(), jsDate.GetMinutes(), |
230 jsDate.GetSeconds()); | 220 jsDate.GetSeconds()); |
231 break; | 221 break; |
232 default: | 222 default: |
| 223 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSVALUEERROR); |
233 return FALSE; | 224 return FALSE; |
234 } | 225 } |
235 | 226 |
236 vRet = swResult.c_str(); | 227 vRet = swResult.c_str(); |
237 return TRUE; | 228 return TRUE; |
238 } | 229 } |
| 230 |
239 if (p1.GetType() == CJS_Value::VT_string) { | 231 if (p1.GetType() == CJS_Value::VT_string) { |
240 std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str(); | 232 if (iSize > 2 && params[2].ToBool()) { |
241 | 233 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_NOTSUPPORT); |
242 bool bXFAPicture = false; | |
243 if (iSize > 2) { | |
244 bXFAPicture = params[2].ToBool(); | |
245 } | |
246 | |
247 if (bXFAPicture) { | |
248 return FALSE; // currently, it doesn't support XFAPicture. | 234 return FALSE; // currently, it doesn't support XFAPicture. |
249 } | 235 } |
250 | 236 |
251 for (size_t i = 0; i < sizeof(fcTable) / sizeof(stru_TbConvert); ++i) { | 237 // Convert PDF-style format specifiers to wcsftime specifiers. Remove any |
| 238 // pre-existing %-directives before inserting our own. |
| 239 std::basic_string<wchar_t> cFormat = p1.ToCFXWideString().c_str(); |
| 240 cFormat.erase(std::remove(cFormat.begin(), cFormat.end(), '%'), |
| 241 cFormat.end()); |
| 242 |
| 243 for (size_t i = 0; i < FX_ArraySize(TbConvertTable); ++i) { |
252 int iStart = 0; | 244 int iStart = 0; |
253 int iEnd; | 245 int iEnd; |
254 while ((iEnd = cFormat.find(fcTable[i].lpszJSMark, iStart)) != -1) { | 246 while ((iEnd = cFormat.find(TbConvertTable[i].lpszJSMark, iStart)) != |
255 cFormat.replace(iEnd, FXSYS_wcslen(fcTable[i].lpszJSMark), | 247 -1) { |
256 fcTable[i].lpszCppMark); | 248 cFormat.replace(iEnd, FXSYS_wcslen(TbConvertTable[i].lpszJSMark), |
| 249 TbConvertTable[i].lpszCppMark); |
257 iStart = iEnd; | 250 iStart = iEnd; |
258 } | 251 } |
259 } | 252 } |
260 | 253 |
261 int iYear, iMonth, iDay, iHour, iMin, iSec; | 254 int iYear = jsDate.GetYear(); |
262 iYear = jsDate.GetYear(); | 255 int iMonth = jsDate.GetMonth(); |
263 iMonth = jsDate.GetMonth(); | 256 int iDay = jsDate.GetDay(); |
264 iDay = jsDate.GetDay(); | 257 int iHour = jsDate.GetHours(); |
265 iHour = jsDate.GetHours(); | 258 int iMin = jsDate.GetMinutes(); |
266 iMin = jsDate.GetMinutes(); | 259 int iSec = jsDate.GetSeconds(); |
267 iSec = jsDate.GetSeconds(); | |
268 | 260 |
269 struct tm time = {}; | 261 TbConvertAdditional cTableAd[] = { |
270 time.tm_year = iYear - 1900; | |
271 time.tm_mon = iMonth; | |
272 time.tm_mday = iDay; | |
273 time.tm_hour = iHour; | |
274 time.tm_min = iMin; | |
275 time.tm_sec = iSec; | |
276 | |
277 struct stru_TbConvertAd { | |
278 const FX_WCHAR* lpszJSMark; | |
279 int iValue; | |
280 }; | |
281 | |
282 stru_TbConvertAd cTableAd[] = { | |
283 {L"m", iMonth + 1}, {L"d", iDay}, | 262 {L"m", iMonth + 1}, {L"d", iDay}, |
284 {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, | 263 {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, |
285 {L"M", iMin}, {L"s", iSec}, | 264 {L"M", iMin}, {L"s", iSec}, |
286 }; | 265 }; |
287 | 266 |
288 for (size_t i = 0; i < sizeof(cTableAd) / sizeof(stru_TbConvertAd); ++i) { | 267 for (size_t i = 0; i < FX_ArraySize(cTableAd); ++i) { |
289 wchar_t tszValue[10]; | 268 wchar_t tszValue[16]; |
290 CFX_WideString sValue; | 269 CFX_WideString sValue; |
291 sValue.Format(L"%d", cTableAd[i].iValue); | 270 sValue.Format(L"%d", cTableAd[i].iValue); |
292 memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), | 271 memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), |
293 (sValue.GetLength() + 1) * sizeof(wchar_t)); | 272 (sValue.GetLength() + 1) * sizeof(wchar_t)); |
294 | 273 |
295 int iStart = 0; | 274 int iStart = 0; |
296 int iEnd; | 275 int iEnd; |
297 while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { | 276 while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { |
298 if (iEnd > 0) { | 277 if (iEnd > 0) { |
299 if (cFormat[iEnd - 1] == L'%') { | 278 if (cFormat[iEnd - 1] == L'%') { |
300 iStart = iEnd + 1; | 279 iStart = iEnd + 1; |
301 continue; | 280 continue; |
302 } | 281 } |
303 } | 282 } |
304 cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); | 283 cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); |
305 iStart = iEnd; | 284 iStart = iEnd; |
306 } | 285 } |
307 } | 286 } |
308 | 287 |
309 CFX_WideString strFormat; | 288 struct tm time = {}; |
| 289 time.tm_year = iYear - 1900; |
| 290 time.tm_mon = iMonth; |
| 291 time.tm_mday = iDay; |
| 292 time.tm_hour = iHour; |
| 293 time.tm_min = iMin; |
| 294 time.tm_sec = iSec; |
| 295 |
310 wchar_t buf[64] = {}; | 296 wchar_t buf[64] = {}; |
311 strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); | 297 wcsftime(buf, 64, cFormat.c_str(), &time); |
312 cFormat = buf; | 298 cFormat = buf; |
313 vRet = cFormat.c_str(); | 299 vRet = cFormat.c_str(); |
314 return TRUE; | 300 return TRUE; |
315 } | 301 } |
| 302 |
| 303 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSTYPEERROR); |
316 return FALSE; | 304 return FALSE; |
317 } | 305 } |
318 | 306 |
319 void util::printd(const std::wstring& cFormat2, | |
320 CJS_Date jsDate, | |
321 bool bXFAPicture, | |
322 std::wstring& cPurpose) { | |
323 std::wstring cFormat = cFormat2; | |
324 | |
325 if (bXFAPicture) { | |
326 return; // currently, it doesn't support XFAPicture. | |
327 } | |
328 | |
329 for (size_t i = 0; i < sizeof(fcTable) / sizeof(stru_TbConvert); ++i) { | |
330 int iStart = 0; | |
331 int iEnd; | |
332 while ((iEnd = cFormat.find(fcTable[i].lpszJSMark, iStart)) != -1) { | |
333 cFormat.replace(iEnd, FXSYS_wcslen(fcTable[i].lpszJSMark), | |
334 fcTable[i].lpszCppMark); | |
335 iStart = iEnd; | |
336 } | |
337 } | |
338 | |
339 int iYear, iMonth, iDay, iHour, iMin, iSec; | |
340 iYear = jsDate.GetYear(); | |
341 iMonth = jsDate.GetMonth(); | |
342 iDay = jsDate.GetDay(); | |
343 iHour = jsDate.GetHours(); | |
344 iMin = jsDate.GetMinutes(); | |
345 iSec = jsDate.GetSeconds(); | |
346 | |
347 struct tm time = {}; | |
348 time.tm_year = iYear - 1900; | |
349 time.tm_mon = iMonth; | |
350 time.tm_mday = iDay; | |
351 time.tm_hour = iHour; | |
352 time.tm_min = iMin; | |
353 time.tm_sec = iSec; | |
354 // COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec); | |
355 // CString strFormat = cppTm.Format(cFormat.c_str()); | |
356 | |
357 struct stru_TbConvertAd { | |
358 const FX_WCHAR* lpszJSMark; | |
359 int iValue; | |
360 }; | |
361 | |
362 stru_TbConvertAd cTableAd[] = { | |
363 {L"m", iMonth + 1}, {L"d", iDay}, | |
364 {L"H", iHour}, {L"h", iHour > 12 ? iHour - 12 : iHour}, | |
365 {L"M", iMin}, {L"s", iSec}, | |
366 }; | |
367 | |
368 // cFormat = strFormat.GetBuffer(strFormat.GetLength()+1); | |
369 for (size_t i = 0; i < sizeof(cTableAd) / sizeof(stru_TbConvertAd); ++i) { | |
370 wchar_t tszValue[10]; | |
371 CFX_WideString sValue; | |
372 sValue.Format(L"%d", cTableAd[i].iValue); | |
373 memcpy(tszValue, (wchar_t*)sValue.GetBuffer(sValue.GetLength() + 1), | |
374 sValue.GetLength() * sizeof(wchar_t)); | |
375 | |
376 int iStart = 0; | |
377 int iEnd; | |
378 while ((iEnd = cFormat.find(cTableAd[i].lpszJSMark, iStart)) != -1) { | |
379 if (iEnd > 0) { | |
380 if (cFormat[iEnd - 1] == L'%') { | |
381 iStart = iEnd + 1; | |
382 continue; | |
383 } | |
384 } | |
385 cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[i].lpszJSMark), tszValue); | |
386 iStart = iEnd; | |
387 } | |
388 } | |
389 | |
390 CFX_WideString strFormat; | |
391 wchar_t buf[64] = {}; | |
392 strFormat = wcsftime(buf, 64, cFormat.c_str(), &time); | |
393 cFormat = buf; | |
394 cPurpose = cFormat; | |
395 } | |
396 | 307 |
397 FX_BOOL util::printx(IJS_Context* cc, | 308 FX_BOOL util::printx(IJS_Context* cc, |
398 const std::vector<CJS_Value>& params, | 309 const std::vector<CJS_Value>& params, |
399 CJS_Value& vRet, | 310 CJS_Value& vRet, |
400 CFX_WideString& sError) { | 311 CFX_WideString& sError) { |
401 int iSize = params.size(); | 312 int iSize = params.size(); |
402 if (iSize < 2) | 313 if (iSize < 2) |
403 return FALSE; | 314 return FALSE; |
404 CFX_WideString sFormat = params[0].ToCFXWideString(); | 315 CFX_WideString sFormat = params[0].ToCFXWideString(); |
405 CFX_WideString sSource = params[1].ToCFXWideString(); | 316 CFX_WideString sSource = params[1].ToCFXWideString(); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 int iSize = params.size(); | 432 int iSize = params.size(); |
522 if (iSize == 0) | 433 if (iSize == 0) |
523 return FALSE; | 434 return FALSE; |
524 int nByte = params[0].ToInt(); | 435 int nByte = params[0].ToInt(); |
525 unsigned char cByte = (unsigned char)nByte; | 436 unsigned char cByte = (unsigned char)nByte; |
526 CFX_WideString csValue; | 437 CFX_WideString csValue; |
527 csValue.Format(L"%c", cByte); | 438 csValue.Format(L"%c", cByte); |
528 vRet = csValue.c_str(); | 439 vRet = csValue.c_str(); |
529 return TRUE; | 440 return TRUE; |
530 } | 441 } |
OLD | NEW |