| 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 "xfa/fxfa/parser/xfa_localevalue.h" | 7 #include "xfa/fxfa/parser/xfa_localevalue.h" |
| 8 | 8 |
| 9 #include "core/fxcrt/fx_ext.h" | 9 #include "core/fxcrt/fx_ext.h" |
| 10 #include "xfa/fgas/localization/fgas_localeimp.h" | 10 #include "xfa/fgas/localization/fgas_localeimp.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 0.000000001, | 24 0.000000001, |
| 25 0.0000000001, | 25 0.0000000001, |
| 26 0.00000000001, | 26 0.00000000001, |
| 27 0.000000000001, | 27 0.000000000001, |
| 28 0.0000000000001, | 28 0.0000000000001, |
| 29 0.00000000000001, | 29 0.00000000000001, |
| 30 0.000000000000001, | 30 0.000000000000001, |
| 31 0.0000000000000001}; | 31 0.0000000000000001}; |
| 32 CXFA_LocaleValue::CXFA_LocaleValue() { | 32 CXFA_LocaleValue::CXFA_LocaleValue() { |
| 33 m_dwType = XFA_VT_NULL; | 33 m_dwType = XFA_VT_NULL; |
| 34 m_bValid = TRUE; | 34 m_bValid = true; |
| 35 m_pLocaleMgr = nullptr; | 35 m_pLocaleMgr = nullptr; |
| 36 } | 36 } |
| 37 CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) { | 37 CXFA_LocaleValue::CXFA_LocaleValue(const CXFA_LocaleValue& value) { |
| 38 m_dwType = XFA_VT_NULL; | 38 m_dwType = XFA_VT_NULL; |
| 39 m_bValid = TRUE; | 39 m_bValid = true; |
| 40 m_pLocaleMgr = nullptr; | 40 m_pLocaleMgr = nullptr; |
| 41 *this = value; | 41 *this = value; |
| 42 } | 42 } |
| 43 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, | 43 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, |
| 44 CXFA_LocaleMgr* pLocaleMgr) { | 44 CXFA_LocaleMgr* pLocaleMgr) { |
| 45 m_dwType = dwType; | 45 m_dwType = dwType; |
| 46 m_bValid = (m_dwType != XFA_VT_NULL); | 46 m_bValid = (m_dwType != XFA_VT_NULL); |
| 47 m_pLocaleMgr = pLocaleMgr; | 47 m_pLocaleMgr = pLocaleMgr; |
| 48 } | 48 } |
| 49 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, | 49 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, |
| 50 const CFX_WideString& wsValue, | 50 const CFX_WideString& wsValue, |
| 51 CXFA_LocaleMgr* pLocaleMgr) { | 51 CXFA_LocaleMgr* pLocaleMgr) { |
| 52 m_wsValue = wsValue; | 52 m_wsValue = wsValue; |
| 53 m_dwType = dwType; | 53 m_dwType = dwType; |
| 54 m_pLocaleMgr = pLocaleMgr; | 54 m_pLocaleMgr = pLocaleMgr; |
| 55 m_bValid = ValidateCanonicalValue(wsValue, dwType); | 55 m_bValid = ValidateCanonicalValue(wsValue, dwType); |
| 56 } | 56 } |
| 57 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, | 57 CXFA_LocaleValue::CXFA_LocaleValue(uint32_t dwType, |
| 58 const CFX_WideString& wsValue, | 58 const CFX_WideString& wsValue, |
| 59 const CFX_WideString& wsFormat, | 59 const CFX_WideString& wsFormat, |
| 60 IFX_Locale* pLocale, | 60 IFX_Locale* pLocale, |
| 61 CXFA_LocaleMgr* pLocaleMgr) { | 61 CXFA_LocaleMgr* pLocaleMgr) { |
| 62 m_pLocaleMgr = pLocaleMgr; | 62 m_pLocaleMgr = pLocaleMgr; |
| 63 m_bValid = TRUE; | 63 m_bValid = true; |
| 64 m_dwType = dwType; | 64 m_dwType = dwType; |
| 65 m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale); | 65 m_bValid = ParsePatternValue(wsValue, wsFormat, pLocale); |
| 66 } | 66 } |
| 67 CXFA_LocaleValue& CXFA_LocaleValue::operator=(const CXFA_LocaleValue& value) { | 67 CXFA_LocaleValue& CXFA_LocaleValue::operator=(const CXFA_LocaleValue& value) { |
| 68 m_wsValue = value.m_wsValue; | 68 m_wsValue = value.m_wsValue; |
| 69 m_dwType = value.m_dwType; | 69 m_dwType = value.m_dwType; |
| 70 m_bValid = value.m_bValid; | 70 m_bValid = value.m_bValid; |
| 71 m_pLocaleMgr = value.m_pLocaleMgr; | 71 m_pLocaleMgr = value.m_pLocaleMgr; |
| 72 return *this; | 72 return *this; |
| 73 } | 73 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 86 case XFA_VT_DATE: | 86 case XFA_VT_DATE: |
| 87 return FX_LOCALECATEGORY_Date; | 87 return FX_LOCALECATEGORY_Date; |
| 88 case XFA_VT_TIME: | 88 case XFA_VT_TIME: |
| 89 return FX_LOCALECATEGORY_Time; | 89 return FX_LOCALECATEGORY_Time; |
| 90 case XFA_VT_DATETIME: | 90 case XFA_VT_DATETIME: |
| 91 return FX_LOCALECATEGORY_DateTime; | 91 return FX_LOCALECATEGORY_DateTime; |
| 92 } | 92 } |
| 93 } | 93 } |
| 94 return eCategory; | 94 return eCategory; |
| 95 } | 95 } |
| 96 FX_BOOL CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue, | 96 bool CXFA_LocaleValue::ValidateValue(const CFX_WideString& wsValue, |
| 97 const CFX_WideString& wsPattern, | 97 const CFX_WideString& wsPattern, |
| 98 IFX_Locale* pLocale, | 98 IFX_Locale* pLocale, |
| 99 CFX_WideString* pMatchFormat) { | 99 CFX_WideString* pMatchFormat) { |
| 100 CFX_WideString wsOutput; | 100 CFX_WideString wsOutput; |
| 101 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); | 101 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); |
| 102 if (pLocale) { | 102 if (pLocale) { |
| 103 m_pLocaleMgr->SetDefLocale(pLocale); | 103 m_pLocaleMgr->SetDefLocale(pLocale); |
| 104 } | 104 } |
| 105 CFX_FormatString* pFormat = nullptr; | 105 CFX_FormatString* pFormat = nullptr; |
| 106 if (m_pLocaleMgr) | 106 if (m_pLocaleMgr) |
| 107 pFormat = new CFX_FormatString(m_pLocaleMgr, FALSE); | 107 pFormat = new CFX_FormatString(m_pLocaleMgr, false); |
| 108 | 108 |
| 109 CFX_WideStringArray wsPatterns; | 109 CFX_WideStringArray wsPatterns; |
| 110 pFormat->SplitFormatString(wsPattern, wsPatterns); | 110 pFormat->SplitFormatString(wsPattern, wsPatterns); |
| 111 FX_BOOL bRet = FALSE; | 111 bool bRet = false; |
| 112 int32_t iCount = wsPatterns.GetSize(); | 112 int32_t iCount = wsPatterns.GetSize(); |
| 113 int32_t i = 0; | 113 int32_t i = 0; |
| 114 for (; i < iCount && !bRet; i++) { | 114 for (; i < iCount && !bRet; i++) { |
| 115 CFX_WideString wsFormat = wsPatterns[i]; | 115 CFX_WideString wsFormat = wsPatterns[i]; |
| 116 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); | 116 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); |
| 117 eCategory = XFA_ValugeCategory(eCategory, m_dwType); | 117 eCategory = XFA_ValugeCategory(eCategory, m_dwType); |
| 118 switch (eCategory) { | 118 switch (eCategory) { |
| 119 case FX_LOCALECATEGORY_Null: | 119 case FX_LOCALECATEGORY_Null: |
| 120 bRet = pFormat->ParseNull(wsValue, wsFormat); | 120 bRet = pFormat->ParseNull(wsValue, wsFormat); |
| 121 if (!bRet) { | 121 if (!bRet) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 CFX_Unitime dt; | 170 CFX_Unitime dt; |
| 171 bRet = pFormat->ParseDateTime(wsValue, wsFormat, | 171 bRet = pFormat->ParseDateTime(wsValue, wsFormat, |
| 172 FX_DATETIMETYPE_DateTime, dt); | 172 FX_DATETIMETYPE_DateTime, dt); |
| 173 if (!bRet) { | 173 if (!bRet) { |
| 174 bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput, | 174 bRet = pFormat->FormatDateTime(wsValue, wsFormat, wsOutput, |
| 175 FX_DATETIMETYPE_DateTime); | 175 FX_DATETIMETYPE_DateTime); |
| 176 } | 176 } |
| 177 break; | 177 break; |
| 178 } | 178 } |
| 179 default: | 179 default: |
| 180 bRet = FALSE; | 180 bRet = false; |
| 181 break; | 181 break; |
| 182 } | 182 } |
| 183 } | 183 } |
| 184 if (bRet && pMatchFormat) { | 184 if (bRet && pMatchFormat) { |
| 185 *pMatchFormat = wsPatterns[i - 1]; | 185 *pMatchFormat = wsPatterns[i - 1]; |
| 186 } | 186 } |
| 187 pFormat->Release(); | 187 pFormat->Release(); |
| 188 if (pLocale) { | 188 if (pLocale) { |
| 189 m_pLocaleMgr->SetDefLocale(locale); | 189 m_pLocaleMgr->SetDefLocale(locale); |
| 190 } | 190 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 207 } | 207 } |
| 208 return CFX_WideString(); | 208 return CFX_WideString(); |
| 209 } | 209 } |
| 210 FX_FLOAT CXFA_LocaleValue::GetNum() const { | 210 FX_FLOAT CXFA_LocaleValue::GetNum() const { |
| 211 if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || | 211 if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || |
| 212 m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { | 212 m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { |
| 213 int64_t nIntegral = 0; | 213 int64_t nIntegral = 0; |
| 214 uint32_t dwFractional = 0; | 214 uint32_t dwFractional = 0; |
| 215 int32_t nExponent = 0; | 215 int32_t nExponent = 0; |
| 216 int cc = 0; | 216 int cc = 0; |
| 217 FX_BOOL bNegative = FALSE, bExpSign = FALSE; | 217 bool bNegative = false, bExpSign = false; |
| 218 const FX_WCHAR* str = m_wsValue.c_str(); | 218 const FX_WCHAR* str = m_wsValue.c_str(); |
| 219 int len = m_wsValue.GetLength(); | 219 int len = m_wsValue.GetLength(); |
| 220 while (FXSYS_iswspace(str[cc]) && cc < len) { | 220 while (FXSYS_iswspace(str[cc]) && cc < len) { |
| 221 cc++; | 221 cc++; |
| 222 } | 222 } |
| 223 if (cc >= len) { | 223 if (cc >= len) { |
| 224 return 0; | 224 return 0; |
| 225 } | 225 } |
| 226 if (str[0] == '+') { | 226 if (str[0] == '+') { |
| 227 cc++; | 227 cc++; |
| 228 } else if (str[0] == '-') { | 228 } else if (str[0] == '-') { |
| 229 bNegative = TRUE; | 229 bNegative = true; |
| 230 cc++; | 230 cc++; |
| 231 } | 231 } |
| 232 int nIntegralLen = 0; | 232 int nIntegralLen = 0; |
| 233 while (cc < len) { | 233 while (cc < len) { |
| 234 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) || | 234 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) || |
| 235 nIntegralLen > 17) { | 235 nIntegralLen > 17) { |
| 236 break; | 236 break; |
| 237 } | 237 } |
| 238 nIntegral = nIntegral * 10 + str[cc] - '0'; | 238 nIntegral = nIntegral * 10 + str[cc] - '0'; |
| 239 cc++; | 239 cc++; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 254 } | 254 } |
| 255 } | 255 } |
| 256 dwFractional = (uint32_t)(fraction * 4294967296.0); | 256 dwFractional = (uint32_t)(fraction * 4294967296.0); |
| 257 } | 257 } |
| 258 if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { | 258 if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { |
| 259 cc++; | 259 cc++; |
| 260 if (cc < len) { | 260 if (cc < len) { |
| 261 if (str[cc] == '+') { | 261 if (str[cc] == '+') { |
| 262 cc++; | 262 cc++; |
| 263 } else if (str[cc] == '-') { | 263 } else if (str[cc] == '-') { |
| 264 bExpSign = TRUE; | 264 bExpSign = true; |
| 265 cc++; | 265 cc++; |
| 266 } | 266 } |
| 267 } | 267 } |
| 268 while (cc < len) { | 268 while (cc < len) { |
| 269 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) { | 269 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) { |
| 270 break; | 270 break; |
| 271 } | 271 } |
| 272 nExponent = nExponent * 10 + str[cc] - '0'; | 272 nExponent = nExponent * 10 + str[cc] - '0'; |
| 273 cc++; | 273 cc++; |
| 274 } | 274 } |
| 275 nExponent = bExpSign ? -nExponent : nExponent; | 275 nExponent = bExpSign ? -nExponent : nExponent; |
| 276 } | 276 } |
| 277 FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0); | 277 FX_FLOAT fValue = (FX_FLOAT)(dwFractional / 4294967296.0); |
| 278 fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue); | 278 fValue = nIntegral + (nIntegral >= 0 ? fValue : -fValue); |
| 279 if (nExponent != 0) { | 279 if (nExponent != 0) { |
| 280 fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent); | 280 fValue *= FXSYS_pow(10, (FX_FLOAT)nExponent); |
| 281 } | 281 } |
| 282 return fValue; | 282 return fValue; |
| 283 } | 283 } |
| 284 return 0; | 284 return 0; |
| 285 } | 285 } |
| 286 FX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const { | 286 FX_DOUBLE CXFA_LocaleValue::GetDoubleNum() const { |
| 287 if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || | 287 if (m_bValid && (m_dwType == XFA_VT_BOOLEAN || m_dwType == XFA_VT_INTEGER || |
| 288 m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { | 288 m_dwType == XFA_VT_DECIMAL || m_dwType == XFA_VT_FLOAT)) { |
| 289 int64_t nIntegral = 0; | 289 int64_t nIntegral = 0; |
| 290 uint32_t dwFractional = 0; | 290 uint32_t dwFractional = 0; |
| 291 int32_t nExponent = 0; | 291 int32_t nExponent = 0; |
| 292 int32_t cc = 0; | 292 int32_t cc = 0; |
| 293 FX_BOOL bNegative = FALSE, bExpSign = FALSE; | 293 bool bNegative = false, bExpSign = false; |
| 294 const FX_WCHAR* str = m_wsValue.c_str(); | 294 const FX_WCHAR* str = m_wsValue.c_str(); |
| 295 int len = m_wsValue.GetLength(); | 295 int len = m_wsValue.GetLength(); |
| 296 while (FXSYS_iswspace(str[cc]) && cc < len) { | 296 while (FXSYS_iswspace(str[cc]) && cc < len) { |
| 297 cc++; | 297 cc++; |
| 298 } | 298 } |
| 299 if (cc >= len) { | 299 if (cc >= len) { |
| 300 return 0; | 300 return 0; |
| 301 } | 301 } |
| 302 if (str[0] == '+') { | 302 if (str[0] == '+') { |
| 303 cc++; | 303 cc++; |
| 304 } else if (str[0] == '-') { | 304 } else if (str[0] == '-') { |
| 305 bNegative = TRUE; | 305 bNegative = true; |
| 306 cc++; | 306 cc++; |
| 307 } | 307 } |
| 308 int32_t nIntegralLen = 0; | 308 int32_t nIntegralLen = 0; |
| 309 while (cc < len) { | 309 while (cc < len) { |
| 310 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) || | 310 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc]) || |
| 311 nIntegralLen > 17) { | 311 nIntegralLen > 17) { |
| 312 break; | 312 break; |
| 313 } | 313 } |
| 314 nIntegral = nIntegral * 10 + str[cc] - '0'; | 314 nIntegral = nIntegral * 10 + str[cc] - '0'; |
| 315 cc++; | 315 cc++; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 dwFractional = (uint32_t)(fraction * 4294967296.0); | 332 dwFractional = (uint32_t)(fraction * 4294967296.0); |
| 333 } | 333 } |
| 334 if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { | 334 if (cc < len && (str[cc] == 'E' || str[cc] == 'e')) { |
| 335 cc++; | 335 cc++; |
| 336 if (cc < len) { | 336 if (cc < len) { |
| 337 if (str[cc] == '+') { | 337 if (str[cc] == '+') { |
| 338 cc++; | 338 cc++; |
| 339 } else if (str[cc] == '-') { | 339 } else if (str[cc] == '-') { |
| 340 bExpSign = TRUE; | 340 bExpSign = true; |
| 341 cc++; | 341 cc++; |
| 342 } | 342 } |
| 343 } | 343 } |
| 344 while (cc < len) { | 344 while (cc < len) { |
| 345 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) { | 345 if (str[cc] == '.' || !FXSYS_isDecimalDigit(str[cc])) { |
| 346 break; | 346 break; |
| 347 } | 347 } |
| 348 nExponent = nExponent * 10 + str[cc] - '0'; | 348 nExponent = nExponent * 10 + str[cc] - '0'; |
| 349 cc++; | 349 cc++; |
| 350 } | 350 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 CFX_Unitime dt; | 383 CFX_Unitime dt; |
| 384 FX_DateFromCanonical(m_wsValue.Left(index), dt); | 384 FX_DateFromCanonical(m_wsValue.Left(index), dt); |
| 385 ASSERT(m_pLocaleMgr); | 385 ASSERT(m_pLocaleMgr); |
| 386 FX_TimeFromCanonical( | 386 FX_TimeFromCanonical( |
| 387 m_wsValue.Right(m_wsValue.GetLength() - index - 1).AsStringC(), dt, | 387 m_wsValue.Right(m_wsValue.GetLength() - index - 1).AsStringC(), dt, |
| 388 m_pLocaleMgr->GetDefLocale()); | 388 m_pLocaleMgr->GetDefLocale()); |
| 389 return dt; | 389 return dt; |
| 390 } | 390 } |
| 391 return CFX_Unitime(); | 391 return CFX_Unitime(); |
| 392 } | 392 } |
| 393 FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText) { | 393 bool CXFA_LocaleValue::SetText(const CFX_WideString& wsText) { |
| 394 m_dwType = XFA_VT_TEXT; | 394 m_dwType = XFA_VT_TEXT; |
| 395 m_wsValue = wsText; | 395 m_wsValue = wsText; |
| 396 return TRUE; | 396 return true; |
| 397 } | 397 } |
| 398 FX_BOOL CXFA_LocaleValue::SetText(const CFX_WideString& wsText, | 398 bool CXFA_LocaleValue::SetText(const CFX_WideString& wsText, |
| 399 const CFX_WideString& wsFormat, | 399 const CFX_WideString& wsFormat, |
| 400 IFX_Locale* pLocale) { | 400 IFX_Locale* pLocale) { |
| 401 m_dwType = XFA_VT_TEXT; | 401 m_dwType = XFA_VT_TEXT; |
| 402 return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale); | 402 return m_bValid = ParsePatternValue(wsText, wsFormat, pLocale); |
| 403 } | 403 } |
| 404 FX_BOOL CXFA_LocaleValue::SetNum(FX_FLOAT fNum) { | 404 bool CXFA_LocaleValue::SetNum(FX_FLOAT fNum) { |
| 405 m_dwType = XFA_VT_FLOAT; | 405 m_dwType = XFA_VT_FLOAT; |
| 406 m_wsValue.Format(L"%.8g", (FX_DOUBLE)fNum); | 406 m_wsValue.Format(L"%.8g", (FX_DOUBLE)fNum); |
| 407 return TRUE; | 407 return true; |
| 408 } | 408 } |
| 409 FX_BOOL CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum, | 409 bool CXFA_LocaleValue::SetNum(const CFX_WideString& wsNum, |
| 410 const CFX_WideString& wsFormat, | 410 const CFX_WideString& wsFormat, |
| 411 IFX_Locale* pLocale) { | 411 IFX_Locale* pLocale) { |
| 412 m_dwType = XFA_VT_FLOAT; | 412 m_dwType = XFA_VT_FLOAT; |
| 413 return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale); | 413 return m_bValid = ParsePatternValue(wsNum, wsFormat, pLocale); |
| 414 } | 414 } |
| 415 FX_BOOL CXFA_LocaleValue::SetDate(const CFX_Unitime& d) { | 415 bool CXFA_LocaleValue::SetDate(const CFX_Unitime& d) { |
| 416 m_dwType = XFA_VT_DATE; | 416 m_dwType = XFA_VT_DATE; |
| 417 m_wsValue.Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay()); | 417 m_wsValue.Format(L"%04d-%02d-%02d", d.GetYear(), d.GetMonth(), d.GetDay()); |
| 418 return TRUE; | 418 return true; |
| 419 } | 419 } |
| 420 FX_BOOL CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate, | 420 bool CXFA_LocaleValue::SetDate(const CFX_WideString& wsDate, |
| 421 const CFX_WideString& wsFormat, | 421 const CFX_WideString& wsFormat, |
| 422 IFX_Locale* pLocale) { | 422 IFX_Locale* pLocale) { |
| 423 m_dwType = XFA_VT_DATE; | 423 m_dwType = XFA_VT_DATE; |
| 424 return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale); | 424 return m_bValid = ParsePatternValue(wsDate, wsFormat, pLocale); |
| 425 } | 425 } |
| 426 FX_BOOL CXFA_LocaleValue::SetTime(const CFX_Unitime& t) { | 426 bool CXFA_LocaleValue::SetTime(const CFX_Unitime& t) { |
| 427 m_dwType = XFA_VT_TIME; | 427 m_dwType = XFA_VT_TIME; |
| 428 m_wsValue.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(), | 428 m_wsValue.Format(L"%02d:%02d:%02d", t.GetHour(), t.GetMinute(), |
| 429 t.GetSecond()); | 429 t.GetSecond()); |
| 430 if (t.GetMillisecond() > 0) { | 430 if (t.GetMillisecond() > 0) { |
| 431 CFX_WideString wsTemp; | 431 CFX_WideString wsTemp; |
| 432 wsTemp.Format(L"%:03d", t.GetMillisecond()); | 432 wsTemp.Format(L"%:03d", t.GetMillisecond()); |
| 433 m_wsValue += wsTemp; | 433 m_wsValue += wsTemp; |
| 434 } | 434 } |
| 435 return TRUE; | 435 return true; |
| 436 } | 436 } |
| 437 FX_BOOL CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime, | 437 bool CXFA_LocaleValue::SetTime(const CFX_WideString& wsTime, |
| 438 const CFX_WideString& wsFormat, | 438 const CFX_WideString& wsFormat, |
| 439 IFX_Locale* pLocale) { | 439 IFX_Locale* pLocale) { |
| 440 m_dwType = XFA_VT_TIME; | 440 m_dwType = XFA_VT_TIME; |
| 441 return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale); | 441 return m_bValid = ParsePatternValue(wsTime, wsFormat, pLocale); |
| 442 } | 442 } |
| 443 FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) { | 443 bool CXFA_LocaleValue::SetDateTime(const CFX_Unitime& dt) { |
| 444 m_dwType = XFA_VT_DATETIME; | 444 m_dwType = XFA_VT_DATETIME; |
| 445 m_wsValue.Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(), | 445 m_wsValue.Format(L"%04d-%02d-%02dT%02d:%02d:%02d", dt.GetYear(), |
| 446 dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(), | 446 dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(), |
| 447 dt.GetSecond()); | 447 dt.GetSecond()); |
| 448 if (dt.GetMillisecond() > 0) { | 448 if (dt.GetMillisecond() > 0) { |
| 449 CFX_WideString wsTemp; | 449 CFX_WideString wsTemp; |
| 450 wsTemp.Format(L"%:03d", dt.GetMillisecond()); | 450 wsTemp.Format(L"%:03d", dt.GetMillisecond()); |
| 451 m_wsValue += wsTemp; | 451 m_wsValue += wsTemp; |
| 452 } | 452 } |
| 453 return TRUE; | 453 return true; |
| 454 } | 454 } |
| 455 FX_BOOL CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime, | 455 bool CXFA_LocaleValue::SetDateTime(const CFX_WideString& wsDateTime, |
| 456 const CFX_WideString& wsFormat, | 456 const CFX_WideString& wsFormat, |
| 457 IFX_Locale* pLocale) { | 457 IFX_Locale* pLocale) { |
| 458 m_dwType = XFA_VT_DATETIME; | 458 m_dwType = XFA_VT_DATETIME; |
| 459 return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale); | 459 return m_bValid = ParsePatternValue(wsDateTime, wsFormat, pLocale); |
| 460 } | 460 } |
| 461 FX_BOOL CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult, | 461 bool CXFA_LocaleValue::FormatPatterns(CFX_WideString& wsResult, |
| 462 const CFX_WideString& wsFormat, | 462 const CFX_WideString& wsFormat, |
| 463 IFX_Locale* pLocale, | 463 IFX_Locale* pLocale, |
| 464 XFA_VALUEPICTURE eValueType) const { | 464 XFA_VALUEPICTURE eValueType) const { |
| 465 wsResult.clear(); | 465 wsResult.clear(); |
| 466 FX_BOOL bRet = FALSE; | 466 bool bRet = false; |
| 467 | 467 |
| 468 CFX_FormatString* pFormat = nullptr; | 468 CFX_FormatString* pFormat = nullptr; |
| 469 if (m_pLocaleMgr) | 469 if (m_pLocaleMgr) |
| 470 pFormat = new CFX_FormatString(m_pLocaleMgr, FALSE); | 470 pFormat = new CFX_FormatString(m_pLocaleMgr, false); |
| 471 | 471 |
| 472 CFX_WideStringArray wsPatterns; | 472 CFX_WideStringArray wsPatterns; |
| 473 pFormat->SplitFormatString(wsFormat, wsPatterns); | 473 pFormat->SplitFormatString(wsFormat, wsPatterns); |
| 474 int32_t iCount = wsPatterns.GetSize(); | 474 int32_t iCount = wsPatterns.GetSize(); |
| 475 for (int32_t i = 0; i < iCount; i++) { | 475 for (int32_t i = 0; i < iCount; i++) { |
| 476 bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType); | 476 bRet = FormatSinglePattern(wsResult, wsPatterns[i], pLocale, eValueType); |
| 477 if (bRet) { | 477 if (bRet) { |
| 478 break; | 478 break; |
| 479 } | 479 } |
| 480 } | 480 } |
| 481 pFormat->Release(); | 481 pFormat->Release(); |
| 482 return bRet; | 482 return bRet; |
| 483 } | 483 } |
| 484 FX_BOOL CXFA_LocaleValue::FormatSinglePattern( | 484 bool CXFA_LocaleValue::FormatSinglePattern(CFX_WideString& wsResult, |
| 485 CFX_WideString& wsResult, | 485 const CFX_WideString& wsFormat, |
| 486 const CFX_WideString& wsFormat, | 486 IFX_Locale* pLocale, |
| 487 IFX_Locale* pLocale, | 487 XFA_VALUEPICTURE eValueType) const { |
| 488 XFA_VALUEPICTURE eValueType) const { | |
| 489 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); | 488 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); |
| 490 if (pLocale) { | 489 if (pLocale) { |
| 491 m_pLocaleMgr->SetDefLocale(pLocale); | 490 m_pLocaleMgr->SetDefLocale(pLocale); |
| 492 } | 491 } |
| 493 wsResult.clear(); | 492 wsResult.clear(); |
| 494 FX_BOOL bRet = FALSE; | 493 bool bRet = false; |
| 495 | 494 |
| 496 CFX_FormatString* pFormat = nullptr; | 495 CFX_FormatString* pFormat = nullptr; |
| 497 if (m_pLocaleMgr) | 496 if (m_pLocaleMgr) |
| 498 pFormat = new CFX_FormatString(m_pLocaleMgr, FALSE); | 497 pFormat = new CFX_FormatString(m_pLocaleMgr, false); |
| 499 | 498 |
| 500 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); | 499 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); |
| 501 eCategory = XFA_ValugeCategory(eCategory, m_dwType); | 500 eCategory = XFA_ValugeCategory(eCategory, m_dwType); |
| 502 switch (eCategory) { | 501 switch (eCategory) { |
| 503 case FX_LOCALECATEGORY_Null: | 502 case FX_LOCALECATEGORY_Null: |
| 504 if (m_wsValue.IsEmpty()) { | 503 if (m_wsValue.IsEmpty()) { |
| 505 bRet = pFormat->FormatNull(wsFormat, wsResult); | 504 bRet = pFormat->FormatNull(wsFormat, wsResult); |
| 506 } | 505 } |
| 507 break; | 506 break; |
| 508 case FX_LOCALECATEGORY_Zero: | 507 case FX_LOCALECATEGORY_Zero: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 523 case FX_LOCALECATEGORY_Time: | 522 case FX_LOCALECATEGORY_Time: |
| 524 bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, | 523 bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, |
| 525 FX_DATETIMETYPE_Time); | 524 FX_DATETIMETYPE_Time); |
| 526 break; | 525 break; |
| 527 case FX_LOCALECATEGORY_DateTime: | 526 case FX_LOCALECATEGORY_DateTime: |
| 528 bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, | 527 bRet = pFormat->FormatDateTime(m_wsValue, wsFormat, wsResult, |
| 529 FX_DATETIMETYPE_DateTime); | 528 FX_DATETIMETYPE_DateTime); |
| 530 break; | 529 break; |
| 531 default: | 530 default: |
| 532 wsResult = m_wsValue; | 531 wsResult = m_wsValue; |
| 533 bRet = TRUE; | 532 bRet = true; |
| 534 } | 533 } |
| 535 pFormat->Release(); | 534 pFormat->Release(); |
| 536 if (!bRet && (eCategory != FX_LOCALECATEGORY_Num || | 535 if (!bRet && (eCategory != FX_LOCALECATEGORY_Num || |
| 537 eValueType != XFA_VALUEPICTURE_Display)) { | 536 eValueType != XFA_VALUEPICTURE_Display)) { |
| 538 wsResult = m_wsValue; | 537 wsResult = m_wsValue; |
| 539 } | 538 } |
| 540 if (pLocale) { | 539 if (pLocale) { |
| 541 m_pLocaleMgr->SetDefLocale(locale); | 540 m_pLocaleMgr->SetDefLocale(locale); |
| 542 } | 541 } |
| 543 return bRet; | 542 return bRet; |
| 544 } | 543 } |
| 545 static FX_BOOL XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime, | 544 static bool XFA_ValueSplitDateTime(const CFX_WideString& wsDateTime, |
| 546 CFX_WideString& wsDate, | 545 CFX_WideString& wsDate, |
| 547 CFX_WideString& wsTime) { | 546 CFX_WideString& wsTime) { |
| 548 wsDate = L""; | 547 wsDate = L""; |
| 549 wsTime = L""; | 548 wsTime = L""; |
| 550 if (wsDateTime.IsEmpty()) { | 549 if (wsDateTime.IsEmpty()) { |
| 551 return FALSE; | 550 return false; |
| 552 } | 551 } |
| 553 int nSplitIndex = -1; | 552 int nSplitIndex = -1; |
| 554 nSplitIndex = wsDateTime.Find('T'); | 553 nSplitIndex = wsDateTime.Find('T'); |
| 555 if (nSplitIndex < 0) { | 554 if (nSplitIndex < 0) { |
| 556 nSplitIndex = wsDateTime.Find(' '); | 555 nSplitIndex = wsDateTime.Find(' '); |
| 557 } | 556 } |
| 558 if (nSplitIndex < 0) { | 557 if (nSplitIndex < 0) { |
| 559 return FALSE; | 558 return false; |
| 560 } | 559 } |
| 561 wsDate = wsDateTime.Left(nSplitIndex); | 560 wsDate = wsDateTime.Left(nSplitIndex); |
| 562 wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); | 561 wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); |
| 563 return TRUE; | 562 return true; |
| 564 } | 563 } |
| 565 FX_BOOL CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue, | 564 bool CXFA_LocaleValue::ValidateCanonicalValue(const CFX_WideString& wsValue, |
| 566 uint32_t dwVType) { | 565 uint32_t dwVType) { |
| 567 if (wsValue.IsEmpty()) { | 566 if (wsValue.IsEmpty()) { |
| 568 return TRUE; | 567 return true; |
| 569 } | 568 } |
| 570 CFX_Unitime dt; | 569 CFX_Unitime dt; |
| 571 switch (dwVType) { | 570 switch (dwVType) { |
| 572 case XFA_VT_DATE: { | 571 case XFA_VT_DATE: { |
| 573 if (ValidateCanonicalDate(wsValue, dt)) { | 572 if (ValidateCanonicalDate(wsValue, dt)) { |
| 574 return TRUE; | 573 return true; |
| 575 } | 574 } |
| 576 CFX_WideString wsDate, wsTime; | 575 CFX_WideString wsDate, wsTime; |
| 577 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && | 576 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && |
| 578 ValidateCanonicalDate(wsDate, dt)) { | 577 ValidateCanonicalDate(wsDate, dt)) { |
| 579 return TRUE; | 578 return true; |
| 580 } | 579 } |
| 581 return FALSE; | 580 return false; |
| 582 } | 581 } |
| 583 case XFA_VT_TIME: { | 582 case XFA_VT_TIME: { |
| 584 if (ValidateCanonicalTime(wsValue)) { | 583 if (ValidateCanonicalTime(wsValue)) { |
| 585 return TRUE; | 584 return true; |
| 586 } | 585 } |
| 587 CFX_WideString wsDate, wsTime; | 586 CFX_WideString wsDate, wsTime; |
| 588 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && | 587 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && |
| 589 ValidateCanonicalTime(wsTime)) { | 588 ValidateCanonicalTime(wsTime)) { |
| 590 return TRUE; | 589 return true; |
| 591 } | 590 } |
| 592 return FALSE; | 591 return false; |
| 593 } | 592 } |
| 594 case XFA_VT_DATETIME: { | 593 case XFA_VT_DATETIME: { |
| 595 CFX_WideString wsDate, wsTime; | 594 CFX_WideString wsDate, wsTime; |
| 596 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && | 595 if (XFA_ValueSplitDateTime(wsValue, wsDate, wsTime) && |
| 597 ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) { | 596 ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime)) { |
| 598 return TRUE; | 597 return true; |
| 599 } | 598 } |
| 600 } break; | 599 } break; |
| 601 } | 600 } |
| 602 return TRUE; | 601 return true; |
| 603 } | 602 } |
| 604 FX_BOOL CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate, | 603 bool CXFA_LocaleValue::ValidateCanonicalDate(const CFX_WideString& wsDate, |
| 605 CFX_Unitime& unDate) { | 604 CFX_Unitime& unDate) { |
| 606 const uint16_t LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | 605 const uint16_t LastDay[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; |
| 607 const uint16_t wCountY = 4, wCountM = 2, wCountD = 2; | 606 const uint16_t wCountY = 4, wCountM = 2, wCountD = 2; |
| 608 int nLen = wsDate.GetLength(); | 607 int nLen = wsDate.GetLength(); |
| 609 if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) { | 608 if (nLen < wCountY || nLen > wCountY + wCountM + wCountD + 2) { |
| 610 return FALSE; | 609 return false; |
| 611 } | 610 } |
| 612 const bool bSymbol = wsDate.Find(0x2D) != -1; | 611 const bool bSymbol = wsDate.Find(0x2D) != -1; |
| 613 uint16_t wYear = 0; | 612 uint16_t wYear = 0; |
| 614 uint16_t wMonth = 0; | 613 uint16_t wMonth = 0; |
| 615 uint16_t wDay = 0; | 614 uint16_t wDay = 0; |
| 616 const FX_WCHAR* pDate = wsDate.c_str(); | 615 const FX_WCHAR* pDate = wsDate.c_str(); |
| 617 int nIndex = 0, nStart = 0; | 616 int nIndex = 0, nStart = 0; |
| 618 while (pDate[nIndex] != '\0' && nIndex < wCountY) { | 617 while (pDate[nIndex] != '\0' && nIndex < wCountY) { |
| 619 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { | 618 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { |
| 620 return FALSE; | 619 return false; |
| 621 } | 620 } |
| 622 wYear = (pDate[nIndex] - '0') + wYear * 10; | 621 wYear = (pDate[nIndex] - '0') + wYear * 10; |
| 623 nIndex++; | 622 nIndex++; |
| 624 } | 623 } |
| 625 if (bSymbol) { | 624 if (bSymbol) { |
| 626 if (pDate[nIndex] != 0x2D) { | 625 if (pDate[nIndex] != 0x2D) { |
| 627 return FALSE; | 626 return false; |
| 628 } | 627 } |
| 629 nIndex++; | 628 nIndex++; |
| 630 } | 629 } |
| 631 nStart = nIndex; | 630 nStart = nIndex; |
| 632 while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) { | 631 while (pDate[nIndex] != '\0' && nIndex - nStart < wCountM && nIndex < nLen) { |
| 633 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { | 632 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { |
| 634 return FALSE; | 633 return false; |
| 635 } | 634 } |
| 636 wMonth = (pDate[nIndex] - '0') + wMonth * 10; | 635 wMonth = (pDate[nIndex] - '0') + wMonth * 10; |
| 637 nIndex++; | 636 nIndex++; |
| 638 } | 637 } |
| 639 if (bSymbol) { | 638 if (bSymbol) { |
| 640 if (pDate[nIndex] != 0x2D) { | 639 if (pDate[nIndex] != 0x2D) { |
| 641 return FALSE; | 640 return false; |
| 642 } | 641 } |
| 643 nIndex++; | 642 nIndex++; |
| 644 } | 643 } |
| 645 nStart = nIndex; | 644 nStart = nIndex; |
| 646 while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) { | 645 while (pDate[nIndex] != '\0' && nIndex - nStart < wCountD && nIndex < nLen) { |
| 647 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { | 646 if (!FXSYS_isDecimalDigit(pDate[nIndex])) { |
| 648 return FALSE; | 647 return false; |
| 649 } | 648 } |
| 650 wDay = (pDate[nIndex] - '0') + wDay * 10; | 649 wDay = (pDate[nIndex] - '0') + wDay * 10; |
| 651 nIndex++; | 650 nIndex++; |
| 652 } | 651 } |
| 653 if (nIndex != nLen) { | 652 if (nIndex != nLen) { |
| 654 return FALSE; | 653 return false; |
| 655 } | 654 } |
| 656 if (wYear < 1900 || wYear > 2029) { | 655 if (wYear < 1900 || wYear > 2029) { |
| 657 return FALSE; | 656 return false; |
| 658 } | 657 } |
| 659 if (wMonth < 1 || wMonth > 12) { | 658 if (wMonth < 1 || wMonth > 12) { |
| 660 if (wMonth == 0 && nLen == wCountY) { | 659 if (wMonth == 0 && nLen == wCountY) { |
| 661 return TRUE; | 660 return true; |
| 662 } | 661 } |
| 663 return FALSE; | 662 return false; |
| 664 } | 663 } |
| 665 if (wDay < 1) { | 664 if (wDay < 1) { |
| 666 if (wDay == 0 && (nLen == wCountY + wCountM)) { | 665 if (wDay == 0 && (nLen == wCountY + wCountM)) { |
| 667 return TRUE; | 666 return true; |
| 668 } | 667 } |
| 669 return FALSE; | 668 return false; |
| 670 } | 669 } |
| 671 if (wMonth == 2) { | 670 if (wMonth == 2) { |
| 672 if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) { | 671 if (wYear % 400 == 0 || (wYear % 100 != 0 && wYear % 4 == 0)) { |
| 673 if (wDay > 29) { | 672 if (wDay > 29) { |
| 674 return FALSE; | 673 return false; |
| 675 } | 674 } |
| 676 } else { | 675 } else { |
| 677 if (wDay > 28) { | 676 if (wDay > 28) { |
| 678 return FALSE; | 677 return false; |
| 679 } | 678 } |
| 680 } | 679 } |
| 681 } else if (wDay > LastDay[wMonth - 1]) { | 680 } else if (wDay > LastDay[wMonth - 1]) { |
| 682 return FALSE; | 681 return false; |
| 683 } | 682 } |
| 684 CFX_Unitime ut; | 683 CFX_Unitime ut; |
| 685 ut.Set(wYear, static_cast<uint8_t>(wMonth), static_cast<uint8_t>(wDay)); | 684 ut.Set(wYear, static_cast<uint8_t>(wMonth), static_cast<uint8_t>(wDay)); |
| 686 unDate = unDate + ut; | 685 unDate = unDate + ut; |
| 687 return TRUE; | 686 return true; |
| 688 } | 687 } |
| 689 FX_BOOL CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) { | 688 bool CXFA_LocaleValue::ValidateCanonicalTime(const CFX_WideString& wsTime) { |
| 690 int nLen = wsTime.GetLength(); | 689 int nLen = wsTime.GetLength(); |
| 691 if (nLen < 2) | 690 if (nLen < 2) |
| 692 return FALSE; | 691 return false; |
| 693 const uint16_t wCountH = 2; | 692 const uint16_t wCountH = 2; |
| 694 const uint16_t wCountM = 2; | 693 const uint16_t wCountM = 2; |
| 695 const uint16_t wCountS = 2; | 694 const uint16_t wCountS = 2; |
| 696 const uint16_t wCountF = 3; | 695 const uint16_t wCountF = 3; |
| 697 const bool bSymbol = wsTime.Find(':') != -1; | 696 const bool bSymbol = wsTime.Find(':') != -1; |
| 698 uint16_t wHour = 0; | 697 uint16_t wHour = 0; |
| 699 uint16_t wMinute = 0; | 698 uint16_t wMinute = 0; |
| 700 uint16_t wSecond = 0; | 699 uint16_t wSecond = 0; |
| 701 uint16_t wFraction = 0; | 700 uint16_t wFraction = 0; |
| 702 const FX_WCHAR* pTime = wsTime.c_str(); | 701 const FX_WCHAR* pTime = wsTime.c_str(); |
| 703 int nIndex = 0; | 702 int nIndex = 0; |
| 704 int nStart = 0; | 703 int nStart = 0; |
| 705 while (nIndex - nStart < wCountH && pTime[nIndex]) { | 704 while (nIndex - nStart < wCountH && pTime[nIndex]) { |
| 706 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 705 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 707 return FALSE; | 706 return false; |
| 708 wHour = pTime[nIndex] - '0' + wHour * 10; | 707 wHour = pTime[nIndex] - '0' + wHour * 10; |
| 709 nIndex++; | 708 nIndex++; |
| 710 } | 709 } |
| 711 if (bSymbol) { | 710 if (bSymbol) { |
| 712 if (nIndex < nLen && pTime[nIndex] != ':') | 711 if (nIndex < nLen && pTime[nIndex] != ':') |
| 713 return FALSE; | 712 return false; |
| 714 nIndex++; | 713 nIndex++; |
| 715 } | 714 } |
| 716 nStart = nIndex; | 715 nStart = nIndex; |
| 717 while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) { | 716 while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) { |
| 718 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 717 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 719 return FALSE; | 718 return false; |
| 720 wMinute = pTime[nIndex] - '0' + wMinute * 10; | 719 wMinute = pTime[nIndex] - '0' + wMinute * 10; |
| 721 nIndex++; | 720 nIndex++; |
| 722 } | 721 } |
| 723 if (bSymbol) { | 722 if (bSymbol) { |
| 724 if (nIndex < nLen && pTime[nIndex] != ':') | 723 if (nIndex < nLen && pTime[nIndex] != ':') |
| 725 return FALSE; | 724 return false; |
| 726 nIndex++; | 725 nIndex++; |
| 727 } | 726 } |
| 728 nStart = nIndex; | 727 nStart = nIndex; |
| 729 while (nIndex - nStart < wCountS && nIndex < nLen && pTime[nIndex]) { | 728 while (nIndex - nStart < wCountS && nIndex < nLen && pTime[nIndex]) { |
| 730 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 729 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 731 return FALSE; | 730 return false; |
| 732 wSecond = pTime[nIndex] - '0' + wSecond * 10; | 731 wSecond = pTime[nIndex] - '0' + wSecond * 10; |
| 733 nIndex++; | 732 nIndex++; |
| 734 } | 733 } |
| 735 if (wsTime.Find('.') > 0) { | 734 if (wsTime.Find('.') > 0) { |
| 736 if (pTime[nIndex] != '.') | 735 if (pTime[nIndex] != '.') |
| 737 return FALSE; | 736 return false; |
| 738 nIndex++; | 737 nIndex++; |
| 739 nStart = nIndex; | 738 nStart = nIndex; |
| 740 while (nIndex - nStart < wCountF && nIndex < nLen && pTime[nIndex]) { | 739 while (nIndex - nStart < wCountF && nIndex < nLen && pTime[nIndex]) { |
| 741 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 740 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 742 return FALSE; | 741 return false; |
| 743 wFraction = pTime[nIndex] - '0' + wFraction * 10; | 742 wFraction = pTime[nIndex] - '0' + wFraction * 10; |
| 744 nIndex++; | 743 nIndex++; |
| 745 } | 744 } |
| 746 } | 745 } |
| 747 if (nIndex < nLen) { | 746 if (nIndex < nLen) { |
| 748 if (pTime[nIndex] == 'Z') { | 747 if (pTime[nIndex] == 'Z') { |
| 749 nIndex++; | 748 nIndex++; |
| 750 } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') { | 749 } else if (pTime[nIndex] == '-' || pTime[nIndex] == '+') { |
| 751 int16_t nOffsetH = 0; | 750 int16_t nOffsetH = 0; |
| 752 int16_t nOffsetM = 0; | 751 int16_t nOffsetM = 0; |
| 753 nIndex++; | 752 nIndex++; |
| 754 nStart = nIndex; | 753 nStart = nIndex; |
| 755 while (nIndex - nStart < wCountH && nIndex < nLen && pTime[nIndex]) { | 754 while (nIndex - nStart < wCountH && nIndex < nLen && pTime[nIndex]) { |
| 756 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 755 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 757 return FALSE; | 756 return false; |
| 758 nOffsetH = pTime[nIndex] - '0' + nOffsetH * 10; | 757 nOffsetH = pTime[nIndex] - '0' + nOffsetH * 10; |
| 759 nIndex++; | 758 nIndex++; |
| 760 } | 759 } |
| 761 if (bSymbol) { | 760 if (bSymbol) { |
| 762 if (nIndex < nLen && pTime[nIndex] != ':') | 761 if (nIndex < nLen && pTime[nIndex] != ':') |
| 763 return FALSE; | 762 return false; |
| 764 nIndex++; | 763 nIndex++; |
| 765 } | 764 } |
| 766 nStart = nIndex; | 765 nStart = nIndex; |
| 767 while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) { | 766 while (nIndex - nStart < wCountM && nIndex < nLen && pTime[nIndex]) { |
| 768 if (!FXSYS_isDecimalDigit(pTime[nIndex])) | 767 if (!FXSYS_isDecimalDigit(pTime[nIndex])) |
| 769 return FALSE; | 768 return false; |
| 770 nOffsetM = pTime[nIndex] - '0' + nOffsetM * 10; | 769 nOffsetM = pTime[nIndex] - '0' + nOffsetM * 10; |
| 771 nIndex++; | 770 nIndex++; |
| 772 } | 771 } |
| 773 if (nOffsetH > 12 || nOffsetM >= 60) | 772 if (nOffsetH > 12 || nOffsetM >= 60) |
| 774 return FALSE; | 773 return false; |
| 775 } | 774 } |
| 776 } | 775 } |
| 777 return nIndex == nLen && wHour < 24 && wMinute < 60 && wSecond < 60 && | 776 return nIndex == nLen && wHour < 24 && wMinute < 60 && wSecond < 60 && |
| 778 wFraction <= 999; | 777 wFraction <= 999; |
| 779 } | 778 } |
| 780 FX_BOOL CXFA_LocaleValue::ValidateCanonicalDateTime( | 779 bool CXFA_LocaleValue::ValidateCanonicalDateTime( |
| 781 const CFX_WideString& wsDateTime) { | 780 const CFX_WideString& wsDateTime) { |
| 782 CFX_WideString wsDate, wsTime; | 781 CFX_WideString wsDate, wsTime; |
| 783 if (wsDateTime.IsEmpty()) { | 782 if (wsDateTime.IsEmpty()) { |
| 784 return FALSE; | 783 return false; |
| 785 } | 784 } |
| 786 int nSplitIndex = -1; | 785 int nSplitIndex = -1; |
| 787 nSplitIndex = wsDateTime.Find('T'); | 786 nSplitIndex = wsDateTime.Find('T'); |
| 788 if (nSplitIndex < 0) { | 787 if (nSplitIndex < 0) { |
| 789 nSplitIndex = wsDateTime.Find(' '); | 788 nSplitIndex = wsDateTime.Find(' '); |
| 790 } | 789 } |
| 791 if (nSplitIndex < 0) { | 790 if (nSplitIndex < 0) { |
| 792 return FALSE; | 791 return false; |
| 793 } | 792 } |
| 794 wsDate = wsDateTime.Left(nSplitIndex); | 793 wsDate = wsDateTime.Left(nSplitIndex); |
| 795 wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); | 794 wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex - 1); |
| 796 CFX_Unitime dt; | 795 CFX_Unitime dt; |
| 797 return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime); | 796 return ValidateCanonicalDate(wsDate, dt) && ValidateCanonicalTime(wsTime); |
| 798 } | 797 } |
| 799 FX_BOOL CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue, | 798 bool CXFA_LocaleValue::ParsePatternValue(const CFX_WideString& wsValue, |
| 800 const CFX_WideString& wsPattern, | 799 const CFX_WideString& wsPattern, |
| 801 IFX_Locale* pLocale) { | 800 IFX_Locale* pLocale) { |
| 802 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); | 801 IFX_Locale* locale = m_pLocaleMgr->GetDefLocale(); |
| 803 if (pLocale) { | 802 if (pLocale) { |
| 804 m_pLocaleMgr->SetDefLocale(pLocale); | 803 m_pLocaleMgr->SetDefLocale(pLocale); |
| 805 } | 804 } |
| 806 | 805 |
| 807 CFX_FormatString* pFormat = nullptr; | 806 CFX_FormatString* pFormat = nullptr; |
| 808 if (m_pLocaleMgr) | 807 if (m_pLocaleMgr) |
| 809 pFormat = new CFX_FormatString(m_pLocaleMgr, FALSE); | 808 pFormat = new CFX_FormatString(m_pLocaleMgr, false); |
| 810 | 809 |
| 811 CFX_WideStringArray wsPatterns; | 810 CFX_WideStringArray wsPatterns; |
| 812 pFormat->SplitFormatString(wsPattern, wsPatterns); | 811 pFormat->SplitFormatString(wsPattern, wsPatterns); |
| 813 FX_BOOL bRet = FALSE; | 812 bool bRet = false; |
| 814 int32_t iCount = wsPatterns.GetSize(); | 813 int32_t iCount = wsPatterns.GetSize(); |
| 815 for (int32_t i = 0; i < iCount && !bRet; i++) { | 814 for (int32_t i = 0; i < iCount && !bRet; i++) { |
| 816 CFX_WideString wsFormat = wsPatterns[i]; | 815 CFX_WideString wsFormat = wsPatterns[i]; |
| 817 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); | 816 FX_LOCALECATEGORY eCategory = pFormat->GetCategory(wsFormat); |
| 818 eCategory = XFA_ValugeCategory(eCategory, m_dwType); | 817 eCategory = XFA_ValugeCategory(eCategory, m_dwType); |
| 819 switch (eCategory) { | 818 switch (eCategory) { |
| 820 case FX_LOCALECATEGORY_Null: | 819 case FX_LOCALECATEGORY_Null: |
| 821 bRet = pFormat->ParseNull(wsValue, wsFormat); | 820 bRet = pFormat->ParseNull(wsValue, wsFormat); |
| 822 if (bRet) { | 821 if (bRet) { |
| 823 m_wsValue.clear(); | 822 m_wsValue.clear(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 CFX_Unitime dt; | 864 CFX_Unitime dt; |
| 866 bRet = pFormat->ParseDateTime(wsValue, wsFormat, | 865 bRet = pFormat->ParseDateTime(wsValue, wsFormat, |
| 867 FX_DATETIMETYPE_DateTime, dt); | 866 FX_DATETIMETYPE_DateTime, dt); |
| 868 if (bRet) { | 867 if (bRet) { |
| 869 SetDateTime(dt); | 868 SetDateTime(dt); |
| 870 } | 869 } |
| 871 break; | 870 break; |
| 872 } | 871 } |
| 873 default: | 872 default: |
| 874 m_wsValue = wsValue; | 873 m_wsValue = wsValue; |
| 875 bRet = TRUE; | 874 bRet = true; |
| 876 break; | 875 break; |
| 877 } | 876 } |
| 878 } | 877 } |
| 879 if (!bRet) { | 878 if (!bRet) { |
| 880 m_wsValue = wsValue; | 879 m_wsValue = wsValue; |
| 881 } | 880 } |
| 882 pFormat->Release(); | 881 pFormat->Release(); |
| 883 if (pLocale) { | 882 if (pLocale) { |
| 884 m_pLocaleMgr->SetDefLocale(locale); | 883 m_pLocaleMgr->SetDefLocale(locale); |
| 885 } | 884 } |
| 886 return bRet; | 885 return bRet; |
| 887 } | 886 } |
| 888 void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat, | 887 void CXFA_LocaleValue::GetNumbericFormat(CFX_WideString& wsFormat, |
| 889 int32_t nIntLen, | 888 int32_t nIntLen, |
| 890 int32_t nDecLen, | 889 int32_t nDecLen, |
| 891 FX_BOOL bSign) { | 890 bool bSign) { |
| 892 ASSERT(wsFormat.IsEmpty()); | 891 ASSERT(wsFormat.IsEmpty()); |
| 893 ASSERT(nIntLen >= -1 && nDecLen >= -1); | 892 ASSERT(nIntLen >= -1 && nDecLen >= -1); |
| 894 int32_t nTotalLen = (nIntLen >= 0 ? nIntLen : 2) + (bSign ? 1 : 0) + | 893 int32_t nTotalLen = (nIntLen >= 0 ? nIntLen : 2) + (bSign ? 1 : 0) + |
| 895 (nDecLen >= 0 ? nDecLen : 2) + (nDecLen == 0 ? 0 : 1); | 894 (nDecLen >= 0 ? nDecLen : 2) + (nDecLen == 0 ? 0 : 1); |
| 896 FX_WCHAR* lpBuf = wsFormat.GetBuffer(nTotalLen); | 895 FX_WCHAR* lpBuf = wsFormat.GetBuffer(nTotalLen); |
| 897 int32_t nPos = 0; | 896 int32_t nPos = 0; |
| 898 if (bSign) { | 897 if (bSign) { |
| 899 lpBuf[nPos++] = L's'; | 898 lpBuf[nPos++] = L's'; |
| 900 } | 899 } |
| 901 if (nIntLen == -1) { | 900 if (nIntLen == -1) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 914 lpBuf[nPos++] = L'z'; | 913 lpBuf[nPos++] = L'z'; |
| 915 lpBuf[nPos++] = L'*'; | 914 lpBuf[nPos++] = L'*'; |
| 916 } else { | 915 } else { |
| 917 while (nDecLen) { | 916 while (nDecLen) { |
| 918 lpBuf[nPos++] = L'z'; | 917 lpBuf[nPos++] = L'z'; |
| 919 nDecLen--; | 918 nDecLen--; |
| 920 } | 919 } |
| 921 } | 920 } |
| 922 wsFormat.ReleaseBuffer(nTotalLen); | 921 wsFormat.ReleaseBuffer(nTotalLen); |
| 923 } | 922 } |
| 924 FX_BOOL CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric, | 923 bool CXFA_LocaleValue::ValidateNumericTemp(CFX_WideString& wsNumeric, |
| 925 CFX_WideString& wsFormat, | 924 CFX_WideString& wsFormat, |
| 926 IFX_Locale* pLocale, | 925 IFX_Locale* pLocale, |
| 927 int32_t* pos) { | 926 int32_t* pos) { |
| 928 if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) { | 927 if (wsFormat.IsEmpty() || wsNumeric.IsEmpty()) { |
| 929 return TRUE; | 928 return true; |
| 930 } | 929 } |
| 931 const FX_WCHAR* pNum = wsNumeric.c_str(); | 930 const FX_WCHAR* pNum = wsNumeric.c_str(); |
| 932 const FX_WCHAR* pFmt = wsFormat.c_str(); | 931 const FX_WCHAR* pFmt = wsFormat.c_str(); |
| 933 int32_t n = 0, nf = 0; | 932 int32_t n = 0, nf = 0; |
| 934 FX_WCHAR c = pNum[n]; | 933 FX_WCHAR c = pNum[n]; |
| 935 FX_WCHAR cf = pFmt[nf]; | 934 FX_WCHAR cf = pFmt[nf]; |
| 936 if (cf == L's') { | 935 if (cf == L's') { |
| 937 if (c == L'-' || c == L'+') { | 936 if (c == L'-' || c == L'+') { |
| 938 ++n; | 937 ++n; |
| 939 } | 938 } |
| 940 ++nf; | 939 ++nf; |
| 941 } | 940 } |
| 942 FX_BOOL bLimit = TRUE; | 941 bool bLimit = true; |
| 943 int32_t nCount = wsNumeric.GetLength(); | 942 int32_t nCount = wsNumeric.GetLength(); |
| 944 int32_t nCountFmt = wsFormat.GetLength(); | 943 int32_t nCountFmt = wsFormat.GetLength(); |
| 945 while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) && | 944 while (n < nCount && (bLimit ? nf < nCountFmt : true) && |
| 946 FXSYS_isDecimalDigit(c = pNum[n])) { | 945 FXSYS_isDecimalDigit(c = pNum[n])) { |
| 947 if (bLimit == TRUE) { | 946 if (bLimit == true) { |
| 948 if ((cf = pFmt[nf]) == L'*') { | 947 if ((cf = pFmt[nf]) == L'*') { |
| 949 bLimit = FALSE; | 948 bLimit = false; |
| 950 } else if (cf == L'z') { | 949 } else if (cf == L'z') { |
| 951 nf++; | 950 nf++; |
| 952 } else { | 951 } else { |
| 953 return FALSE; | 952 return false; |
| 954 } | 953 } |
| 955 } | 954 } |
| 956 n++; | 955 n++; |
| 957 } | 956 } |
| 958 if (n == nCount) { | 957 if (n == nCount) { |
| 959 return TRUE; | 958 return true; |
| 960 } | 959 } |
| 961 if (nf == nCountFmt) { | 960 if (nf == nCountFmt) { |
| 962 return FALSE; | 961 return false; |
| 963 } | 962 } |
| 964 while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') { | 963 while (nf < nCountFmt && (cf = pFmt[nf]) != L'.') { |
| 965 ASSERT(cf == L'z' || cf == L'*'); | 964 ASSERT(cf == L'z' || cf == L'*'); |
| 966 ++nf; | 965 ++nf; |
| 967 } | 966 } |
| 968 CFX_WideString wsDecimalSymbol; | 967 CFX_WideString wsDecimalSymbol; |
| 969 if (pLocale) { | 968 if (pLocale) { |
| 970 pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol); | 969 pLocale->GetNumbericSymbol(FX_LOCALENUMSYMBOL_Decimal, wsDecimalSymbol); |
| 971 } else { | 970 } else { |
| 972 wsDecimalSymbol = CFX_WideString(L'.'); | 971 wsDecimalSymbol = CFX_WideString(L'.'); |
| 973 } | 972 } |
| 974 if (pFmt[nf] != L'.') { | 973 if (pFmt[nf] != L'.') { |
| 975 return FALSE; | 974 return false; |
| 976 } | 975 } |
| 977 if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') { | 976 if (wsDecimalSymbol != CFX_WideStringC(c) && c != L'.') { |
| 978 return FALSE; | 977 return false; |
| 979 } | 978 } |
| 980 ++nf; | 979 ++nf; |
| 981 ++n; | 980 ++n; |
| 982 bLimit = TRUE; | 981 bLimit = true; |
| 983 while (n < nCount && (bLimit ? nf < nCountFmt : TRUE) && | 982 while (n < nCount && (bLimit ? nf < nCountFmt : true) && |
| 984 FXSYS_isDecimalDigit(c = pNum[n])) { | 983 FXSYS_isDecimalDigit(c = pNum[n])) { |
| 985 if (bLimit == TRUE) { | 984 if (bLimit == true) { |
| 986 if ((cf = pFmt[nf]) == L'*') { | 985 if ((cf = pFmt[nf]) == L'*') { |
| 987 bLimit = FALSE; | 986 bLimit = false; |
| 988 } else if (cf == L'z') { | 987 } else if (cf == L'z') { |
| 989 nf++; | 988 nf++; |
| 990 } else { | 989 } else { |
| 991 return FALSE; | 990 return false; |
| 992 } | 991 } |
| 993 } | 992 } |
| 994 n++; | 993 n++; |
| 995 } | 994 } |
| 996 return n == nCount; | 995 return n == nCount; |
| 997 } | 996 } |
| OLD | NEW |