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