Use spans in CFGAS_StringFormatter::SplitFormatString()

- rename to SplitByBars()
- return vector instead of out param.
- put conditional/increment in for statement.
- test bars inside quotes aren't split.

Change-Id: I9622a8a620604c119a210acc26efde5079b1a386
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/51773
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fgas/crt/cfgas_stringformatter.cpp b/xfa/fgas/crt/cfgas_stringformatter.cpp
index 96f6fbc..ee8321f 100644
--- a/xfa/fgas/crt/cfgas_stringformatter.cpp
+++ b/xfa/fgas/crt/cfgas_stringformatter.cpp
@@ -829,27 +829,23 @@
 
 CFGAS_StringFormatter::~CFGAS_StringFormatter() {}
 
-void CFGAS_StringFormatter::SplitFormatString(
-    const WideString& wsFormatString,
-    std::vector<WideString>* wsPatterns) const {
-  int32_t iStrLen = wsFormatString.GetLength();
-  const wchar_t* pStr = wsFormatString.c_str();
-  const wchar_t* pToken = pStr;
-  const wchar_t* pEnd = pStr + iStrLen;
+std::vector<WideString> CFGAS_StringFormatter::SplitOnBars(
+    const WideString& wsFormatString) {
+  std::vector<WideString> wsPatterns;
+  pdfium::span<const wchar_t> spFormatString = wsFormatString.AsSpan();
+  size_t index = 0;
+  size_t token = 0;
   bool bQuote = false;
-  while (true) {
-    if (pStr >= pEnd) {
-      wsPatterns->push_back(WideString(pToken, pStr - pToken));
-      return;
-    }
-    if (*pStr == '\'') {
+  for (; index < spFormatString.size(); ++index) {
+    if (spFormatString[index] == '\'') {
       bQuote = !bQuote;
-    } else if (*pStr == L'|' && !bQuote) {
-      wsPatterns->push_back(WideString(pToken, pStr - pToken));
-      pToken = pStr + 1;
+    } else if (spFormatString[index] == L'|' && !bQuote) {
+      wsPatterns.emplace_back(spFormatString.data() + token, index - token);
+      token = index + 1;
     }
-    pStr++;
   }
+  wsPatterns.emplace_back(spFormatString.data() + token, index - token);
+  return wsPatterns;
 }
 
 FX_LOCALECATEGORY CFGAS_StringFormatter::GetCategory(
diff --git a/xfa/fgas/crt/cfgas_stringformatter.h b/xfa/fgas/crt/cfgas_stringformatter.h
index 906508f..9583724 100644
--- a/xfa/fgas/crt/cfgas_stringformatter.h
+++ b/xfa/fgas/crt/cfgas_stringformatter.h
@@ -25,8 +25,7 @@
   explicit CFGAS_StringFormatter(LocaleMgrIface* pLocaleMgr);
   ~CFGAS_StringFormatter();
 
-  void SplitFormatString(const WideString& wsFormatString,
-                         std::vector<WideString>* wsPatterns) const;
+  std::vector<WideString> SplitOnBars(const WideString& wsFormatString);
   FX_LOCALECATEGORY GetCategory(const WideString& wsPattern) const;
 
   bool ParseText(const WideString& wsSrcText,
diff --git a/xfa/fgas/crt/cfgas_stringformatter_unittest.cpp b/xfa/fgas/crt/cfgas_stringformatter_unittest.cpp
index 478f053..c3e7c39 100644
--- a/xfa/fgas/crt/cfgas_stringformatter_unittest.cpp
+++ b/xfa/fgas/crt/cfgas_stringformatter_unittest.cpp
@@ -288,15 +288,21 @@
 // }
 
 TEST_F(CFGAS_StringFormatterTest, SplitFormatString) {
-  std::vector<WideString> results;
-  fmt(L"en")->SplitFormatString(
-      L"null{'No data'} | null{} | text{999*9999} | text{999*999*9999}",
-      &results);
+  std::vector<WideString> results = fmt(L"en")->SplitOnBars(L"");
+  EXPECT_EQ(1UL, results.size());
+  EXPECT_TRUE(results[0].IsEmpty());
+
+  results = fmt(L"en")->SplitOnBars(L"|");
+  EXPECT_EQ(2UL, results.size());
+  EXPECT_TRUE(results[0].IsEmpty());
+  EXPECT_TRUE(results[1].IsEmpty());
+
+  results = fmt(L"en")->SplitOnBars(
+      L"null{'No|data'} | null{} | text{999*9999} | text{999*999*9999}");
   EXPECT_EQ(4UL, results.size());
 
-  const wchar_t* patterns[] = {L"null{'No data'} ", L" null{} ",
+  const wchar_t* patterns[] = {L"null{'No|data'} ", L" null{} ",
                                L" text{999*9999} ", L" text{999*999*9999}"};
-
   for (size_t i = 0; i < results.size(); ++i) {
     EXPECT_STREQ(patterns[i], results[i].c_str());
   }
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 0b9ce1f..d9515e7 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -131,9 +131,7 @@
   ScopedLocale scoped_locale(m_pLocaleMgr.Get(), pLocale);
 
   auto pFormat = pdfium::MakeUnique<CFGAS_StringFormatter>(m_pLocaleMgr.Get());
-  std::vector<WideString> wsPatterns;
-  pFormat->SplitFormatString(wsPattern, &wsPatterns);
-
+  std::vector<WideString> wsPatterns = pFormat->SplitOnBars(wsPattern);
   bool bRet = false;
   size_t i = 0;
   for (; !bRet && i < wsPatterns.size(); i++) {
@@ -262,11 +260,9 @@
                                       const WideString& wsFormat,
                                       LocaleIface* pLocale,
                                       XFA_VALUEPICTURE eValueType) const {
-  auto pFormat = pdfium::MakeUnique<CFGAS_StringFormatter>(m_pLocaleMgr.Get());
-  std::vector<WideString> wsPatterns;
-  pFormat->SplitFormatString(wsFormat, &wsPatterns);
   wsResult.clear();
-  for (const auto& pattern : wsPatterns) {
+  auto pFormat = pdfium::MakeUnique<CFGAS_StringFormatter>(m_pLocaleMgr.Get());
+  for (const auto& pattern : pFormat->SplitOnBars(wsFormat)) {
     if (FormatSinglePattern(wsResult, pattern, pLocale, eValueType))
       return true;
   }
@@ -547,10 +543,8 @@
     return false;
 
   ScopedLocale scoped_locale(m_pLocaleMgr.Get(), pLocale);
-
   auto pFormat = pdfium::MakeUnique<CFGAS_StringFormatter>(m_pLocaleMgr.Get());
-  std::vector<WideString> wsPatterns;
-  pFormat->SplitFormatString(wsPattern, &wsPatterns);
+  std::vector<WideString> wsPatterns = pFormat->SplitOnBars(wsPattern);
   bool bRet = false;
   for (size_t i = 0; !bRet && i < wsPatterns.size(); i++) {
     const WideString& wsFormat = wsPatterns[i];