Rework bit-twiddling in CFGAS_Stringformatter Change-Id: I60f897954e8824852c9066211220a01ec2283a1f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/74090 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fgas/crt/cfgas_stringformatter.cpp b/xfa/fgas/crt/cfgas_stringformatter.cpp index 91f3a39..69fb1a8 100644 --- a/xfa/fgas/crt/cfgas_stringformatter.cpp +++ b/xfa/fgas/crt/cfgas_stringformatter.cpp
@@ -707,6 +707,48 @@ return bDateFirst ? wsDateOut + wsTimeOut : wsTimeOut + wsDateOut; } +bool HasDate(CFGAS_StringFormatter::DateTimeType type) { + return type == CFGAS_StringFormatter::DateTimeType::kDate || + type == CFGAS_StringFormatter::DateTimeType::kDateTime || + type == CFGAS_StringFormatter::DateTimeType::kTimeDate; +} + +bool HasTime(CFGAS_StringFormatter::DateTimeType type) { + return type == CFGAS_StringFormatter::DateTimeType::kTime || + type == CFGAS_StringFormatter::DateTimeType::kDateTime || + type == CFGAS_StringFormatter::DateTimeType::kTimeDate; +} + +CFGAS_StringFormatter::DateTimeType AddDateToDatelessType( + CFGAS_StringFormatter::DateTimeType type) { + switch (type) { + case CFGAS_StringFormatter::DateTimeType::kUnknown: + return CFGAS_StringFormatter::DateTimeType::kDate; + case CFGAS_StringFormatter::DateTimeType::kTime: + return CFGAS_StringFormatter::DateTimeType::kTimeDate; + case CFGAS_StringFormatter::DateTimeType::kDate: + case CFGAS_StringFormatter::DateTimeType::kDateTime: + case CFGAS_StringFormatter::DateTimeType::kTimeDate: + NOTREACHED(); + return type; + } +} + +CFGAS_StringFormatter::DateTimeType AddTimeToTimelessType( + CFGAS_StringFormatter::DateTimeType type) { + switch (type) { + case CFGAS_StringFormatter::DateTimeType::kUnknown: + return CFGAS_StringFormatter::DateTimeType::kTime; + case CFGAS_StringFormatter::DateTimeType::kDate: + return CFGAS_StringFormatter::DateTimeType::kDateTime; + case CFGAS_StringFormatter::DateTimeType::kTime: + case CFGAS_StringFormatter::DateTimeType::kDateTime: + case CFGAS_StringFormatter::DateTimeType::kTimeDate: + NOTREACHED(); + return type; + } +} + } // namespace bool FX_DateFromCanonical(pdfium::span<const wchar_t> spDate, @@ -1546,8 +1588,8 @@ *pLocale = nullptr; WideString wsTempPattern; Category eCategory = Category::kUnknown; + DateTimeType eDateTimeType = DateTimeType::kUnknown; size_t ccf = 0; - int32_t iFindCategory = 0; bool bBraceOpen = false; while (ccf < m_spPattern.size()) { if (m_spPattern[ccf] == '\'') { @@ -1555,7 +1597,7 @@ GetLiteralText(m_spPattern, &ccf); wsTempPattern += WideStringView(m_spPattern.data() + iCurChar, ccf - iCurChar + 1); - } else if (!bBraceOpen && iFindCategory != 3 && + } else if (!bBraceOpen && eDateTimeType != DateTimeType::kDateTime && !pdfium::Contains(kConstChars, m_spPattern[ccf])) { WideString wsCategory(m_spPattern[ccf]); ccf++; @@ -1573,16 +1615,14 @@ wsCategory += m_spPattern[ccf]; ccf++; } - if (!(iFindCategory & 1) && wsCategory.EqualsASCII("date")) { - iFindCategory |= 1; + if (!HasDate(eDateTimeType) && wsCategory.EqualsASCII("date")) { + eDateTimeType = AddDateToDatelessType(eDateTimeType); eCategory = Category::kDate; - if (iFindCategory & 2) - iFindCategory = 4; - } else if (!(iFindCategory & 2) && wsCategory.EqualsASCII("time")) { - iFindCategory |= 2; + } else if (!HasTime(eDateTimeType) && wsCategory.EqualsASCII("time")) { + eDateTimeType = AddTimeToTimelessType(eDateTimeType); eCategory = Category::kTime; } else if (wsCategory.EqualsASCII("datetime")) { - iFindCategory = 3; + eDateTimeType = DateTimeType::kDateTime; eCategory = Category::kDateTime; } else { continue; @@ -1666,11 +1706,11 @@ } if (!*pLocale) *pLocale = m_pLocaleMgr->GetDefLocale(); - if (!iFindCategory) { + if (eDateTimeType == DateTimeType::kUnknown) { wsTimePattern->clear(); *wsDatePattern = m_wsPattern; } - return static_cast<DateTimeType>(iFindCategory); + return eDateTimeType; } bool CFGAS_StringFormatter::ParseDateTime(const WideString& wsSrcDateTime,
diff --git a/xfa/fgas/crt/cfgas_stringformatter.h b/xfa/fgas/crt/cfgas_stringformatter.h index 835ff92..98dfc6f 100644 --- a/xfa/fgas/crt/cfgas_stringformatter.h +++ b/xfa/fgas/crt/cfgas_stringformatter.h
@@ -33,9 +33,8 @@ kNull, }; - // Note: arithmetic depends on explicit values that do not change. enum class DateTimeType { - kUnknown = 0, + kUnknown, kDate, kTime, kDateTime,