Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 1576113003: Use std::map in CPDF_IndirectObjects (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Do work Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/include/fpdfapi/fpdf_parser.h" 7 #include "core/include/fpdfapi/fpdf_parser.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; 1192 FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
1193 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1193 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1194 m_Syntax.RestorePos(pos); 1194 m_Syntax.RestorePos(pos);
1195 const char kFormStream[] = "/Form\0stream"; 1195 const char kFormStream[] = "/Form\0stream";
1196 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1); 1196 const CFX_ByteStringC kFormStreamStr(kFormStream, sizeof(kFormStream) - 1);
1197 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0; 1197 bForm = m_Syntax.SearchMultiWord(kFormStreamStr, TRUE, size) == 0;
1198 m_Syntax.RestorePos(SavedPos); 1198 m_Syntax.RestorePos(SavedPos);
1199 return TRUE; 1199 return TRUE;
1200 } 1200 }
1201 1201
1202 CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, 1202 CPDF_Object* CPDF_Parser::ParseIndirectObject(
1203 FX_DWORD objnum, 1203 CPDF_IndirectObjectHolder* pObjList,
1204 PARSE_CONTEXT* pContext) { 1204 FX_DWORD objnum,
1205 PARSE_CONTEXT* pContext) {
1205 if (!IsValidObjectNumber(objnum)) 1206 if (!IsValidObjectNumber(objnum))
1206 return nullptr; 1207 return nullptr;
1207 1208
1208 // Prevent circular parsing the same object. 1209 // Prevent circular parsing the same object.
1209 if (pdfium::ContainsKey(m_ParsingObjNums, objnum)) 1210 if (pdfium::ContainsKey(m_ParsingObjNums, objnum))
1210 return nullptr; 1211 return nullptr;
1211 ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum); 1212 ScopedSetInsertion<FX_DWORD> local_insert(&m_ParsingObjNums, objnum);
1212 1213
1213 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) { 1214 if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
1214 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1215 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 } 1391 }
1391 nextoff = m_Syntax.SavePos(); 1392 nextoff = m_Syntax.SavePos();
1392 } 1393 }
1393 size = (FX_DWORD)(nextoff - pos); 1394 size = (FX_DWORD)(nextoff - pos);
1394 pBuffer = FX_Alloc(uint8_t, size); 1395 pBuffer = FX_Alloc(uint8_t, size);
1395 m_Syntax.RestorePos(pos); 1396 m_Syntax.RestorePos(pos);
1396 m_Syntax.ReadBlock(pBuffer, size); 1397 m_Syntax.ReadBlock(pBuffer, size);
1397 m_Syntax.RestorePos(SavedPos); 1398 m_Syntax.RestorePos(SavedPos);
1398 } 1399 }
1399 1400
1400 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, 1401 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(
1401 FX_FILESIZE pos, 1402 CPDF_IndirectObjectHolder* pObjList,
1402 FX_DWORD objnum, 1403 FX_FILESIZE pos,
1403 PARSE_CONTEXT* pContext) { 1404 FX_DWORD objnum,
1405 PARSE_CONTEXT* pContext) {
1404 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1406 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1405 m_Syntax.RestorePos(pos); 1407 m_Syntax.RestorePos(pos);
1406 bool bIsNumber; 1408 bool bIsNumber;
1407 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1409 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1408 if (!bIsNumber) { 1410 if (!bIsNumber) {
1409 m_Syntax.RestorePos(SavedPos); 1411 m_Syntax.RestorePos(SavedPos);
1410 return NULL; 1412 return NULL;
1411 } 1413 }
1412 FX_FILESIZE objOffset = m_Syntax.SavePos(); 1414 FX_FILESIZE objOffset = m_Syntax.SavePos();
1413 objOffset -= word.GetLength(); 1415 objOffset -= word.GetLength();
(...skipping 21 matching lines...) Expand all
1435 } 1437 }
1436 m_Syntax.RestorePos(SavedPos); 1438 m_Syntax.RestorePos(SavedPos);
1437 if (pObj) { 1439 if (pObj) {
1438 if (!objnum) 1440 if (!objnum)
1439 pObj->m_ObjNum = parser_objnum; 1441 pObj->m_ObjNum = parser_objnum;
1440 pObj->m_GenNum = parser_gennum; 1442 pObj->m_GenNum = parser_gennum;
1441 } 1443 }
1442 return pObj; 1444 return pObj;
1443 } 1445 }
1444 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( 1446 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(
1445 CPDF_IndirectObjects* pObjList, 1447 CPDF_IndirectObjectHolder* pObjList,
1446 FX_FILESIZE pos, 1448 FX_FILESIZE pos,
1447 FX_DWORD objnum, 1449 FX_DWORD objnum,
1448 PARSE_CONTEXT* pContext, 1450 PARSE_CONTEXT* pContext,
1449 FX_FILESIZE* pResultPos) { 1451 FX_FILESIZE* pResultPos) {
1450 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1452 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1451 m_Syntax.RestorePos(pos); 1453 m_Syntax.RestorePos(pos);
1452 bool bIsNumber; 1454 bool bIsNumber;
1453 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber); 1455 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1454 if (!bIsNumber) { 1456 if (!bIsNumber) {
1455 m_Syntax.RestorePos(SavedPos); 1457 m_Syntax.RestorePos(SavedPos);
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
2034 2036
2035 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) { 2037 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) {
2036 GetNextWordInternal(bIsNumber); 2038 GetNextWordInternal(bIsNumber);
2037 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); 2039 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
2038 } 2040 }
2039 2041
2040 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { 2042 CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
2041 return GetNextWord(nullptr); 2043 return GetNextWord(nullptr);
2042 } 2044 }
2043 2045
2044 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, 2046 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList,
2045 FX_DWORD objnum, 2047 FX_DWORD objnum,
2046 FX_DWORD gennum, 2048 FX_DWORD gennum,
2047 PARSE_CONTEXT* pContext, 2049 PARSE_CONTEXT* pContext,
2048 FX_BOOL bDecrypt) { 2050 FX_BOOL bDecrypt) {
2049 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2051 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2050 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2052 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2051 return NULL; 2053 return NULL;
2052 } 2054 }
2053 FX_FILESIZE SavedPos = m_Pos; 2055 FX_FILESIZE SavedPos = m_Pos;
2054 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2056 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 m_Pos = SavedPos; 2191 m_Pos = SavedPos;
2190 return nullptr; 2192 return nullptr;
2191 } 2193 }
2192 if (bTypeOnly) 2194 if (bTypeOnly)
2193 return (CPDF_Object*)PDFOBJ_INVALID; 2195 return (CPDF_Object*)PDFOBJ_INVALID;
2194 2196
2195 return nullptr; 2197 return nullptr;
2196 } 2198 }
2197 2199
2198 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( 2200 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(
2199 CPDF_IndirectObjects* pObjList, 2201 CPDF_IndirectObjectHolder* pObjList,
2200 FX_DWORD objnum, 2202 FX_DWORD objnum,
2201 FX_DWORD gennum, 2203 FX_DWORD gennum,
2202 PARSE_CONTEXT* pContext) { 2204 PARSE_CONTEXT* pContext) {
2203 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2205 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2204 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2206 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2205 return NULL; 2207 return NULL;
2206 } 2208 }
2207 FX_FILESIZE SavedPos = m_Pos; 2209 FX_FILESIZE SavedPos = m_Pos;
2208 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2210 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2209 bool bIsNumber; 2211 bool bIsNumber;
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
2753 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints); 2755 FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints);
2754 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints); 2756 FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints);
2755 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints* pHints); 2757 FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints* pHints);
2756 2758
2757 int32_t CheckCrossRefStream(IFX_DownloadHints* pHints, 2759 int32_t CheckCrossRefStream(IFX_DownloadHints* pHints,
2758 FX_FILESIZE& xref_offset); 2760 FX_FILESIZE& xref_offset);
2759 FX_BOOL IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen); 2761 FX_BOOL IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen);
2760 void SetStartOffset(FX_FILESIZE dwOffset); 2762 void SetStartOffset(FX_FILESIZE dwOffset);
2761 FX_BOOL GetNextToken(CFX_ByteString& token); 2763 FX_BOOL GetNextToken(CFX_ByteString& token);
2762 FX_BOOL GetNextChar(uint8_t& ch); 2764 FX_BOOL GetNextChar(uint8_t& ch);
2763 CPDF_Object* ParseIndirectObjectAt(FX_FILESIZE pos, 2765 CPDF_Object* ParseIndirectObjectAt(
2764 FX_DWORD objnum, 2766 FX_FILESIZE pos,
2765 CPDF_IndirectObjects* pObjList = NULL); 2767 FX_DWORD objnum,
2768 CPDF_IndirectObjectHolder* pObjList = NULL);
2766 CPDF_Object* GetObject(FX_DWORD objnum, 2769 CPDF_Object* GetObject(FX_DWORD objnum,
2767 IFX_DownloadHints* pHints, 2770 IFX_DownloadHints* pHints,
2768 FX_BOOL* pExistInFile); 2771 FX_BOOL* pExistInFile);
2769 FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages); 2772 FX_BOOL GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages);
2770 FX_BOOL PreparePageItem(); 2773 FX_BOOL PreparePageItem();
2771 FX_BOOL LoadPages(IFX_DownloadHints* pHints); 2774 FX_BOOL LoadPages(IFX_DownloadHints* pHints);
2772 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints); 2775 FX_BOOL LoadAllXref(IFX_DownloadHints* pHints);
2773 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints); 2776 FX_BOOL LoadAllFile(IFX_DownloadHints* pHints);
2774 int32_t CheckLinearizedData(IFX_DownloadHints* pHints); 2777 int32_t CheckLinearizedData(IFX_DownloadHints* pHints);
2775 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints); 2778 FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
3625 CPDF_Stream* pStream = ToStream(pHintStream.get()); 3628 CPDF_Stream* pStream = ToStream(pHintStream.get());
3626 if (pStream && pHintTables->LoadHintStream(pStream)) 3629 if (pStream && pHintTables->LoadHintStream(pStream))
3627 m_pHintTables = std::move(pHintTables); 3630 m_pHintTables = std::move(pHintTables);
3628 3631
3629 m_docStatus = PDF_DATAAVAIL_DONE; 3632 m_docStatus = PDF_DATAAVAIL_DONE;
3630 return TRUE; 3633 return TRUE;
3631 } 3634 }
3632 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( 3635 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt(
3633 FX_FILESIZE pos, 3636 FX_FILESIZE pos,
3634 FX_DWORD objnum, 3637 FX_DWORD objnum,
3635 CPDF_IndirectObjects* pObjList) { 3638 CPDF_IndirectObjectHolder* pObjList) {
3636 FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3639 FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3637 m_syntaxParser.RestorePos(pos); 3640 m_syntaxParser.RestorePos(pos);
3638 bool bIsNumber; 3641 bool bIsNumber;
3639 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber); 3642 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber);
3640 if (!bIsNumber) 3643 if (!bIsNumber)
3641 return nullptr; 3644 return nullptr;
3642 3645
3643 FX_DWORD parser_objnum = FXSYS_atoi(word); 3646 FX_DWORD parser_objnum = FXSYS_atoi(word);
3644 if (objnum && parser_objnum != objnum) 3647 if (objnum && parser_objnum != objnum)
3645 return nullptr; 3648 return nullptr;
(...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after
4981 if (!m_pLinearizedDict) 4984 if (!m_pLinearizedDict)
4982 return -1; 4985 return -1;
4983 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4986 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
4984 if (!pRange) 4987 if (!pRange)
4985 return -1; 4988 return -1;
4986 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4989 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
4987 if (!pStreamLen) 4990 if (!pStreamLen)
4988 return -1; 4991 return -1;
4989 return pStreamLen->GetInteger(); 4992 return pStreamLen->GetInteger();
4990 } 4993 }
OLDNEW
« core/include/fpdfapi/fpdf_objects.h ('K') | « core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698