Avoid string streams in PDF_EncodeString() and PDF_HexEncodeString().
Pass arguments by stringview while at it.
Change-Id: Ib89b1850cec881ce8de7d6d7d2ae01c217f6e3b8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/88971
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 8740268..d6ab0b0 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -589,6 +589,6 @@
if (charcode != CPDF_Font::kInvalidCharCode)
pFont->AppendChar(&text, charcode);
}
- *buf << PDF_HexEncodeString(text) << " Tj ET";
+ *buf << PDF_HexEncodeString(text.AsStringView()) << " Tj ET";
*buf << " Q\n";
}
diff --git a/core/fpdfapi/parser/cpdf_string.cpp b/core/fpdfapi/parser/cpdf_string.cpp
index 001865b..2501cd1 100644
--- a/core/fpdfapi/parser/cpdf_string.cpp
+++ b/core/fpdfapi/parser/cpdf_string.cpp
@@ -74,12 +74,13 @@
encrypted_data = encryptor->Encrypt(data);
data = encrypted_data;
}
- const ByteString raw(data.data(), data.size());
- const ByteString content =
+ ByteStringView raw(data.data(), data.size());
+ ByteString content =
m_bHex ? PDF_HexEncodeString(raw) : PDF_EncodeString(raw);
return archive->WriteString(content.AsStringView());
}
ByteString CPDF_String::EncodeString() const {
- return m_bHex ? PDF_HexEncodeString(m_String) : PDF_EncodeString(m_String);
+ return m_bHex ? PDF_HexEncodeString(m_String.AsStringView())
+ : PDF_EncodeString(m_String.AsStringView());
}
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index b9b3c94..9a5a8eb 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -10,7 +10,6 @@
#include <limits.h>
#include <algorithm>
-#include <sstream>
#include <utility>
#include <vector>
@@ -560,40 +559,40 @@
return result;
}
-ByteString PDF_EncodeString(const ByteString& src) {
- std::ostringstream result;
- int srclen = src.GetLength();
- result << '(';
- for (int i = 0; i < srclen; ++i) {
+ByteString PDF_EncodeString(ByteStringView src) {
+ ByteString result;
+ result.Reserve(src.GetLength() + 2);
+ result += '(';
+ for (size_t i = 0; i < src.GetLength(); ++i) {
uint8_t ch = src[i];
if (ch == 0x0a) {
- result << "\\n";
+ result += "\\n";
continue;
}
if (ch == 0x0d) {
- result << "\\r";
+ result += "\\r";
continue;
}
if (ch == ')' || ch == '\\' || ch == '(')
- result << '\\';
- result << static_cast<char>(ch);
+ result += '\\';
+ result += static_cast<char>(ch);
}
- result << ')';
- return ByteString(result);
+ result += ')';
+ return result;
}
-ByteString PDF_HexEncodeString(const ByteString& src) {
- std::ostringstream result;
- int srclen = src.GetLength();
- result << '<';
- for (int i = 0; i < srclen; ++i) {
+ByteString PDF_HexEncodeString(ByteStringView src) {
+ ByteString result;
+ result.Reserve(2 * src.GetLength() + 2);
+ result += '<';
+ for (size_t i = 0; i < src.GetLength(); ++i) {
char buf[2];
FXSYS_IntToTwoHexChars(src[i], buf);
- result << buf[0];
- result << buf[1];
+ result += buf[0];
+ result += buf[1];
}
- result << '>';
- return ByteString(result);
+ result += '>';
+ return result;
}
bool FlateEncode(pdfium::span<const uint8_t> src_span,
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.h b/core/fpdfapi/parser/fpdf_parser_decode.h
index de3c3f3..537456b 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.h
+++ b/core/fpdfapi/parser/fpdf_parser_decode.h
@@ -30,8 +30,8 @@
bool ValidateDecoderPipeline(const CPDF_Array* pDecoders);
-ByteString PDF_EncodeString(const ByteString& src);
-ByteString PDF_HexEncodeString(const ByteString& src);
+ByteString PDF_EncodeString(ByteStringView src);
+ByteString PDF_HexEncodeString(ByteStringView src);
WideString PDF_DecodeText(pdfium::span<const uint8_t> span);
ByteString PDF_EncodeText(const WideString& str);
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index cc800d2..276e3ef 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -75,10 +75,10 @@
return sWord;
}
-ByteString GetWordRenderString(const ByteString& strWords) {
- if (strWords.GetLength() > 0)
- return PDF_EncodeString(strWords) + " Tj\n";
- return ByteString();
+ByteString GetWordRenderString(ByteStringView strWords) {
+ if (strWords.IsEmpty())
+ return ByteString();
+ return PDF_EncodeString(strWords) + " Tj\n";
}
ByteString GetFontSetString(IPVT_FontMap* pFontMap,
@@ -111,7 +111,7 @@
if (bContinuous) {
if (place.LineCmp(oldplace) != 0) {
if (!sWords.IsEmpty()) {
- sLineStream << GetWordRenderString(sWords);
+ sLineStream << GetWordRenderString(sWords.AsStringView());
sEditStream << sLineStream.str();
sLineStream.str("");
sWords.clear();
@@ -136,7 +136,7 @@
if (pIterator->GetWord(word)) {
if (word.nFontIndex != nCurFontIndex) {
if (!sWords.IsEmpty()) {
- sLineStream << GetWordRenderString(sWords);
+ sLineStream << GetWordRenderString(sWords.AsStringView());
sWords.clear();
}
sLineStream << GetFontSetString(pFontMap, word.nFontIndex,
@@ -162,12 +162,13 @@
nCurFontIndex = word.nFontIndex;
}
sEditStream << GetWordRenderString(
- GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
+ GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord)
+ .AsStringView());
}
}
}
if (!sWords.IsEmpty()) {
- sLineStream << GetWordRenderString(sWords);
+ sLineStream << GetWordRenderString(sWords.AsStringView());
sEditStream << sLineStream.str();
}
return ByteString(sEditStream);
diff --git a/fpdfsdk/cpdfsdk_appstream.cpp b/fpdfsdk/cpdfsdk_appstream.cpp
index 37dfbc0..2dd0b27 100644
--- a/fpdfsdk/cpdfsdk_appstream.cpp
+++ b/fpdfsdk/cpdfsdk_appstream.cpp
@@ -580,10 +580,10 @@
return ByteString(sRet);
}
-ByteString GetWordRenderString(const ByteString& strWords) {
- if (strWords.GetLength() > 0)
- return PDF_EncodeString(strWords) + " " + kShowTextOperator + "\n";
- return ByteString();
+ByteString GetWordRenderString(ByteStringView strWords) {
+ if (strWords.IsEmpty())
+ return ByteString();
+ return PDF_EncodeString(strWords) + " " + kShowTextOperator + "\n";
}
ByteString GetEditAppStream(CPWL_EditImpl* pEdit,
@@ -605,7 +605,7 @@
if (bContinuous) {
if (place.LineCmp(oldplace) != 0) {
if (!sWords.IsEmpty()) {
- sEditStream << GetWordRenderString(sWords);
+ sEditStream << GetWordRenderString(sWords.AsStringView());
sWords.clear();
}
@@ -632,7 +632,7 @@
if (pIterator->GetWord(word)) {
if (word.nFontIndex != nCurFontIndex) {
if (!sWords.IsEmpty()) {
- sEditStream << GetWordRenderString(sWords);
+ sEditStream << GetWordRenderString(sWords.AsStringView());
sWords.clear();
}
sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex,
@@ -660,13 +660,14 @@
nCurFontIndex = word.nFontIndex;
}
sEditStream << GetWordRenderString(
- pEdit->GetPDFWordString(nCurFontIndex, word.Word, SubWord));
+ pEdit->GetPDFWordString(nCurFontIndex, word.Word, SubWord)
+ .AsStringView());
}
}
}
if (!sWords.IsEmpty())
- sEditStream << GetWordRenderString(sWords);
+ sEditStream << GetWordRenderString(sWords.AsStringView());
std::ostringstream sAppStream;
if (sEditStream.tellp() > 0) {
diff --git a/fpdfsdk/fpdf_attachment.cpp b/fpdfsdk/fpdf_attachment.cpp
index 4955b1d..d1fba0d 100644
--- a/fpdfsdk/fpdf_attachment.cpp
+++ b/fpdfsdk/fpdf_attachment.cpp
@@ -188,7 +188,8 @@
if (bsKey == kChecksumKey && !value.IsEmpty()) {
CPDF_String* stringValue = pParamsDict->GetObjectFor(bsKey)->AsString();
if (stringValue->IsHex()) {
- ByteString encoded = PDF_HexEncodeString(stringValue->GetString());
+ ByteString encoded =
+ PDF_HexEncodeString(stringValue->GetString().AsStringView());
value = pdfium::MakeRetain<CPDF_String>(nullptr, encoded, false)
->GetUnicodeText();
}