1 // Copyright 2016 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "core/fpdfapi/parser/cpdf_number.h" 8 9 #include <sstream> 10 11 #include "core/fpdfapi/edit/cpdf_contentstream_write_utils.h" 12 #include "core/fxcrt/fx_stream.h" 13 #include "core/fxcrt/fx_string_wrappers.h" 14 15 namespace { 16 FloatToString(float value)17ByteString FloatToString(float value) { 18 fxcrt::ostringstream sstream; 19 WriteFloat(sstream, value); 20 return ByteString(sstream); 21 } 22 23 } // namespace 24 25 CPDF_Number::CPDF_Number() = default; 26 CPDF_Number(int value)27CPDF_Number::CPDF_Number(int value) : number_(value) {} 28 CPDF_Number(float value)29CPDF_Number::CPDF_Number(float value) : number_(value) {} 30 CPDF_Number(ByteStringView str)31CPDF_Number::CPDF_Number(ByteStringView str) : number_(str) {} 32 33 CPDF_Number::~CPDF_Number() = default; 34 GetType() const35CPDF_Object::Type CPDF_Number::GetType() const { 36 return kNumber; 37 } 38 Clone() const39RetainPtr<CPDF_Object> CPDF_Number::Clone() const { 40 return number_.IsInteger() 41 ? pdfium::MakeRetain<CPDF_Number>(number_.GetSigned()) 42 : pdfium::MakeRetain<CPDF_Number>(number_.GetFloat()); 43 } 44 GetNumber() const45float CPDF_Number::GetNumber() const { 46 return number_.GetFloat(); 47 } 48 GetInteger() const49int CPDF_Number::GetInteger() const { 50 return number_.GetSigned(); 51 } 52 AsMutableNumber()53CPDF_Number* CPDF_Number::AsMutableNumber() { 54 return this; 55 } 56 SetString(const ByteString & str)57void CPDF_Number::SetString(const ByteString& str) { 58 number_ = FX_Number(str.AsStringView()); 59 } 60 GetString() const61ByteString CPDF_Number::GetString() const { 62 return number_.IsInteger() ? ByteString::FormatInteger(number_.GetSigned()) 63 : FloatToString(GetNumber()); 64 } 65 WriteTo(IFX_ArchiveStream * archive,const CPDF_Encryptor * encryptor) const66bool CPDF_Number::WriteTo(IFX_ArchiveStream* archive, 67 const CPDF_Encryptor* encryptor) const { 68 return archive->WriteString(" ") && 69 archive->WriteString(GetString().AsStringView()); 70 } 71