Consolidate code into CPDF_TextPageFind::ExtractFindWhat().
Also make CPDF_TextPageFind::ExtractSubString() a standalone function
because it is independent of the rest of the class.
Change-Id: I0176ff3b0cf31ae77477a04f8e720a68503ca987
Reviewed-on: https://pdfium-review.googlesource.com/c/34858
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdftext/cpdf_textpagefind.cpp b/core/fpdftext/cpdf_textpagefind.cpp
index 093d335..dc94504 100644
--- a/core/fpdftext/cpdf_textpagefind.cpp
+++ b/core/fpdftext/cpdf_textpagefind.cpp
@@ -41,6 +41,29 @@
return wsLower;
}
+Optional<WideString> ExtractSubString(const wchar_t* lpszFullString,
+ int iSubString) {
+ ASSERT(lpszFullString);
+
+ while (iSubString--) {
+ lpszFullString = std::wcschr(lpszFullString, TEXT_SPACE_CHAR);
+ if (!lpszFullString)
+ return {};
+
+ lpszFullString++;
+ while (*lpszFullString == TEXT_SPACE_CHAR)
+ lpszFullString++;
+ }
+
+ const wchar_t* lpchEnd = std::wcschr(lpszFullString, TEXT_SPACE_CHAR);
+ int nLen = lpchEnd ? static_cast<int>(lpchEnd - lpszFullString)
+ : static_cast<int>(wcslen(lpszFullString));
+ if (nLen < 0)
+ return {};
+
+ return WideString(lpszFullString, static_cast<size_t>(nLen));
+}
+
} // namespace
CPDF_TextPageFind::CPDF_TextPageFind(const CPDF_TextPage* pTextPage,
@@ -55,6 +78,7 @@
m_findNextStart = startPos;
m_findPreStart = startPos.value_or(m_strText.GetLength() - 1);
}
+ ExtractFindWhat();
}
CPDF_TextPageFind::~CPDF_TextPageFind() = default;
@@ -64,19 +88,7 @@
}
bool CPDF_TextPageFind::FindFirst() {
- if (m_strText.IsEmpty())
- return true;
-
- size_t len = m_findWhat.GetLength();
- size_t i = 0;
- for (i = 0; i < len; ++i)
- if (m_findWhat[i] != ' ')
- break;
- if (i < len)
- ExtractFindWhat();
- else
- m_csFindWhatArray.push_back(m_findWhat);
- return !m_csFindWhatArray.empty();
+ return m_strText.IsEmpty() || !m_csFindWhatArray.empty();
}
bool CPDF_TextPageFind::FindNext() {
@@ -206,13 +218,19 @@
}
void CPDF_TextPageFind::ExtractFindWhat() {
- if (m_findWhat.IsEmpty())
+ size_t len = m_findWhat.GetLength();
+ size_t i = 0;
+ for (i = 0; i < len; ++i)
+ if (m_findWhat[i] != ' ')
+ break;
+ if (i == len) {
+ m_csFindWhatArray.push_back(m_findWhat);
return;
+ }
int index = 0;
while (1) {
- Optional<WideString> word =
- ExtractSubString(m_findWhat.c_str(), index, TEXT_SPACE_CHAR);
+ Optional<WideString> word = ExtractSubString(m_findWhat.c_str(), index);
if (!word)
break;
@@ -296,32 +314,6 @@
return true;
}
-Optional<WideString> CPDF_TextPageFind::ExtractSubString(
- const wchar_t* lpszFullString,
- int iSubString,
- wchar_t chSep) {
- if (!lpszFullString)
- return {};
-
- while (iSubString--) {
- lpszFullString = std::wcschr(lpszFullString, chSep);
- if (!lpszFullString)
- return {};
-
- lpszFullString++;
- while (*lpszFullString == chSep)
- lpszFullString++;
- }
-
- const wchar_t* lpchEnd = std::wcschr(lpszFullString, chSep);
- int nLen = lpchEnd ? static_cast<int>(lpchEnd - lpszFullString)
- : static_cast<int>(wcslen(lpszFullString));
- if (nLen < 0)
- return {};
-
- return {WideString(lpszFullString, static_cast<size_t>(nLen))};
-}
-
int CPDF_TextPageFind::GetCurOrder() const {
return GetCharIndex(m_resStart);
}
diff --git a/core/fpdftext/cpdf_textpagefind.h b/core/fpdftext/cpdf_textpagefind.h
index 9f3ac13..7ad7601 100644
--- a/core/fpdftext/cpdf_textpagefind.h
+++ b/core/fpdftext/cpdf_textpagefind.h
@@ -44,9 +44,6 @@
bool IsMatchWholeWord(const WideString& csPageText,
size_t startPos,
size_t endPos);
- Optional<WideString> ExtractSubString(const wchar_t* lpszFullString,
- int iSubString,
- wchar_t chSep);
int GetCharIndex(int index) const;
private: