| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #ifndef CORE_FXCRT_INCLUDE_FX_STRING_H_ | 7 #ifndef CORE_FXCRT_INCLUDE_FX_STRING_H_ |
| 8 #define CORE_FXCRT_INCLUDE_FX_STRING_H_ | 8 #define CORE_FXCRT_INCLUDE_FX_STRING_H_ |
| 9 | 9 |
| 10 #include <stdint.h> // For intptr_t. | 10 #include <stdint.h> // For intptr_t. |
| 11 #include <algorithm> | 11 #include <algorithm> |
| 12 | 12 |
| 13 #include "core/fxcrt/cfx_string_data_template.h" |
| 13 #include "core/fxcrt/include/cfx_retain_ptr.h" | 14 #include "core/fxcrt/include/cfx_retain_ptr.h" |
| 14 #include "core/fxcrt/include/fx_memory.h" | 15 #include "core/fxcrt/include/fx_memory.h" |
| 15 #include "core/fxcrt/include/fx_system.h" | 16 #include "core/fxcrt/include/fx_system.h" |
| 16 | 17 |
| 17 class CFX_BinaryBuf; | 18 class CFX_BinaryBuf; |
| 18 class CFX_ByteString; | 19 class CFX_ByteString; |
| 19 class CFX_WideString; | 20 class CFX_WideString; |
| 20 | 21 |
| 21 // An immutable string with caller-provided storage which must outlive the | 22 // An immutable string with caller-provided storage which must outlive the |
| 22 // string itself. | 23 // string itself. |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 uint32_t GetID(FX_STRSIZE start_pos = 0) const; | 276 uint32_t GetID(FX_STRSIZE start_pos = 0) const; |
| 276 | 277 |
| 277 #define FXFORMAT_SIGNED 1 | 278 #define FXFORMAT_SIGNED 1 |
| 278 #define FXFORMAT_HEX 2 | 279 #define FXFORMAT_HEX 2 |
| 279 #define FXFORMAT_CAPITAL 4 | 280 #define FXFORMAT_CAPITAL 4 |
| 280 | 281 |
| 281 static CFX_ByteString FormatInteger(int i, uint32_t flags = 0); | 282 static CFX_ByteString FormatInteger(int i, uint32_t flags = 0); |
| 282 static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0); | 283 static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0); |
| 283 | 284 |
| 284 protected: | 285 protected: |
| 285 class StringData { | 286 using StringData = CFX_StringDataTemplate<FX_CHAR>; |
| 286 public: | |
| 287 static StringData* Create(FX_STRSIZE nLen); | |
| 288 static StringData* Create(const StringData& other); | |
| 289 static StringData* Create(const FX_CHAR* pStr, FX_STRSIZE nLen); | |
| 290 | |
| 291 void Retain() { ++m_nRefs; } | |
| 292 void Release() { | |
| 293 if (--m_nRefs <= 0) | |
| 294 FX_Free(this); | |
| 295 } | |
| 296 | |
| 297 bool CanOperateInPlace(FX_STRSIZE nTotalLen) const { | |
| 298 return m_nRefs <= 1 && nTotalLen <= m_nAllocLength; | |
| 299 } | |
| 300 | |
| 301 void CopyContents(const StringData& other); | |
| 302 void CopyContents(const FX_CHAR* pStr, FX_STRSIZE nLen); | |
| 303 void CopyContentsAt(FX_STRSIZE offset, | |
| 304 const FX_CHAR* pStr, | |
| 305 FX_STRSIZE nLen); | |
| 306 | |
| 307 // To ensure ref counts do not overflow, consider the worst possible case: | |
| 308 // the entire address space contains nothing but pointers to this object. | |
| 309 // Since the count increments with each new pointer, the largest value is | |
| 310 // the number of pointers that can fit into the address space. The size of | |
| 311 // the address space itself is a good upper bound on it. | |
| 312 intptr_t m_nRefs; // Would prefer ssize_t, but no windows support. | |
| 313 | |
| 314 // |FX_STRSIZE| is currently typedef'd as |int|. | |
| 315 // TODO(palmer): It should be a |size_t|, or at least unsigned. | |
| 316 // These lengths do not include the terminating NUL, but the underlying | |
| 317 // buffer is sized to be capable of holding it. | |
| 318 FX_STRSIZE m_nDataLength; | |
| 319 FX_STRSIZE m_nAllocLength; | |
| 320 | |
| 321 // Not really 1, variable size. | |
| 322 FX_CHAR m_String[1]; | |
| 323 | |
| 324 private: | |
| 325 StringData(FX_STRSIZE dataLen, FX_STRSIZE allocLen); | |
| 326 ~StringData() = delete; | |
| 327 }; | |
| 328 | 287 |
| 329 void ReallocBeforeWrite(FX_STRSIZE nNewLen); | 288 void ReallocBeforeWrite(FX_STRSIZE nNewLen); |
| 330 void AllocBeforeWrite(FX_STRSIZE nNewLen); | 289 void AllocBeforeWrite(FX_STRSIZE nNewLen); |
| 331 void AllocCopy(CFX_ByteString& dest, | 290 void AllocCopy(CFX_ByteString& dest, |
| 332 FX_STRSIZE nCopyLen, | 291 FX_STRSIZE nCopyLen, |
| 333 FX_STRSIZE nCopyIndex) const; | 292 FX_STRSIZE nCopyIndex) const; |
| 334 void AssignCopy(const FX_CHAR* pSrcData, FX_STRSIZE nSrcLen); | 293 void AssignCopy(const FX_CHAR* pSrcData, FX_STRSIZE nSrcLen); |
| 335 void Concat(const FX_CHAR* lpszSrcData, FX_STRSIZE nSrcLen); | 294 void Concat(const FX_CHAR* lpszSrcData, FX_STRSIZE nSrcLen); |
| 336 | 295 |
| 337 CFX_RetainPtr<StringData> m_pData; | 296 CFX_RetainPtr<StringData> m_pData; |
| (...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 } | 722 } |
| 764 | 723 |
| 765 FX_FLOAT FX_atof(const CFX_ByteStringC& str); | 724 FX_FLOAT FX_atof(const CFX_ByteStringC& str); |
| 766 inline FX_FLOAT FX_atof(const CFX_WideStringC& wsStr) { | 725 inline FX_FLOAT FX_atof(const CFX_WideStringC& wsStr) { |
| 767 return FX_atof(FX_UTF8Encode(wsStr.raw_str(), wsStr.GetLength()).c_str()); | 726 return FX_atof(FX_UTF8Encode(wsStr.raw_str(), wsStr.GetLength()).c_str()); |
| 768 } | 727 } |
| 769 void FX_atonum(const CFX_ByteStringC& str, FX_BOOL& bInteger, void* pData); | 728 void FX_atonum(const CFX_ByteStringC& str, FX_BOOL& bInteger, void* pData); |
| 770 FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_CHAR* buf); | 729 FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_CHAR* buf); |
| 771 | 730 |
| 772 #endif // CORE_FXCRT_INCLUDE_FX_STRING_H_ | 731 #endif // CORE_FXCRT_INCLUDE_FX_STRING_H_ |
| OLD | NEW |