From 746c28772e01675096800d8853aae33f94ed3d55 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Fri, 7 Apr 2017 16:35:13 -0700 Subject: Create initializer-list ctor for strings. Also use safe arithmetic for two-arg ctor. Change-Id: I5d541d9b2d5fe5b939f4cc8c22cf034f5cb01176 Reviewed-on: https://pdfium-review.googlesource.com/3955 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fxcrt/cfx_bytestring.cpp | 25 ++++++++++++++++++++++++- core/fxcrt/cfx_bytestring.h | 2 ++ core/fxcrt/cfx_bytestring_unittest.cpp | 7 +++++++ core/fxcrt/cfx_widestring.cpp | 25 ++++++++++++++++++++++++- core/fxcrt/cfx_widestring.h | 2 ++ core/fxcrt/cfx_widestring_unittest.cpp | 7 +++++++ 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/core/fxcrt/cfx_bytestring.cpp b/core/fxcrt/cfx_bytestring.cpp index cca8ad6be4..ab35e5d0c5 100644 --- a/core/fxcrt/cfx_bytestring.cpp +++ b/core/fxcrt/cfx_bytestring.cpp @@ -13,6 +13,7 @@ #include "core/fxcrt/cfx_string_pool_template.h" #include "core/fxcrt/fx_basic.h" +#include "core/fxcrt/fx_safe_types.h" #include "third_party/base/numerics/safe_math.h" #include "third_party/base/stl_util.h" @@ -124,7 +125,10 @@ CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& stringSrc) { CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& str1, const CFX_ByteStringC& str2) { - int nNewLen = str1.GetLength() + str2.GetLength(); + FX_SAFE_STRSIZE nSafeLen = str1.GetLength(); + nSafeLen += str2.GetLength(); + + FX_STRSIZE nNewLen = nSafeLen.ValueOrDie(); if (nNewLen == 0) return; @@ -133,6 +137,25 @@ CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& str1, m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength()); } +CFX_ByteString::CFX_ByteString( + const std::initializer_list& list) { + FX_SAFE_STRSIZE nSafeLen = 0; + for (const auto& item : list) + nSafeLen += item.GetLength(); + + FX_STRSIZE nNewLen = nSafeLen.ValueOrDie(); + if (nNewLen == 0) + return; + + m_pData.Reset(StringData::Create(nNewLen)); + + FX_STRSIZE nOffset = 0; + for (const auto& item : list) { + m_pData->CopyContentsAt(nOffset, item.c_str(), item.GetLength()); + nOffset += item.GetLength(); + } +} + CFX_ByteString::~CFX_ByteString() {} const CFX_ByteString& CFX_ByteString::operator=(const char* pStr) { diff --git a/core/fxcrt/cfx_bytestring.h b/core/fxcrt/cfx_bytestring.h index 9596fc5eee..b9ebd8a83c 100644 --- a/core/fxcrt/cfx_bytestring.h +++ b/core/fxcrt/cfx_bytestring.h @@ -8,6 +8,7 @@ #define CORE_FXCRT_CFX_BYTESTRING_H_ #include +#include #include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/cfx_string_c_template.h" @@ -38,6 +39,7 @@ class CFX_ByteString { explicit CFX_ByteString(const CFX_ByteStringC& bstrc); CFX_ByteString(const CFX_ByteStringC& bstrc1, const CFX_ByteStringC& bstrc2); + CFX_ByteString(const std::initializer_list& list); ~CFX_ByteString(); diff --git a/core/fxcrt/cfx_bytestring_unittest.cpp b/core/fxcrt/cfx_bytestring_unittest.cpp index 4f2691c404..3b679a086c 100644 --- a/core/fxcrt/cfx_bytestring_unittest.cpp +++ b/core/fxcrt/cfx_bytestring_unittest.cpp @@ -1089,3 +1089,10 @@ TEST(fxcrt, EmptyByteString) { const char* cstr = empty_str.c_str(); EXPECT_EQ(0, FXSYS_strlen(cstr)); } + +TEST(fxcrt, ByteStringInitializerList) { + CFX_ByteString many_str({"clams", " and ", "oysters"}); + EXPECT_EQ("clams and oysters", many_str); + many_str = {"fish", " and ", "chips", " and ", "soda"}; + EXPECT_EQ("fish and chips and soda", many_str); +} diff --git a/core/fxcrt/cfx_widestring.cpp b/core/fxcrt/cfx_widestring.cpp index eb6bc66e73..c9a89fe112 100644 --- a/core/fxcrt/cfx_widestring.cpp +++ b/core/fxcrt/cfx_widestring.cpp @@ -14,6 +14,7 @@ #include "core/fxcrt/cfx_string_pool_template.h" #include "core/fxcrt/fx_basic.h" #include "core/fxcrt/fx_ext.h" +#include "core/fxcrt/fx_safe_types.h" #include "third_party/base/numerics/safe_math.h" #include "third_party/base/stl_util.h" @@ -296,7 +297,10 @@ CFX_WideString::CFX_WideString(const CFX_WideStringC& stringSrc) { CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2) { - int nNewLen = str1.GetLength() + str2.GetLength(); + FX_SAFE_STRSIZE nSafeLen = str1.GetLength(); + nSafeLen += str2.GetLength(); + + FX_STRSIZE nNewLen = nSafeLen.ValueOrDie(); if (nNewLen == 0) return; @@ -305,6 +309,25 @@ CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength()); } +CFX_WideString::CFX_WideString( + const std::initializer_list& list) { + FX_SAFE_STRSIZE nSafeLen = 0; + for (const auto& item : list) + nSafeLen += item.GetLength(); + + FX_STRSIZE nNewLen = nSafeLen.ValueOrDie(); + if (nNewLen == 0) + return; + + m_pData.Reset(StringData::Create(nNewLen)); + + FX_STRSIZE nOffset = 0; + for (const auto& item : list) { + m_pData->CopyContentsAt(nOffset, item.c_str(), item.GetLength()); + nOffset += item.GetLength(); + } +} + CFX_WideString::~CFX_WideString() {} const CFX_WideString& CFX_WideString::operator=(const wchar_t* pStr) { diff --git a/core/fxcrt/cfx_widestring.h b/core/fxcrt/cfx_widestring.h index 397a5dcee2..52cd65a2b7 100644 --- a/core/fxcrt/cfx_widestring.h +++ b/core/fxcrt/cfx_widestring.h @@ -8,6 +8,7 @@ #define CORE_FXCRT_CFX_WIDESTRING_H_ #include +#include #include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/cfx_string_c_template.h" @@ -37,6 +38,7 @@ class CFX_WideString { explicit CFX_WideString(const CFX_WideStringC& str); CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2); + CFX_WideString(const std::initializer_list& list); ~CFX_WideString(); diff --git a/core/fxcrt/cfx_widestring_unittest.cpp b/core/fxcrt/cfx_widestring_unittest.cpp index a0523b1804..dd44cb70af 100644 --- a/core/fxcrt/cfx_widestring_unittest.cpp +++ b/core/fxcrt/cfx_widestring_unittest.cpp @@ -945,3 +945,10 @@ TEST(fxcrt, EmptyWideString) { const wchar_t* cstr = empty_str.c_str(); EXPECT_EQ(0, FXSYS_wcslen(cstr)); } + +TEST(fxcrt, WidStringInitializerList) { + CFX_WideString many_str({L"clams", L" and ", L"oysters"}); + EXPECT_EQ(L"clams and oysters", many_str); + many_str = {L"fish", L" and ", L"chips", L" and ", L"soda"}; + EXPECT_EQ(L"fish and chips and soda", many_str); +} -- cgit v1.2.3