From 3cfff70244e31f48068c32cbc4c070468f4c3e85 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Thu, 13 Apr 2017 13:41:24 -0700 Subject: Add ability to make StringCs from std::vector<>s. Pre-cursor to using more std::vector as byte buffers. The widestring test case is more complicated, where we're not sure of having any particular uint*_t type to match wchar_t. Change-Id: Ic27980f16cdbc61fac7c11f39a85eea58d19bacb Reviewed-on: https://pdfium-review.googlesource.com/4153 Reviewed-by: dsinclair Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fxcrt/cfx_bytestring_unittest.cpp | 13 +++++++++++++ core/fxcrt/cfx_string_c_template.h | 8 ++++++++ core/fxcrt/cfx_widestring_unittest.cpp | 14 ++++++++++++++ xfa/fxfa/fm2js/xfa_fm2jscontext.cpp | 6 +++--- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/core/fxcrt/cfx_bytestring_unittest.cpp b/core/fxcrt/cfx_bytestring_unittest.cpp index 3b679a086c..9cfc773fad 100644 --- a/core/fxcrt/cfx_bytestring_unittest.cpp +++ b/core/fxcrt/cfx_bytestring_unittest.cpp @@ -4,6 +4,8 @@ #include "core/fxcrt/cfx_bytestring.h" +#include + #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -773,6 +775,17 @@ TEST(fxcrt, ByteStringCFromChar) { EXPECT_NE(longer_string, lower_a_string_from_char); } +TEST(fxcrt, ByteStringCFromVector) { + std::vector null_vec; + CFX_ByteStringC null_string(null_vec); + EXPECT_EQ(0, null_string.GetLength()); + + std::vector lower_a_vec(10, static_cast('a')); + CFX_ByteStringC lower_a_string(lower_a_vec); + EXPECT_EQ(10, lower_a_string.GetLength()); + EXPECT_EQ("aaaaaaaaaa", lower_a_string); +} + TEST(fxcrt, ByteStringCGetID) { CFX_ByteStringC null_string; EXPECT_EQ(0u, null_string.GetID()); diff --git a/core/fxcrt/cfx_string_c_template.h b/core/fxcrt/cfx_string_c_template.h index b52817d790..4aba2cd4b9 100644 --- a/core/fxcrt/cfx_string_c_template.h +++ b/core/fxcrt/cfx_string_c_template.h @@ -9,8 +9,10 @@ #include #include +#include #include "core/fxcrt/fx_system.h" +#include "third_party/base/stl_util.h" // An immutable string with caller-provided storage which must outlive the // string itself. These are not necessarily nul-terminated, so that substring @@ -53,6 +55,12 @@ class CFX_StringCTemplate { m_Length = src.m_Length; } + // Any changes to |vec| invalidate the string. + explicit CFX_StringCTemplate(const std::vector& vec) { + m_Ptr = vec.data(); + m_Length = pdfium::CollectionSize(vec); + } + CFX_StringCTemplate& operator=(const CharType* src) { m_Ptr = reinterpret_cast(src); m_Length = src ? FXSYS_len(src) : 0; diff --git a/core/fxcrt/cfx_widestring_unittest.cpp b/core/fxcrt/cfx_widestring_unittest.cpp index dd44cb70af..498b4f0b6a 100644 --- a/core/fxcrt/cfx_widestring_unittest.cpp +++ b/core/fxcrt/cfx_widestring_unittest.cpp @@ -4,6 +4,8 @@ #include "core/fxcrt/cfx_widestring.h" +#include + #include "testing/fx_string_testhelpers.h" #include "testing/gtest/include/gtest/gtest.h" @@ -689,6 +691,18 @@ TEST(fxcrt, WideStringUTF16LE_Encode) { } } +TEST(fxcrt, WideStringCFromVector) { + std::vector null_vec; + CFX_WideStringC null_string(null_vec); + EXPECT_EQ(0, null_string.GetLength()); + + std::vector lower_a_vec( + 10, static_cast(L'a')); + CFX_WideStringC lower_a_string(lower_a_vec); + EXPECT_EQ(10, lower_a_string.GetLength()); + EXPECT_EQ(L"aaaaaaaaaa", lower_a_string); +} + TEST(fxcrt, WideStringCOperatorSubscript) { // CFX_WideStringC includes the NUL terminator for non-empty strings. CFX_WideStringC abc(L"abc"); diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp index 56a99157d3..ead2a7dbe3 100644 --- a/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp +++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.cpp @@ -4642,9 +4642,9 @@ void CXFA_FM2JSContext::Get(CFXJSE_Value* pThis, return; int32_t size = pFile->GetSize(); - std::vector pData(size); - pFile->ReadBlock(pData.data(), size); - args.GetReturnValue()->SetString(CFX_ByteStringC(pData.data(), size)); + std::vector dataBuf(size); + pFile->ReadBlock(dataBuf.data(), size); + args.GetReturnValue()->SetString(CFX_ByteStringC(dataBuf)); } // static -- cgit v1.2.3