Remove out int args from CPDFLinkExtract::GetTextRange()
Replace with optional range struct based on size_t. Then convert
back to int only at the public API boundary.
Change-Id: Icb9f40919ad78fa0a23de94aa834ba6cf7a16052
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/91510
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index 68bca2d..9cffa34 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -168,7 +168,7 @@
maybe_link.value().m_Start += start;
m_LinkArray.push_back(maybe_link.value());
} else if (CheckMailLink(&strBeCheck)) {
- m_LinkArray.push_back(Link{start, nCount, strBeCheck});
+ m_LinkArray.push_back(Link{{start, nCount}, strBeCheck});
}
}
}
@@ -203,7 +203,7 @@
if (end > off) { // Non-empty host name.
const size_t nStart = start.value();
const size_t nCount = end - nStart + 1;
- return Link{nStart, nCount, strBeCheck.Substr(nStart, nCount)};
+ return Link{{nStart, nCount}, strBeCheck.Substr(nStart, nCount)};
}
}
}
@@ -221,7 +221,7 @@
if (end > off) {
const size_t nStart = start.value();
const size_t nCount = end - nStart + 1;
- return Link{nStart, nCount,
+ return Link{{nStart, nCount},
L"http://" + strBeCheck.Substr(nStart, nCount)};
}
}
@@ -311,12 +311,9 @@
m_LinkArray[index].m_Count);
}
-bool CPDF_LinkExtract::GetTextRange(size_t index,
- int* start_char_index,
- int* char_count) const {
+absl::optional<CPDF_LinkExtract::Range> CPDF_LinkExtract::GetTextRange(
+ size_t index) const {
if (index >= m_LinkArray.size())
- return false;
- *start_char_index = m_LinkArray[index].m_Start;
- *char_count = m_LinkArray[index].m_Count;
- return true;
+ return absl::nullopt;
+ return m_LinkArray[index];
}
diff --git a/core/fpdftext/cpdf_linkextract.h b/core/fpdftext/cpdf_linkextract.h
index d44db70..84f7dac 100644
--- a/core/fpdftext/cpdf_linkextract.h
+++ b/core/fpdftext/cpdf_linkextract.h
@@ -21,6 +21,11 @@
class CPDF_LinkExtract {
public:
+ struct Range {
+ size_t m_Start;
+ size_t m_Count;
+ };
+
explicit CPDF_LinkExtract(const CPDF_TextPage* pTextPage);
~CPDF_LinkExtract();
@@ -28,12 +33,10 @@
size_t CountLinks() const { return m_LinkArray.size(); }
WideString GetURL(size_t index) const;
std::vector<CFX_FloatRect> GetRects(size_t index) const;
- bool GetTextRange(size_t index, int* start_char_index, int* char_count) const;
+ absl::optional<Range> GetTextRange(size_t index) const;
protected:
- struct Link {
- size_t m_Start;
- size_t m_Count;
+ struct Link : public Range {
WideString m_strUrl;
};
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index d7420ee..da00c47 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -521,7 +521,14 @@
return false;
CPDF_LinkExtract* page_link = CPDFLinkExtractFromFPDFPageLink(link_page);
- return page_link->GetTextRange(link_index, start_char_index, char_count);
+ auto maybe_range = page_link->GetTextRange(link_index);
+ if (!maybe_range.has_value())
+ return false;
+
+ *start_char_index =
+ pdfium::base::checked_cast<int>(maybe_range.value().m_Start);
+ *char_count = pdfium::base::checked_cast<int>(maybe_range.value().m_Count);
+ return true;
}
FPDF_EXPORT void FPDF_CALLCONV FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page) {