diff options
Diffstat (limited to 'xfa')
-rw-r--r-- | xfa/fgas/crt/cfgas_formatstring.cpp | 218 |
1 files changed, 103 insertions, 115 deletions
diff --git a/xfa/fgas/crt/cfgas_formatstring.cpp b/xfa/fgas/crt/cfgas_formatstring.cpp index b7a26c5ef7..12fc17feb0 100644 --- a/xfa/fgas/crt/cfgas_formatstring.cpp +++ b/xfa/fgas/crt/cfgas_formatstring.cpp @@ -53,16 +53,14 @@ const int32_t g_iFXLocaleNumSubCatCount = sizeof(g_FXLocaleNumSubCatData) / sizeof(FX_LOCALESUBCATEGORYINFO); struct FX_LOCALETIMEZONEINFO { - uint32_t uHash; + const wchar_t* name; int16_t iHour; int16_t iMinute; }; const FX_LOCALETIMEZONEINFO g_FXLocaleTimeZoneData[] = { - {FXBSTR_ID(0, 'C', 'D', 'T'), -5, 0}, {FXBSTR_ID(0, 'C', 'S', 'T'), -6, 0}, - {FXBSTR_ID(0, 'E', 'D', 'T'), -4, 0}, {FXBSTR_ID(0, 'E', 'S', 'T'), -5, 0}, - {FXBSTR_ID(0, 'M', 'D', 'T'), -6, 0}, {FXBSTR_ID(0, 'M', 'S', 'T'), -7, 0}, - {FXBSTR_ID(0, 'P', 'D', 'T'), -7, 0}, {FXBSTR_ID(0, 'P', 'S', 'T'), -8, 0}, + {L"CDT", -5, 0}, {L"CST", -6, 0}, {L"EDT", -4, 0}, {L"EST", -5, 0}, + {L"MDT", -6, 0}, {L"MST", -7, 0}, {L"PDT", -7, 0}, {L"PST", -8, 0}, }; const wchar_t gs_wsTimeSymbols[] = L"hHkKMSFAzZ"; @@ -236,50 +234,50 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, ccf++; continue; } - uint32_t dwSymbolNum = 1; - wchar_t dwCharSymbol = strf[ccf++]; - while (ccf < lenf && strf[ccf] == dwCharSymbol) { - ccf++; - dwSymbolNum++; - } - uint32_t dwSymbol = (dwCharSymbol << 8) | (dwSymbolNum + '0'); - if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) { + + CFX_WideString symbol; + symbol.Reserve(4); + symbol += strf[ccf++]; + while (ccf < lenf && strf[ccf] == symbol[0]) + symbol += strf[ccf++]; + + if (symbol == L"D") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; day = str[(*cc)++] - '0'; if (*cc < len && FXSYS_isDecimalDigit(str[*cc])) day = day * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) { + } else if (symbol == L"DD") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; day = str[(*cc)++] - '0'; if (*cc < len) day = day * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) { + } else if (symbol == L"J") { int i = 0; while (*cc < len && i < 3 && FXSYS_isDecimalDigit(str[*cc])) { (*cc)++; i++; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) { + } else if (symbol == L"JJJ") { *cc += 3; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + } else if (symbol == L"M") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; month = str[(*cc)++] - '0'; if (*cc < len && FXSYS_isDecimalDigit(str[*cc])) month = month * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + } else if (symbol == L"MM") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; month = str[(*cc)++] - '0'; if (*cc < len) month = month * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) { + } else if (symbol == L"MMM") { CFX_WideString wsMonthNameAbbr; uint16_t i = 0; for (; i < 12; i++) { @@ -295,7 +293,7 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, *cc += wsMonthNameAbbr.GetLength(); month = i + 1; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) { + } else if (symbol == L"MMMM") { CFX_WideString wsMonthName; uint16_t i = 0; for (; i < 12; i++) { @@ -309,9 +307,9 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, *cc += wsMonthName.GetLength(); month = i + 1; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) { + } else if (symbol == L"E") { *cc += 1; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) { + } else if (symbol == L"EEE") { CFX_WideString wsDayNameAbbr; uint16_t i = 0; for (; i < 7; i++) { @@ -325,7 +323,7 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, } if (i < 12) *cc += wsDayNameAbbr.GetLength(); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) { + } else if (symbol == L"EEEE") { CFX_WideString wsDayName; int32_t i = 0; for (; i < 7; i++) { @@ -337,11 +335,11 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, } if (i < 12) *cc += wsDayName.GetLength(); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) { + } else if (symbol == L"e") { *cc += 1; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) { + } else if (symbol == L"G") { *cc += 2; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) { + } else if (symbol == L"YY") { if (*cc + 2 > len || !FXSYS_isDecimalDigit(str[*cc])) return false; @@ -354,7 +352,7 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, year += 2000; else year += 1900; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) { + } else if (symbol == L"YYYY") { int i = 0; year = 0; if (*cc + 4 > len) @@ -368,9 +366,9 @@ bool ParseLocaleDate(const CFX_WideString& wsDate, (*cc)++; i++; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) { + } else if (symbol == L"w") { *cc += 1; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) { + } else if (symbol == L"WW") { *cc += 2; } } @@ -437,30 +435,23 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, continue; } - uint32_t dwSymbolNum = 1; - wchar_t dwCharSymbol = strf[ccf++]; - while (ccf < lenf && strf[ccf] == dwCharSymbol) { - ccf++; - dwSymbolNum++; - } + CFX_WideString symbol; + symbol.Reserve(4); + symbol += strf[ccf++]; + while (ccf < lenf && strf[ccf] == symbol[0]) + symbol += strf[ccf++]; - uint32_t dwSymbol = (dwCharSymbol << 8) | (dwSymbolNum + '0'); - if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1') || - dwSymbol == FXBSTR_ID(0, 0, 'H', '1') || - dwSymbol == FXBSTR_ID(0, 0, 'h', '1') || - dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) { + if (symbol == L"k" || symbol == L"K" || symbol == L"h" || symbol == L"H") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; hour = str[(*cc)++] - '0'; if (*cc < len && FXSYS_isDecimalDigit(str[*cc])) hour = hour * 10 + str[(*cc)++] - '0'; - if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1') && hour == 24) + if (symbol == L"K" && hour == 24) hour = 0; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2') || - dwSymbol == FXBSTR_ID(0, 0, 'H', '2') || - dwSymbol == FXBSTR_ID(0, 0, 'h', '2') || - dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) { + } else if (symbol == L"kk" || symbol == L"KK" || symbol == L"hh" || + symbol == L"HH") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; @@ -471,16 +462,16 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, return false; hour = hour * 10 + str[(*cc)++] - '0'; - if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2') && hour == 24) + if (symbol == L"KK" && hour == 24) hour = 0; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + } else if (symbol == L"M") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; minute = str[(*cc)++] - '0'; if (*cc < len && FXSYS_isDecimalDigit(str[*cc])) minute = minute * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + } else if (symbol == L"MM") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; @@ -491,14 +482,14 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, return false; minute = minute * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) { + } else if (symbol == L"S") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; second = str[(*cc)++] - '0'; if (*cc < len && FXSYS_isDecimalDigit(str[*cc])) second = second * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) { + } else if (symbol == L"SS") { if (!FXSYS_isDecimalDigit(str[*cc])) return false; @@ -509,7 +500,7 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, return false; second = second * 10 + str[(*cc)++] - '0'; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) { + } else if (symbol == L"FFF") { if (*cc + 3 >= len) return false; @@ -521,7 +512,7 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, millisecond = millisecond * 10 + str[(*cc)++] - '0'; i++; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) { + } else if (symbol == L"A") { CFX_WideString wsAM = pLocale->GetMeridiemName(true); CFX_WideString wsPM = pLocale->GetMeridiemName(false); if ((*cc + wsAM.GetLength() <= len) && @@ -534,14 +525,14 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, bHasA = true; bPM = true; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) { + } else if (symbol == L"Z") { if (*cc + 3 > len) continue; - uint32_t dwHash = str[(*cc)++]; - dwHash = (dwHash << 8) | str[(*cc)++]; - dwHash = (dwHash << 8) | str[(*cc)++]; - if (dwHash == FXBSTR_ID(0, 'G', 'M', 'T')) { + CFX_WideString tz(str[(*cc)++]); + tz += str[(*cc)++]; + tz += str[(*cc)++]; + if (tz == L"GMT") { FX_TIMEZONE tzDiff; tzDiff.tzHour = 0; tzDiff.tzMinute = 0; @@ -550,19 +541,18 @@ bool ParseLocaleTime(const CFX_WideString& wsTime, ResolveZone(tzDiff, pLocale, &hour, &minute); } else { - const FX_LOCALETIMEZONEINFO* pEnd = - g_FXLocaleTimeZoneData + FX_ArraySize(g_FXLocaleTimeZoneData); - const FX_LOCALETIMEZONEINFO* pTimeZoneInfo = - std::lower_bound(g_FXLocaleTimeZoneData, pEnd, dwHash, - [](const FX_LOCALETIMEZONEINFO& info, - uint32_t hash) { return info.uHash < hash; }); - if (pTimeZoneInfo < pEnd && dwHash == pTimeZoneInfo->uHash) { - hour += pTimeZoneInfo->iHour; - minute += pTimeZoneInfo->iHour > 0 ? pTimeZoneInfo->iMinute - : -pTimeZoneInfo->iMinute; + // Search the timezone list. There are only 8 of them, so linear scan. + for (size_t i = 0; i < FX_ArraySize(g_FXLocaleTimeZoneData); ++i) { + const FX_LOCALETIMEZONEINFO& info = g_FXLocaleTimeZoneData[i]; + if (tz != info.name) + continue; + + hour += info.iHour; + minute += info.iHour > 0 ? info.iMinute : -info.iMinute; + break; } } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) { + } else if (symbol == L"z") { if (str[*cc] != 'Z') { FX_TIMEZONE tzDiff; *cc += ParseTimeZone(str + *cc, len - *cc, &tzDiff); @@ -670,22 +660,21 @@ CFX_WideString DateFormat(const CFX_WideString& wsDatePattern, continue; } - uint32_t dwSymbolNum = 1; - wchar_t dwCharSymbol = strf[ccf++]; - while (ccf < lenf && strf[ccf] == dwCharSymbol) { - ccf++; - dwSymbolNum++; - } - uint32_t dwSymbol = (dwCharSymbol << 8) | (dwSymbolNum + '0'); - if (dwSymbol == FXBSTR_ID(0, 0, 'D', '1')) { + CFX_WideString symbol; + symbol.Reserve(4); + symbol += strf[ccf++]; + while (ccf < lenf && strf[ccf] == symbol[0]) + symbol += strf[ccf++]; + + if (symbol == L"D") { CFX_WideString wsDay; wsDay.Format(L"%d", day); wsResult += wsDay; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'D', '2')) { + } else if (symbol == L"DD") { CFX_WideString wsDay; wsDay.Format(L"%02d", day); wsResult += wsDay; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '1')) { + } else if (symbol == L"J") { uint16_t nDays = 0; for (int i = 1; i < month; i++) nDays += GetSolarMonthDays(year, i); @@ -694,7 +683,7 @@ CFX_WideString DateFormat(const CFX_WideString& wsDatePattern, CFX_WideString wsDays; wsDays.Format(L"%d", nDays); wsResult += wsDays; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'J', '3')) { + } else if (symbol == L"JJJ") { uint16_t nDays = 0; for (int i = 1; i < month; i++) nDays += GetSolarMonthDays(year, i); @@ -703,51 +692,51 @@ CFX_WideString DateFormat(const CFX_WideString& wsDatePattern, CFX_WideString wsDays; wsDays.Format(L"%03d", nDays); wsResult += wsDays; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + } else if (symbol == L"M") { CFX_WideString wsMonth; wsMonth.Format(L"%d", month); wsResult += wsMonth; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + } else if (symbol == L"MM") { CFX_WideString wsMonth; wsMonth.Format(L"%02d", month); wsResult += wsMonth; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '3')) { + } else if (symbol == L"MMM") { wsResult += pLocale->GetMonthName(month - 1, true); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '4')) { + } else if (symbol == L"MMMM") { wsResult += pLocale->GetMonthName(month - 1, false); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '1')) { + } else if (symbol == L"E") { uint16_t wWeekDay = GetWeekDay(year, month, day); CFX_WideString wsWeekDay; wsWeekDay.Format(L"%d", wWeekDay + 1); wsResult += wsWeekDay; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '3')) { + } else if (symbol == L"EEE") { uint16_t wWeekDay = GetWeekDay(year, month, day); wsResult += pLocale->GetDayName(wWeekDay, true); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'E', '4')) { + } else if (symbol == L"EEEE") { uint16_t wWeekDay = GetWeekDay(year, month, day); if (pLocale) wsResult += pLocale->GetDayName(wWeekDay, false); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'e', '1')) { + } else if (symbol == L"e") { uint16_t wWeekDay = GetWeekDay(year, month, day); CFX_WideString wsWeekDay; wsWeekDay.Format(L"%d", wWeekDay ? wWeekDay : 7); wsResult += wsWeekDay; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'G', '1')) { + } else if (symbol == L"G") { wsResult += pLocale->GetEraName(year > 0); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '2')) { + } else if (symbol == L"YY") { CFX_WideString wsYear; wsYear.Format(L"%02d", year % 100); wsResult += wsYear; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Y', '4')) { + } else if (symbol == L"YYYY") { CFX_WideString wsYear; wsYear.Format(L"%d", year); wsResult += wsYear; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'w', '1')) { + } else if (symbol == L"w") { uint16_t week_index = GetWeekOfMonth(year, month, day); CFX_WideString wsWeekInMonth; wsWeekInMonth.Format(L"%d", week_index); wsResult += wsWeekInMonth; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'W', '2')) { + } else if (symbol == L"WW") { uint16_t week_index = GetWeekOfYear(year, month, day); CFX_WideString wsWeekInYear; wsWeekInYear.Format(L"%02d", week_index); @@ -787,80 +776,79 @@ CFX_WideString TimeFormat(const CFX_WideString& wsTimePattern, continue; } - uint32_t dwSymbolNum = 1; - wchar_t dwCharSymbol = strf[ccf++]; - while (ccf < lenf && strf[ccf] == dwCharSymbol) { - ccf++; - dwSymbolNum++; - } - uint32_t dwSymbol = (dwCharSymbol << 8) | (dwSymbolNum + '0'); - if (dwSymbol == FXBSTR_ID(0, 0, 'h', '1')) { + CFX_WideString symbol; + symbol.Reserve(4); + symbol += strf[ccf++]; + while (ccf < lenf && strf[ccf] == symbol[0]) + symbol += strf[ccf++]; + + if (symbol == L"h") { if (wHour > 12) wHour -= 12; CFX_WideString wsHour; wsHour.Format(L"%d", wHour == 0 ? 12 : wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'h', '2')) { + } else if (symbol == L"hh") { if (wHour > 12) wHour -= 12; CFX_WideString wsHour; wsHour.Format(L"%02d", wHour == 0 ? 12 : wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '1')) { + } else if (symbol == L"K") { CFX_WideString wsHour; wsHour.Format(L"%d", wHour == 0 ? 24 : wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'K', '2')) { + } else if (symbol == L"KK") { CFX_WideString wsHour; wsHour.Format(L"%02d", wHour == 0 ? 24 : wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '1')) { + } else if (symbol == L"k") { if (wHour > 12) wHour -= 12; CFX_WideString wsHour; wsHour.Format(L"%d", wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '1')) { + } else if (symbol == L"H") { CFX_WideString wsHour; wsHour.Format(L"%d", wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'k', '2')) { + } else if (symbol == L"kk") { if (wHour > 12) wHour -= 12; CFX_WideString wsHour; wsHour.Format(L"%02d", wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'H', '2')) { + } else if (symbol == L"HH") { CFX_WideString wsHour; wsHour.Format(L"%02d", wHour); wsResult += wsHour; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '1')) { + } else if (symbol == L"M") { CFX_WideString wsMinute; wsMinute.Format(L"%d", minute); wsResult += wsMinute; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'M', '2')) { + } else if (symbol == L"MM") { CFX_WideString wsMinute; wsMinute.Format(L"%02d", minute); wsResult += wsMinute; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '1')) { + } else if (symbol == L"S") { CFX_WideString wsSecond; wsSecond.Format(L"%d", second); wsResult += wsSecond; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'S', '2')) { + } else if (symbol == L"SS") { CFX_WideString wsSecond; wsSecond.Format(L"%02d", second); wsResult += wsSecond; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'F', '3')) { + } else if (symbol == L"FFF") { CFX_WideString wsMilliseconds; wsMilliseconds.Format(L"%03d", millisecond); wsResult += wsMilliseconds; - } else if (dwSymbol == FXBSTR_ID(0, 0, 'A', '1')) { + } else if (symbol == L"A") { wsResult += pLocale->GetMeridiemName(!bPM); - } else if (dwSymbol == FXBSTR_ID(0, 0, 'Z', '1')) { + } else if (symbol == L"Z") { wsResult += L"GMT"; FX_TIMEZONE tz = pLocale->GetTimeZone(); if (tz.tzHour != 0 || tz.tzMinute != 0) { @@ -870,7 +858,7 @@ CFX_WideString TimeFormat(const CFX_WideString& wsTimePattern, wsTimezone.Format(L"%02d:%02d", abs(tz.tzHour), tz.tzMinute); wsResult += wsTimezone; } - } else if (dwSymbol == FXBSTR_ID(0, 0, 'z', '1')) { + } else if (symbol == L"z") { FX_TIMEZONE tz = pLocale->GetTimeZone(); if (tz.tzHour != 0 || tz.tzMinute != 0) { wsResult += tz.tzHour < 0 ? L"-" : L"+"; |