14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_streamparser.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <limits.h> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory> 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility> 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/cpdf_modulemgr.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_docpagedata.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_array.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_boolean.h" 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h" 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h" 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_name.h" 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_null.h" 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_number.h" 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_stream.h" 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_string.h" 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h" 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_utility.h" 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec.h" 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_ext.h" 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannconst uint32_t kMaxNestedParsingLevel = 512; 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint32_t kMaxWordBuffer = 256; 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst FX_STRSIZE kMaxStringLength = 32767; 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t DecodeAllScanlines(std::unique_ptr<CCodec_ScanlineDecoder> pDecoder, 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t*& dest_buf, 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t& dest_size) { 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pDecoder) 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_INVALID_OFFSET; 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ncomps = pDecoder->CountComps(); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int bpc = pDecoder->GetBPC(); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int width = pDecoder->GetWidth(); 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int height = pDecoder->GetHeight(); 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int pitch = (width * ncomps * bpc + 7) / 8; 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (height == 0 || pitch > (1 << 30) / height) 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FX_INVALID_OFFSET; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = FX_Alloc2D(uint8_t, pitch, height); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = pitch * height; // Safe since checked alloc returned. 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int row = 0; row < height; row++) { 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pLine = pDecoder->GetScanline(row); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pLine) 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(dest_buf + row * pitch, pLine, pitch); 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pDecoder->GetSrcOffset(); 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t PDF_DecodeInlineStream(const uint8_t* src_buf, 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t limit, 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int width, 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int height, 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString& decoder, 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pParam, 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t*& dest_buf, 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t& dest_size) { 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "CCITTFaxDecode" || decoder == "CCF") { 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CCodec_ScanlineDecoder> pDecoder = 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam); 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "ASCII85Decode" || decoder == "A85") 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return A85Decode(src_buf, limit, dest_buf, dest_size); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "ASCIIHexDecode" || decoder == "AHx") 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return HexDecode(src_buf, limit, dest_buf, dest_size); 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "FlateDecode" || decoder == "Fl") { 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FPDFAPI_FlateOrLZWDecode(false, src_buf, limit, pParam, dest_size, 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf, dest_size); 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "LZWDecode" || decoder == "LZW") { 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return FPDFAPI_FlateOrLZWDecode(true, src_buf, limit, pParam, 0, dest_buf, 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size); 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "DCTDecode" || decoder == "DCT") { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CCodec_ScanlineDecoder> pDecoder = 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src_buf, limit, width, height, 0, 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !pParam || pParam->GetIntegerFor("ColorTransform", 1)); 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return DecodeAllScanlines(std::move(pDecoder), dest_buf, dest_size); 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (decoder == "RunLengthDecode" || decoder == "RL") 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return RunLengthDecode(src_buf, limit, dest_buf, dest_size); 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = 0; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return (uint32_t)-1; 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamParser::CPDF_StreamParser(const uint8_t* pData, uint32_t dwSize) 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pBuf(pData), 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Size(dwSize), 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos(0), 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pPool(nullptr) {} 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamParser::CPDF_StreamParser( 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const uint8_t* pData, 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwSize, 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CFX_WeakPtr<CFX_ByteStringPool>& pPool) 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pBuf(pData), 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Size(dwSize), 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos(0), 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pPool(pPool) {} 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamParser::~CPDF_StreamParser() {} 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_Stream> CPDF_StreamParser::ReadInlineStream( 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Document* pDoc, 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Dictionary> pDict, 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pCSObj) { 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_Pos == m_Size) 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsWhitespace(m_pBuf[m_Pos])) 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos++; 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString Decoder; 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Dictionary* pParam = nullptr; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Object* pFilter = pDict->GetDirectObjectFor("Filter"); 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pFilter) { 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (CPDF_Array* pArray = pFilter->AsArray()) { 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Decoder = pArray->GetStringAt(0); 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_Array* pParams = pDict->GetArrayFor("DecodeParms"); 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pParams) 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pParam = pParams->GetDictAt(0); 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Decoder = pFilter->GetString(); 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pParam = pDict->GetDictFor("DecodeParms"); 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t width = pDict->GetIntegerFor("Width"); 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t height = pDict->GetIntegerFor("Height"); 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t OrigSize = 0; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pCSObj) { 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t bpc = pDict->GetIntegerFor("BitsPerComponent"); 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t nComponents = 1; 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj); 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pCS) { 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nComponents = pCS->CountComponents(); 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDoc->GetPageData()->ReleaseColorSpace(pCSObj); 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nComponents = 3; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t pitch = width; 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bpc && pitch > INT_MAX / bpc) 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pitch *= bpc; 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nComponents && pitch > INT_MAX / nComponents) 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pitch *= nComponents; 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pitch > INT_MAX - 7) 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pitch += 7; 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pitch /= 8; 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann OrigSize = pitch; 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (width > INT_MAX - 7) 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann OrigSize = ((width + 7) / 8); 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (height && OrigSize > INT_MAX / height) 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann OrigSize *= height; 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<uint8_t, FxFreeDeleter> pData; 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwStreamSize; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (Decoder.IsEmpty()) { 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (OrigSize > m_Size - m_Pos) 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann OrigSize = m_Size - m_Pos; 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pData.reset(FX_Alloc(uint8_t, OrigSize)); 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(pData.get(), m_pBuf + m_Pos, OrigSize); 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStreamSize = OrigSize; 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos += OrigSize; 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* pIgnore = nullptr; 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwDestSize = OrigSize; 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStreamSize = 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Decoder, pParam, pIgnore, dwDestSize); 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(pIgnore); 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (static_cast<int>(dwStreamSize) < 0) 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwSavePos = m_Pos; 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos += dwStreamSize; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dwPrevPos = m_Pos; 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_StreamParser::SyntaxType type = ParseNextElement(); 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (type == CPDF_StreamParser::EndOfData) 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (type != CPDF_StreamParser::Keyword) { 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStreamSize += m_Pos - dwPrevPos; 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 21233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (GetWord() == "EI") { 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos = dwPrevPos; 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dwStreamSize += m_Pos - dwPrevPos; 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos = dwSavePos; 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pData.reset(FX_Alloc(uint8_t, dwStreamSize)); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(pData.get(), m_pBuf + m_Pos, dwStreamSize); 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos += dwStreamSize; 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDict->SetNewFor<CPDF_Number>("Length", (int)dwStreamSize); 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Stream>(std::move(pData), dwStreamSize, 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::move(pDict)); 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement() { 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLastObj.reset(); 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordSize = 0; 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndOfData; 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ch = m_pBuf[m_Pos++]; 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (PDFCharIsWhitespace(ch)) { 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndOfData; 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '%') 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return EndOfData; 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsLineEnding(ch)) 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsDelimiter(ch) && ch != '/') { 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 25833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann m_pLastObj = ReadNextObject(false, false, 0); 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Others; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsNumber = true; 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize < kMaxWordBuffer) 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PDFCharIsNumeric(ch)) 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsNumber = false; 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize] = 0; 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsNumber) 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Number; 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordBuffer[0] == '/') 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Name; 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize == 4) { 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (memcmp(m_WordBuffer, "true", 4) == 0) { 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(true); 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Others; 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (memcmp(m_WordBuffer, "null", 4) == 0) { 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLastObj = pdfium::MakeUnique<CPDF_Null>(); 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Others; 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (m_WordSize == 5) { 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (memcmp(m_WordBuffer, "false", 5) == 0) { 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pLastObj = pdfium::MakeUnique<CPDF_Boolean>(false); 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Others; 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return Keyword; 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstd::unique_ptr<CPDF_Object> CPDF_StreamParser::ReadNextObject( 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bAllowNestedArray, 30833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann bool bInArray, 30933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann uint32_t dwRecursionLevel) { 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bIsNumber; 31133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Must get the next word before returning to avoid infinite loops. 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetNextWord(bIsNumber); 31333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if (!m_WordSize || dwRecursionLevel > kMaxNestedParsingLevel) 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bIsNumber) { 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize] = 0; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Number>( 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteStringC(m_WordBuffer, m_WordSize)); 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int first_char = m_WordBuffer[0]; 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (first_char == '/') { 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString name = 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Name>(m_pPool, name); 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (first_char == '(') { 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString str = ReadString(); 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_String>(m_pPool, str, false); 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (first_char == '<') { 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize == 1) 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_String>(m_pPool, ReadHexString(), true); 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pDict = pdfium::MakeUnique<CPDF_Dictionary>(m_pPool); 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetNextWord(bIsNumber); 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize == 2 && m_WordBuffer[0] == '>') 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_WordSize || m_WordBuffer[0] != '/') 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteString key = 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)); 34933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann std::unique_ptr<CPDF_Object> pObj = 35033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ReadNextObject(true, bInArray, dwRecursionLevel + 1); 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!pObj) 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!key.IsEmpty()) 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pDict->SetFor(key, std::move(pObj)); 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return std::move(pDict); 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (first_char == '[') { 36133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann if ((!bAllowNestedArray && bInArray)) 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann auto pArray = pdfium::MakeUnique<CPDF_Array>(); 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::unique_ptr<CPDF_Object> pObj = 36733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ReadNextObject(bAllowNestedArray, true, dwRecursionLevel + 1); 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pObj) { 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pArray->Add(std::move(pObj)); 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_WordSize || m_WordBuffer[0] == ']') 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return std::move(pArray); 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize == 5 && !memcmp(m_WordBuffer, "false", 5)) 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Boolean>(false); 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize == 4) { 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (memcmp(m_WordBuffer, "true", 4) == 0) 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Boolean>(true); 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (memcmp(m_WordBuffer, "null", 4) == 0) 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return pdfium::MakeUnique<CPDF_Null>(); 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return nullptr; 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// TODO(npm): the following methods are almost identical in cpdf_syntaxparser 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_StreamParser::GetNextWord(bool& bIsNumber) { 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordSize = 0; 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsNumber = true; 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ch = m_pBuf[m_Pos++]; 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (PDFCharIsWhitespace(ch)) { 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) { 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '%') 4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsLineEnding(ch)) 4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsDelimiter(ch)) { 4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsNumber = false; 4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '/') { 4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { 4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize < kMaxWordBuffer) 4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '<') { 4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '<') 4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '>') { 4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '>') 4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_WordSize < kMaxWordBuffer) 4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_WordBuffer[m_WordSize++] = ch; 4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PDFCharIsNumeric(ch)) 4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bIsNumber = false; 4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { 4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Pos--; 4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPDF_StreamParser::ReadString() { 4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t ch = m_pBuf[m_Pos++]; 4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteTextBuf buf; 4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int parlevel = 0; 4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int status = 0; 4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int iEscCode = 0; 4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann switch (status) { 4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 0: 4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == ')') { 4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (parlevel == 0) { 4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buf.GetLength() > kMaxStringLength) { 4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); 4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return buf.MakeString(); 4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parlevel--; 4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar(')'); 4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '(') { 4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann parlevel++; 4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('('); 4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '\\') { 4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 1; 4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar((char)ch); 4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 1: 5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= '0' && ch <= '7') { 5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEscCode = FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(ch)); 5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 2; 5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == 'n') { 5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('\n'); 5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == 'r') { 5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('\r'); 5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == 't') { 5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('\t'); 5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == 'b') { 5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('\b'); 5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == 'f') { 5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar('\f'); 5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '\r') { 5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 4; 5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (ch == '\n') { 5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar(ch); 5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 0; 5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 2: 5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= '0' && ch <= '7') { 5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEscCode = 5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEscCode * 8 + FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(ch)); 5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 3; 5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar(iEscCode); 5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 0; 5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 3: 5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch >= '0' && ch <= '7') { 5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEscCode = 5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iEscCode * 8 + FXSYS_toDecimalDigit(static_cast<FX_WCHAR>(ch)); 5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar(iEscCode); 5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 0; 5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar(iEscCode); 5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 0; 5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann case 4: 5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann status = 0; 5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch != '\n') { 5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ch = m_pBuf[m_Pos++]; 5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (PositionIsInBounds()) 5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++m_Pos; 5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buf.GetLength() > kMaxStringLength) { 5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); 5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return buf.MakeString(); 5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_ByteString CPDF_StreamParser::ReadHexString() { 5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!PositionIsInBounds()) 5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(); 5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_ByteTextBuf buf; 5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bFirst = true; 5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int code = 0; 5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (PositionIsInBounds()) { 5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ch = m_pBuf[m_Pos++]; 5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ch == '>') 5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!std::isxdigit(ch)) 5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int val = FXSYS_toHexDigit(ch); 5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bFirst) { 5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann code = val * 16; 5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann code += val; 5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendByte((uint8_t)code); 5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bFirst = !bFirst; 5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bFirst) 5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann buf.AppendChar((char)code); 5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (buf.GetLength() > kMaxStringLength) 5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return CFX_ByteString(buf.GetBuffer(), kMaxStringLength); 6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return buf.MakeString(); 6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_StreamParser::PositionIsInBounds() const { 6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_Pos < m_Size; 6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 607