Use lengths from span where possible rather than from string.
Omits one indirection. May allow the optimizer to better reason
about bounds checking.
Change-Id: I2a62f2281d283970614182c9f6a942f85a6915d7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/51952
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 e4ddb6c..d3da5ee 100644
--- a/xfa/fgas/crt/cfgas_stringformatter.cpp
+++ b/xfa/fgas/crt/cfgas_stringformatter.cpp
@@ -484,22 +484,19 @@
return !!(*cc);
}
-int32_t GetNumTrailingLimit(const WideString& wsFormat,
- int iDotPos,
- bool* bTrimTailZeros) {
- if (iDotPos < 0)
- return 0;
-
- int32_t iCount = wsFormat.GetLength();
- int32_t iTreading = 0;
- for (iDotPos++; iDotPos < iCount; iDotPos++) {
- wchar_t wc = wsFormat[iDotPos];
+size_t GetNumTrailingLimit(const WideString& wsFormat,
+ size_t iDotPos,
+ bool* bTrimTailZeros) {
+ const pdfium::span<const wchar_t> spFormat = wsFormat.AsSpan();
+ size_t iTrailing = 0;
+ for (++iDotPos; iDotPos < spFormat.size(); ++iDotPos) {
+ wchar_t wc = spFormat[iDotPos];
if (wc == L'z' || wc == L'9' || wc == 'Z') {
- iTreading++;
+ iTrailing++;
*bTrimTailZeros = wc != L'9';
}
}
- return iTreading;
+ return iTrailing;
}
bool IsLeapYear(uint32_t year) {
@@ -1050,7 +1047,7 @@
bool CFGAS_StringFormatter::ParseText(const WideString& wsSrcText,
WideString* wsValue) const {
wsValue->clear();
- if (wsSrcText.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsSrcText.IsEmpty() || m_spPattern.empty())
return false;
WideString wsTextFormat = GetTextFormat(L"text");
@@ -1121,10 +1118,10 @@
bool CFGAS_StringFormatter::ParseNum(const WideString& wsSrcNum,
WideString* wsValue) const {
wsValue->clear();
- if (wsSrcNum.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsSrcNum.IsEmpty() || m_spPattern.empty())
return false;
- size_t dot_index_f = m_wsPattern.GetLength();
+ size_t dot_index_f = m_spPattern.size();
uint32_t dwFormatStyle = 0;
WideString wsNumFormat;
LocaleIface* pLocale =
@@ -1669,7 +1666,7 @@
FX_DATETIMETYPE eDateTimeType,
CFX_DateTime* dtValue) const {
dtValue->Reset();
- if (wsSrcDateTime.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsSrcDateTime.IsEmpty() || m_spPattern.empty())
return false;
WideString wsDatePattern;
@@ -1767,7 +1764,7 @@
bool CFGAS_StringFormatter::FormatText(const WideString& wsSrcText,
WideString* wsOutput) const {
- if (wsSrcText.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsSrcText.IsEmpty() || m_spPattern.empty())
return false;
WideString wsTextFormat = GetTextFormat(L"text");
@@ -1825,10 +1822,10 @@
bool CFGAS_StringFormatter::FormatNum(const WideString& wsInputNum,
WideString* wsOutput) const {
- if (wsInputNum.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsInputNum.IsEmpty() || m_spPattern.empty())
return false;
- size_t dot_index_f = m_wsPattern.GetLength();
+ size_t dot_index_f = m_spPattern.size();
uint32_t dwNumStyle = 0;
WideString wsNumFormat;
LocaleIface* pLocale =
@@ -2172,7 +2169,7 @@
bool CFGAS_StringFormatter::FormatDateTime(const WideString& wsSrcDateTime,
FX_DATETIMETYPE eDateTimeType,
WideString* wsOutput) const {
- if (wsSrcDateTime.IsEmpty() || m_wsPattern.IsEmpty())
+ if (wsSrcDateTime.IsEmpty() || m_spPattern.empty())
return false;
WideString wsDatePattern;
@@ -2227,7 +2224,7 @@
}
bool CFGAS_StringFormatter::FormatZero(WideString* wsOutput) const {
- if (m_wsPattern.IsEmpty())
+ if (m_spPattern.empty())
return false;
WideString wsTextFormat = GetTextFormat(L"zero");
@@ -2243,7 +2240,7 @@
}
bool CFGAS_StringFormatter::FormatNull(WideString* wsOutput) const {
- if (m_wsPattern.IsEmpty())
+ if (m_spPattern.empty())
return false;
WideString wsTextFormat = GetTextFormat(L"null");