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

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

Issue 1561093002: Merge to XFA: Change CPDF_SyntaxParser::GetNextWord() to not pass by non-const ref. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: 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
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "parser_int.h" 7 #include "parser_int.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 FX_BOOL bXRefRebuilt = FALSE; 209 FX_BOOL bXRefRebuilt = FALSE;
210 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { 210 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) {
211 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); 211 FX_FILESIZE startxref_offset = m_Syntax.SavePos();
212 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), 212 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
213 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 213 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
214 CompareFileSize); 214 CompareFileSize);
215 if (!pResult) 215 if (!pResult)
216 m_SortedOffset.Add(startxref_offset); 216 m_SortedOffset.Add(startxref_offset);
217 217
218 m_Syntax.GetKeyword(); 218 m_Syntax.GetKeyword();
219 FX_BOOL bNumber; 219 bool bNumber;
220 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); 220 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber);
221 if (!bNumber) 221 if (!bNumber)
222 return PDFPARSE_ERROR_FORMAT; 222 return PDFPARSE_ERROR_FORMAT;
223 223
224 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 224 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
225 if (!LoadAllCrossRefV4(m_LastXRefOffset) && 225 if (!LoadAllCrossRefV4(m_LastXRefOffset) &&
226 !LoadAllCrossRefV5(m_LastXRefOffset)) { 226 !LoadAllCrossRefV5(m_LastXRefOffset)) {
227 if (!RebuildCrossRef()) 227 if (!RebuildCrossRef())
228 return PDFPARSE_ERROR_FORMAT; 228 return PDFPARSE_ERROR_FORMAT;
229 229
230 bXRefRebuilt = TRUE; 230 bXRefRebuilt = TRUE;
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 return false; 516 return false;
517 517
518 if (!FindPosInOffsets(pos)) 518 if (!FindPosInOffsets(pos))
519 m_SortedOffset.Add(pos); 519 m_SortedOffset.Add(pos);
520 520
521 if (streampos && !FindPosInOffsets(streampos)) 521 if (streampos && !FindPosInOffsets(streampos))
522 m_SortedOffset.Add(streampos); 522 m_SortedOffset.Add(streampos);
523 523
524 while (1) { 524 while (1) {
525 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 525 FX_FILESIZE SavedPos = m_Syntax.SavePos();
526 FX_BOOL bIsNumber; 526 bool bIsNumber;
527 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 527 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
528 if (word.IsEmpty()) 528 if (word.IsEmpty())
529 return false; 529 return false;
530 530
531 if (!bIsNumber) { 531 if (!bIsNumber) {
532 m_Syntax.RestorePos(SavedPos); 532 m_Syntax.RestorePos(SavedPos);
533 break; 533 break;
534 } 534 }
535 FX_DWORD start_objnum = FXSYS_atoi(word); 535 FX_DWORD start_objnum = FXSYS_atoi(word);
536 if (start_objnum >= kMaxObjectNumber) 536 if (start_objnum >= kMaxObjectNumber)
537 return false; 537 return false;
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 } else { 874 } else {
875 if (pObj->IsStream()) { 875 if (pObj->IsStream()) {
876 m_pTrailer = ToDictionary(pTrailer->Clone()); 876 m_pTrailer = ToDictionary(pTrailer->Clone());
877 pObj->Release(); 877 pObj->Release();
878 } else { 878 } else {
879 m_pTrailer = pTrailer; 879 m_pTrailer = pTrailer;
880 } 880 }
881 FX_FILESIZE dwSavePos = m_Syntax.SavePos(); 881 FX_FILESIZE dwSavePos = m_Syntax.SavePos();
882 CFX_ByteString strWord = m_Syntax.GetKeyword(); 882 CFX_ByteString strWord = m_Syntax.GetKeyword();
883 if (!strWord.Compare("startxref")) { 883 if (!strWord.Compare("startxref")) {
884 FX_BOOL bNumber = FALSE; 884 bool bNumber;
885 CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber); 885 CFX_ByteString bsOffset =
886 m_Syntax.GetNextWord(&bNumber);
886 if (bNumber) { 887 if (bNumber) {
887 m_LastXRefOffset = FXSYS_atoi(bsOffset); 888 m_LastXRefOffset = FXSYS_atoi(bsOffset);
888 } 889 }
889 } 890 }
890 m_Syntax.RestorePos(dwSavePos); 891 m_Syntax.RestorePos(dwSavePos);
891 } 892 }
892 } else { 893 } else {
893 pObj->Release(); 894 pObj->Release();
894 } 895 }
895 } 896 }
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 1311
1311 if (m_V5Type[objnum] != 1) 1312 if (m_V5Type[objnum] != 1)
1312 return; 1313 return;
1313 1314
1314 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1315 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
1315 if (pos == 0) { 1316 if (pos == 0) {
1316 return; 1317 return;
1317 } 1318 }
1318 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1319 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1319 m_Syntax.RestorePos(pos); 1320 m_Syntax.RestorePos(pos);
1320 FX_BOOL bIsNumber; 1321 bool bIsNumber;
1321 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1322 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1322 if (!bIsNumber) { 1323 if (!bIsNumber) {
1323 m_Syntax.RestorePos(SavedPos); 1324 m_Syntax.RestorePos(SavedPos);
1324 return; 1325 return;
1325 } 1326 }
1326 FX_DWORD parser_objnum = FXSYS_atoi(word); 1327 FX_DWORD parser_objnum = FXSYS_atoi(word);
1327 if (parser_objnum && parser_objnum != objnum) { 1328 if (parser_objnum && parser_objnum != objnum) {
1328 m_Syntax.RestorePos(SavedPos); 1329 m_Syntax.RestorePos(SavedPos);
1329 return; 1330 return;
1330 } 1331 }
1331 word = m_Syntax.GetNextWord(bIsNumber); 1332 word = m_Syntax.GetNextWord(&bIsNumber);
1332 if (!bIsNumber) { 1333 if (!bIsNumber) {
1333 m_Syntax.RestorePos(SavedPos); 1334 m_Syntax.RestorePos(SavedPos);
1334 return; 1335 return;
1335 } 1336 }
1336 if (m_Syntax.GetKeyword() != "obj") { 1337 if (m_Syntax.GetKeyword() != "obj") {
1337 m_Syntax.RestorePos(SavedPos); 1338 m_Syntax.RestorePos(SavedPos);
1338 return; 1339 return;
1339 } 1340 }
1340 void* pResult = 1341 void* pResult =
1341 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1342 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1342 sizeof(FX_FILESIZE), CompareFileSize); 1343 sizeof(FX_FILESIZE), CompareFileSize);
1343 if (!pResult) { 1344 if (!pResult) {
1344 m_Syntax.RestorePos(SavedPos); 1345 m_Syntax.RestorePos(SavedPos);
1345 return; 1346 return;
1346 } 1347 }
1347 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; 1348 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
1348 FX_BOOL bNextOffValid = FALSE; 1349 FX_BOOL bNextOffValid = FALSE;
1349 if (nextoff != pos) { 1350 if (nextoff != pos) {
1350 m_Syntax.RestorePos(nextoff); 1351 m_Syntax.RestorePos(nextoff);
1351 word = m_Syntax.GetNextWord(bIsNumber); 1352 word = m_Syntax.GetNextWord(&bIsNumber);
1352 if (word == "xref") { 1353 if (word == "xref") {
1353 bNextOffValid = TRUE; 1354 bNextOffValid = TRUE;
1354 } else if (bIsNumber) { 1355 } else if (bIsNumber) {
1355 word = m_Syntax.GetNextWord(bIsNumber); 1356 word = m_Syntax.GetNextWord(&bIsNumber);
1356 if (bIsNumber && m_Syntax.GetKeyword() == "obj") { 1357 if (bIsNumber && m_Syntax.GetKeyword() == "obj") {
1357 bNextOffValid = TRUE; 1358 bNextOffValid = TRUE;
1358 } 1359 }
1359 } 1360 }
1360 } 1361 }
1361 if (!bNextOffValid) { 1362 if (!bNextOffValid) {
1362 m_Syntax.RestorePos(pos); 1363 m_Syntax.RestorePos(pos);
1363 while (1) { 1364 while (1) {
1364 if (m_Syntax.GetKeyword() == "endobj") { 1365 if (m_Syntax.GetKeyword() == "endobj") {
1365 break; 1366 break;
(...skipping 10 matching lines...) Expand all
1376 m_Syntax.ReadBlock(pBuffer, size); 1377 m_Syntax.ReadBlock(pBuffer, size);
1377 m_Syntax.RestorePos(SavedPos); 1378 m_Syntax.RestorePos(SavedPos);
1378 } 1379 }
1379 1380
1380 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, 1381 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList,
1381 FX_FILESIZE pos, 1382 FX_FILESIZE pos,
1382 FX_DWORD objnum, 1383 FX_DWORD objnum,
1383 PARSE_CONTEXT* pContext) { 1384 PARSE_CONTEXT* pContext) {
1384 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1385 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1385 m_Syntax.RestorePos(pos); 1386 m_Syntax.RestorePos(pos);
1386 FX_BOOL bIsNumber; 1387 bool bIsNumber;
1387 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1388 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1388 if (!bIsNumber) { 1389 if (!bIsNumber) {
1389 m_Syntax.RestorePos(SavedPos); 1390 m_Syntax.RestorePos(SavedPos);
1390 return NULL; 1391 return NULL;
1391 } 1392 }
1392 FX_FILESIZE objOffset = m_Syntax.SavePos(); 1393 FX_FILESIZE objOffset = m_Syntax.SavePos();
1393 objOffset -= word.GetLength(); 1394 objOffset -= word.GetLength();
1394 FX_DWORD parser_objnum = FXSYS_atoi(word); 1395 FX_DWORD parser_objnum = FXSYS_atoi(word);
1395 if (objnum && parser_objnum != objnum) { 1396 if (objnum && parser_objnum != objnum) {
1396 m_Syntax.RestorePos(SavedPos); 1397 m_Syntax.RestorePos(SavedPos);
1397 return NULL; 1398 return NULL;
1398 } 1399 }
1399 word = m_Syntax.GetNextWord(bIsNumber); 1400 word = m_Syntax.GetNextWord(&bIsNumber);
1400 if (!bIsNumber) { 1401 if (!bIsNumber) {
1401 m_Syntax.RestorePos(SavedPos); 1402 m_Syntax.RestorePos(SavedPos);
1402 return NULL; 1403 return NULL;
1403 } 1404 }
1404 FX_DWORD parser_gennum = FXSYS_atoi(word); 1405 FX_DWORD parser_gennum = FXSYS_atoi(word);
1405 if (m_Syntax.GetKeyword() != "obj") { 1406 if (m_Syntax.GetKeyword() != "obj") {
1406 m_Syntax.RestorePos(SavedPos); 1407 m_Syntax.RestorePos(SavedPos);
1407 return NULL; 1408 return NULL;
1408 } 1409 }
1409 CPDF_Object* pObj = 1410 CPDF_Object* pObj =
(...skipping 13 matching lines...) Expand all
1423 return pObj; 1424 return pObj;
1424 } 1425 }
1425 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( 1426 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(
1426 CPDF_IndirectObjects* pObjList, 1427 CPDF_IndirectObjects* pObjList,
1427 FX_FILESIZE pos, 1428 FX_FILESIZE pos,
1428 FX_DWORD objnum, 1429 FX_DWORD objnum,
1429 PARSE_CONTEXT* pContext, 1430 PARSE_CONTEXT* pContext,
1430 FX_FILESIZE* pResultPos) { 1431 FX_FILESIZE* pResultPos) {
1431 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1432 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1432 m_Syntax.RestorePos(pos); 1433 m_Syntax.RestorePos(pos);
1433 FX_BOOL bIsNumber; 1434 bool bIsNumber;
1434 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1435 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1435 if (!bIsNumber) { 1436 if (!bIsNumber) {
1436 m_Syntax.RestorePos(SavedPos); 1437 m_Syntax.RestorePos(SavedPos);
1437 return NULL; 1438 return NULL;
1438 } 1439 }
1439 FX_DWORD parser_objnum = FXSYS_atoi(word); 1440 FX_DWORD parser_objnum = FXSYS_atoi(word);
1440 if (objnum && parser_objnum != objnum) { 1441 if (objnum && parser_objnum != objnum) {
1441 m_Syntax.RestorePos(SavedPos); 1442 m_Syntax.RestorePos(SavedPos);
1442 return NULL; 1443 return NULL;
1443 } 1444 }
1444 word = m_Syntax.GetNextWord(bIsNumber); 1445 word = m_Syntax.GetNextWord(&bIsNumber);
1445 if (!bIsNumber) { 1446 if (!bIsNumber) {
1446 m_Syntax.RestorePos(SavedPos); 1447 m_Syntax.RestorePos(SavedPos);
1447 return NULL; 1448 return NULL;
1448 } 1449 }
1449 FX_DWORD gennum = FXSYS_atoi(word); 1450 FX_DWORD gennum = FXSYS_atoi(word);
1450 if (m_Syntax.GetKeyword() != "obj") { 1451 if (m_Syntax.GetKeyword() != "obj") {
1451 m_Syntax.RestorePos(SavedPos); 1452 m_Syntax.RestorePos(SavedPos);
1452 return NULL; 1453 return NULL;
1453 } 1454 }
1454 CPDF_Object* pObj = 1455 CPDF_Object* pObj =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 return; 1497 return;
1497 } 1498 }
1498 m_Syntax.m_pCryptoHandler.reset(pSecurityHandler->CreateCryptoHandler()); 1499 m_Syntax.m_pCryptoHandler.reset(pSecurityHandler->CreateCryptoHandler());
1499 m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler); 1500 m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);
1500 } 1501 }
1501 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, 1502 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess,
1502 FX_DWORD offset) { 1503 FX_DWORD offset) {
1503 m_Syntax.InitParser(pFileAccess, offset); 1504 m_Syntax.InitParser(pFileAccess, offset);
1504 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9); 1505 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);
1505 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1506 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1506 FX_BOOL bIsNumber; 1507 bool bIsNumber;
1507 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1508 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1508 if (!bIsNumber) { 1509 if (!bIsNumber) {
1509 return FALSE; 1510 return FALSE;
1510 } 1511 }
1511 FX_DWORD objnum = FXSYS_atoi(word); 1512 FX_DWORD objnum = FXSYS_atoi(word);
1512 word = m_Syntax.GetNextWord(bIsNumber); 1513 word = m_Syntax.GetNextWord(&bIsNumber);
1513 if (!bIsNumber) { 1514 if (!bIsNumber) {
1514 return FALSE; 1515 return FALSE;
1515 } 1516 }
1516 FX_DWORD gennum = FXSYS_atoi(word); 1517 FX_DWORD gennum = FXSYS_atoi(word);
1517 if (m_Syntax.GetKeyword() != "obj") { 1518 if (m_Syntax.GetKeyword() != "obj") {
1518 m_Syntax.RestorePos(SavedPos); 1519 m_Syntax.RestorePos(SavedPos);
1519 return FALSE; 1520 return FALSE;
1520 } 1521 }
1521 m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, nullptr, true); 1522 m_pLinearized = m_Syntax.GetObject(nullptr, objnum, gennum, nullptr, true);
1522 if (!m_pLinearized) { 1523 if (!m_pLinearized) {
1523 return FALSE; 1524 return FALSE;
1524 } 1525 }
1525 1526
1526 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 1527 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
1527 if (pDict && pDict->GetElement("Linearized")) { 1528 if (pDict && pDict->GetElement("Linearized")) {
1528 m_Syntax.GetNextWord(bIsNumber); 1529 m_Syntax.GetNextWord(nullptr);
1529 1530
1530 CPDF_Object* pLen = pDict->GetElement("L"); 1531 CPDF_Object* pLen = pDict->GetElement("L");
1531 if (!pLen) { 1532 if (!pLen) {
1532 m_pLinearized->Release(); 1533 m_pLinearized->Release();
1533 m_pLinearized = NULL; 1534 m_pLinearized = NULL;
1534 return FALSE; 1535 return FALSE;
1535 } 1536 }
1536 if (pLen->GetInteger() != (int)pFileAccess->GetSize()) { 1537 if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {
1537 return FALSE; 1538 return FALSE;
1538 } 1539 }
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1772 return TRUE; 1773 return TRUE;
1773 } 1774 }
1774 FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) { 1775 FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) {
1775 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) { 1776 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {
1776 return FALSE; 1777 return FALSE;
1777 } 1778 }
1778 m_Pos += size; 1779 m_Pos += size;
1779 return TRUE; 1780 return TRUE;
1780 } 1781 }
1781 1782
1782 void CPDF_SyntaxParser::GetNextWord() { 1783 void CPDF_SyntaxParser::GetNextWordInternal(bool* bIsNumber) {
1783 m_WordSize = 0; 1784 m_WordSize = 0;
1784 m_bIsNumber = TRUE; 1785 if (bIsNumber)
1786 *bIsNumber = true;
1785 uint8_t ch; 1787 uint8_t ch;
1786 if (!GetNextChar(ch)) { 1788 if (!GetNextChar(ch)) {
1787 return; 1789 return;
1788 } 1790 }
1789 while (1) { 1791 while (1) {
1790 while (PDFCharIsWhitespace(ch)) { 1792 while (PDFCharIsWhitespace(ch)) {
1791 if (!GetNextChar(ch)) 1793 if (!GetNextChar(ch))
1792 return; 1794 return;
1793 } 1795 }
1794 if (ch != '%') 1796 if (ch != '%')
1795 break; 1797 break;
1796 1798
1797 while (1) { 1799 while (1) {
1798 if (!GetNextChar(ch)) 1800 if (!GetNextChar(ch))
1799 return; 1801 return;
1800 if (PDFCharIsLineEnding(ch)) 1802 if (PDFCharIsLineEnding(ch))
1801 break; 1803 break;
1802 } 1804 }
1803 } 1805 }
1804 1806
1805 if (PDFCharIsDelimiter(ch)) { 1807 if (PDFCharIsDelimiter(ch)) {
1806 m_bIsNumber = FALSE; 1808 if (bIsNumber)
1809 *bIsNumber = false;
1807 m_WordBuffer[m_WordSize++] = ch; 1810 m_WordBuffer[m_WordSize++] = ch;
1808 if (ch == '/') { 1811 if (ch == '/') {
1809 while (1) { 1812 while (1) {
1810 if (!GetNextChar(ch)) 1813 if (!GetNextChar(ch))
1811 return; 1814 return;
1812 1815
1813 if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { 1816 if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) {
1814 m_Pos--; 1817 m_Pos--;
1815 return; 1818 return;
1816 } 1819 }
(...skipping 17 matching lines...) Expand all
1834 m_Pos--; 1837 m_Pos--;
1835 } 1838 }
1836 return; 1839 return;
1837 } 1840 }
1838 1841
1839 while (1) { 1842 while (1) {
1840 if (m_WordSize < sizeof(m_WordBuffer) - 1) 1843 if (m_WordSize < sizeof(m_WordBuffer) - 1)
1841 m_WordBuffer[m_WordSize++] = ch; 1844 m_WordBuffer[m_WordSize++] = ch;
1842 1845
1843 if (!PDFCharIsNumeric(ch)) 1846 if (!PDFCharIsNumeric(ch))
1844 m_bIsNumber = FALSE; 1847 if (bIsNumber)
1848 *bIsNumber = false;
1845 if (!GetNextChar(ch)) 1849 if (!GetNextChar(ch))
1846 return; 1850 return;
1847 1851
1848 if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { 1852 if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) {
1849 m_Pos--; 1853 m_Pos--;
1850 break; 1854 break;
1851 } 1855 }
1852 } 1856 }
1853 } 1857 }
1858
1854 CFX_ByteString CPDF_SyntaxParser::ReadString() { 1859 CFX_ByteString CPDF_SyntaxParser::ReadString() {
1855 uint8_t ch; 1860 uint8_t ch;
1856 if (!GetNextChar(ch)) { 1861 if (!GetNextChar(ch)) {
1857 return CFX_ByteString(); 1862 return CFX_ByteString();
1858 } 1863 }
1859 CFX_ByteTextBuf buf; 1864 CFX_ByteTextBuf buf;
1860 int32_t parlevel = 0; 1865 int32_t parlevel = 0;
1861 int32_t status = 0, iEscCode = 0; 1866 int32_t status = 0, iEscCode = 0;
1862 while (1) { 1867 while (1) {
1863 switch (status) { 1868 switch (status) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2001 while (1) { 2006 while (1) {
2002 if (!GetNextChar(ch)) 2007 if (!GetNextChar(ch))
2003 return; 2008 return;
2004 if (PDFCharIsLineEnding(ch)) 2009 if (PDFCharIsLineEnding(ch))
2005 break; 2010 break;
2006 } 2011 }
2007 } 2012 }
2008 m_Pos--; 2013 m_Pos--;
2009 } 2014 }
2010 2015
2011 CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) { 2016 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) {
2012 GetNextWord(); 2017 GetNextWordInternal(bIsNumber);
2013 bIsNumber = m_bIsNumber; 2018 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
2014 return CFX_ByteString(m_WordBuffer, m_WordSize);
2015 } 2019 }
2020
2016 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { 2021 CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
2017 FX_BOOL dummy; 2022 return GetNextWord(nullptr);
2018 return GetNextWord(dummy);
2019 } 2023 }
2024
2020 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, 2025 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList,
2021 FX_DWORD objnum, 2026 FX_DWORD objnum,
2022 FX_DWORD gennum, 2027 FX_DWORD gennum,
2023 PARSE_CONTEXT* pContext, 2028 PARSE_CONTEXT* pContext,
2024 FX_BOOL bDecrypt) { 2029 FX_BOOL bDecrypt) {
2025 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2030 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2026 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2031 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2027 return NULL; 2032 return NULL;
2028 } 2033 }
2029 FX_FILESIZE SavedPos = m_Pos; 2034 FX_FILESIZE SavedPos = m_Pos;
2030 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2035 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2031 FX_BOOL bIsNumber; 2036 bool bIsNumber;
2032 CFX_ByteString word = GetNextWord(bIsNumber); 2037 CFX_ByteString word = GetNextWord(&bIsNumber);
2033 if (word.GetLength() == 0) { 2038 if (word.GetLength() == 0) {
2034 if (bTypeOnly) 2039 if (bTypeOnly)
2035 return (CPDF_Object*)PDFOBJ_INVALID; 2040 return (CPDF_Object*)PDFOBJ_INVALID;
2036 return NULL; 2041 return NULL;
2037 } 2042 }
2038 if (bIsNumber) { 2043 if (bIsNumber) {
2039 FX_FILESIZE SavedPos = m_Pos; 2044 FX_FILESIZE SavedPos = m_Pos;
2040 CFX_ByteString nextword = GetNextWord(bIsNumber); 2045 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2041 if (bIsNumber) { 2046 if (bIsNumber) {
2042 CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2047 CFX_ByteString nextword2 = GetNextWord(nullptr);
2043 if (nextword2 == "R") { 2048 if (nextword2 == "R") {
2044 FX_DWORD objnum = FXSYS_atoi(word); 2049 FX_DWORD objnum = FXSYS_atoi(word);
2045 if (bTypeOnly) 2050 if (bTypeOnly)
2046 return (CPDF_Object*)PDFOBJ_REFERENCE; 2051 return (CPDF_Object*)PDFOBJ_REFERENCE;
2047 return new CPDF_Reference(pObjList, objnum); 2052 return new CPDF_Reference(pObjList, objnum);
2048 } 2053 }
2049 } 2054 }
2050 m_Pos = SavedPos; 2055 m_Pos = SavedPos;
2051 if (bTypeOnly) 2056 if (bTypeOnly)
2052 return (CPDF_Object*)PDFOBJ_NUMBER; 2057 return (CPDF_Object*)PDFOBJ_NUMBER;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2101 return (CPDF_Object*)PDFOBJ_DICTIONARY; 2106 return (CPDF_Object*)PDFOBJ_DICTIONARY;
2102 2107
2103 if (pContext) 2108 if (pContext)
2104 pContext->m_DictStart = SavedPos; 2109 pContext->m_DictStart = SavedPos;
2105 2110
2106 int32_t nKeys = 0; 2111 int32_t nKeys = 0;
2107 FX_FILESIZE dwSignValuePos = 0; 2112 FX_FILESIZE dwSignValuePos = 0;
2108 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( 2113 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
2109 new CPDF_Dictionary); 2114 new CPDF_Dictionary);
2110 while (1) { 2115 while (1) {
2111 FX_BOOL bIsNumber; 2116 CFX_ByteString key = GetNextWord(nullptr);
2112 CFX_ByteString key = GetNextWord(bIsNumber);
2113 if (key.IsEmpty()) 2117 if (key.IsEmpty())
2114 return nullptr; 2118 return nullptr;
2115 2119
2116 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); 2120 FX_FILESIZE SavedPos = m_Pos - key.GetLength();
2117 if (key == ">>") 2121 if (key == ">>")
2118 break; 2122 break;
2119 2123
2120 if (key == "endobj") { 2124 if (key == "endobj") {
2121 m_Pos = SavedPos; 2125 m_Pos = SavedPos;
2122 break; 2126 break;
(...skipping 30 matching lines...) Expand all
2153 pDict->SetAt("Contents", pObj); 2157 pDict->SetAt("Contents", pObj);
2154 m_Pos = dwSavePos; 2158 m_Pos = dwSavePos;
2155 } 2159 }
2156 if (pContext) { 2160 if (pContext) {
2157 pContext->m_DictEnd = m_Pos; 2161 pContext->m_DictEnd = m_Pos;
2158 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2162 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2159 return pDict.release(); 2163 return pDict.release();
2160 } 2164 }
2161 } 2165 }
2162 FX_FILESIZE SavedPos = m_Pos; 2166 FX_FILESIZE SavedPos = m_Pos;
2163 FX_BOOL bIsNumber; 2167 CFX_ByteString nextword = GetNextWord(nullptr);
2164 CFX_ByteString nextword = GetNextWord(bIsNumber);
2165 if (nextword != "stream") { 2168 if (nextword != "stream") {
2166 m_Pos = SavedPos; 2169 m_Pos = SavedPos;
2167 return pDict.release(); 2170 return pDict.release();
2168 } 2171 }
2169 2172
2170 return ReadStream(pDict.release(), pContext, objnum, gennum); 2173 return ReadStream(pDict.release(), pContext, objnum, gennum);
2171 } 2174 }
2172 if (word == ">>") { 2175 if (word == ">>") {
2173 m_Pos = SavedPos; 2176 m_Pos = SavedPos;
2174 return nullptr; 2177 return nullptr;
2175 } 2178 }
2176 if (bTypeOnly) 2179 if (bTypeOnly)
2177 return (CPDF_Object*)PDFOBJ_INVALID; 2180 return (CPDF_Object*)PDFOBJ_INVALID;
2178 2181
2179 return nullptr; 2182 return nullptr;
2180 } 2183 }
2181 2184
2182 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( 2185 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(
2183 CPDF_IndirectObjects* pObjList, 2186 CPDF_IndirectObjects* pObjList,
2184 FX_DWORD objnum, 2187 FX_DWORD objnum,
2185 FX_DWORD gennum, 2188 FX_DWORD gennum,
2186 PARSE_CONTEXT* pContext) { 2189 PARSE_CONTEXT* pContext) {
2187 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2190 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2188 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2191 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2189 return NULL; 2192 return NULL;
2190 } 2193 }
2191 FX_FILESIZE SavedPos = m_Pos; 2194 FX_FILESIZE SavedPos = m_Pos;
2192 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2195 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2193 FX_BOOL bIsNumber; 2196 bool bIsNumber;
2194 CFX_ByteString word = GetNextWord(bIsNumber); 2197 CFX_ByteString word = GetNextWord(&bIsNumber);
2195 if (word.GetLength() == 0) { 2198 if (word.GetLength() == 0) {
2196 if (bTypeOnly) 2199 if (bTypeOnly)
2197 return (CPDF_Object*)PDFOBJ_INVALID; 2200 return (CPDF_Object*)PDFOBJ_INVALID;
2198 return nullptr; 2201 return nullptr;
2199 } 2202 }
2200 if (bIsNumber) { 2203 if (bIsNumber) {
2201 FX_FILESIZE SavedPos = m_Pos; 2204 FX_FILESIZE SavedPos = m_Pos;
2202 CFX_ByteString nextword = GetNextWord(bIsNumber); 2205 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2203 if (bIsNumber) { 2206 if (bIsNumber) {
2204 CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2207 CFX_ByteString nextword2 = GetNextWord(nullptr);
2205 if (nextword2 == "R") { 2208 if (nextword2 == "R") {
2206 if (bTypeOnly) 2209 if (bTypeOnly)
2207 return (CPDF_Object*)PDFOBJ_REFERENCE; 2210 return (CPDF_Object*)PDFOBJ_REFERENCE;
2208 FX_DWORD objnum = FXSYS_atoi(word); 2211 FX_DWORD objnum = FXSYS_atoi(word);
2209 return new CPDF_Reference(pObjList, objnum); 2212 return new CPDF_Reference(pObjList, objnum);
2210 } 2213 }
2211 } 2214 }
2212 m_Pos = SavedPos; 2215 m_Pos = SavedPos;
2213 if (bTypeOnly) 2216 if (bTypeOnly)
2214 return (CPDF_Object*)PDFOBJ_NUMBER; 2217 return (CPDF_Object*)PDFOBJ_NUMBER;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2259 } 2262 }
2260 if (word == "<<") { 2263 if (word == "<<") {
2261 if (bTypeOnly) 2264 if (bTypeOnly)
2262 return (CPDF_Object*)PDFOBJ_DICTIONARY; 2265 return (CPDF_Object*)PDFOBJ_DICTIONARY;
2263 if (pContext) 2266 if (pContext)
2264 pContext->m_DictStart = SavedPos; 2267 pContext->m_DictStart = SavedPos;
2265 2268
2266 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( 2269 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
2267 new CPDF_Dictionary); 2270 new CPDF_Dictionary);
2268 while (1) { 2271 while (1) {
2269 FX_BOOL bIsNumber;
2270 FX_FILESIZE SavedPos = m_Pos; 2272 FX_FILESIZE SavedPos = m_Pos;
2271 CFX_ByteString key = GetNextWord(bIsNumber); 2273 CFX_ByteString key = GetNextWord(nullptr);
2272 if (key.IsEmpty()) 2274 if (key.IsEmpty())
2273 return nullptr; 2275 return nullptr;
2274 2276
2275 if (key == ">>") 2277 if (key == ">>")
2276 break; 2278 break;
2277 2279
2278 if (key == "endobj") { 2280 if (key == "endobj") {
2279 m_Pos = SavedPos; 2281 m_Pos = SavedPos;
2280 break; 2282 break;
2281 } 2283 }
(...skipping 14 matching lines...) Expand all
2296 obj.release()); 2298 obj.release());
2297 } 2299 }
2298 } 2300 }
2299 if (pContext) { 2301 if (pContext) {
2300 pContext->m_DictEnd = m_Pos; 2302 pContext->m_DictEnd = m_Pos;
2301 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2303 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2302 return pDict.release(); 2304 return pDict.release();
2303 } 2305 }
2304 } 2306 }
2305 FX_FILESIZE SavedPos = m_Pos; 2307 FX_FILESIZE SavedPos = m_Pos;
2306 FX_BOOL bIsNumber; 2308 CFX_ByteString nextword = GetNextWord(nullptr);
2307 CFX_ByteString nextword = GetNextWord(bIsNumber);
2308 if (nextword != "stream") { 2309 if (nextword != "stream") {
2309 m_Pos = SavedPos; 2310 m_Pos = SavedPos;
2310 return pDict.release(); 2311 return pDict.release();
2311 } 2312 }
2312 2313
2313 return ReadStream(pDict.release(), pContext, objnum, gennum); 2314 return ReadStream(pDict.release(), pContext, objnum, gennum);
2314 } 2315 }
2315 if (word == ">>") { 2316 if (word == ">>") {
2316 m_Pos = SavedPos; 2317 m_Pos = SavedPos;
2317 return nullptr; 2318 return nullptr;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2361 if (!pCryptoHandler) { 2362 if (!pCryptoHandler) {
2362 FX_BOOL bSearchForKeyword = TRUE; 2363 FX_BOOL bSearchForKeyword = TRUE;
2363 if (len >= 0) { 2364 if (len >= 0) {
2364 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos; 2365 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos;
2365 pos += len; 2366 pos += len;
2366 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) { 2367 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) {
2367 m_Pos = pos.ValueOrDie(); 2368 m_Pos = pos.ValueOrDie();
2368 } 2369 }
2369 m_Pos += ReadEOLMarkers(m_Pos); 2370 m_Pos += ReadEOLMarkers(m_Pos);
2370 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1); 2371 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1);
2371 GetNextWord(); 2372 GetNextWordInternal(nullptr);
2372 // Earlier version of PDF specification doesn't require EOL marker before 2373 // Earlier version of PDF specification doesn't require EOL marker before
2373 // 'endstream' keyword. If keyword 'endstream' follows the bytes in 2374 // 'endstream' keyword. If keyword 'endstream' follows the bytes in
2374 // specified length, it signals the end of stream. 2375 // specified length, it signals the end of stream.
2375 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.GetPtr(), 2376 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.GetPtr(),
2376 kEndStreamStr.GetLength()) == 0) { 2377 kEndStreamStr.GetLength()) == 0) {
2377 bSearchForKeyword = FALSE; 2378 bSearchForKeyword = FALSE;
2378 } 2379 }
2379 } 2380 }
2380 if (bSearchForKeyword) { 2381 if (bSearchForKeyword) {
2381 // If len is not available, len needs to be calculated 2382 // If len is not available, len needs to be calculated
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 len = dest_buf.GetSize(); 2462 len = dest_buf.GetSize();
2462 dest_buf.DetachBuffer(); 2463 dest_buf.DetachBuffer();
2463 } 2464 }
2464 } 2465 }
2465 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); 2466 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict);
2466 if (pContext) { 2467 if (pContext) {
2467 pContext->m_DataEnd = pContext->m_DataStart + len; 2468 pContext->m_DataEnd = pContext->m_DataStart + len;
2468 } 2469 }
2469 streamStartPos = m_Pos; 2470 streamStartPos = m_Pos;
2470 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); 2471 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1);
2471 GetNextWord(); 2472 GetNextWordInternal(nullptr);
2472 int numMarkers = ReadEOLMarkers(m_Pos); 2473 int numMarkers = ReadEOLMarkers(m_Pos);
2473 if (m_WordSize == kEndObjStr.GetLength() && numMarkers != 0 && 2474 if (m_WordSize == kEndObjStr.GetLength() && numMarkers != 0 &&
2474 FXSYS_memcmp(m_WordBuffer, kEndObjStr.GetPtr(), kEndObjStr.GetLength()) == 2475 FXSYS_memcmp(m_WordBuffer, kEndObjStr.GetPtr(), kEndObjStr.GetLength()) ==
2475 0) { 2476 0) {
2476 m_Pos = streamStartPos; 2477 m_Pos = streamStartPos;
2477 } 2478 }
2478 return pStream; 2479 return pStream;
2479 } 2480 }
2480 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, 2481 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess,
2481 FX_DWORD HeaderOffset) { 2482 FX_DWORD HeaderOffset) {
2482 FX_Free(m_pFileBuf); 2483 FX_Free(m_pFileBuf);
2483 m_pFileBuf = FX_Alloc(uint8_t, m_BufSize); 2484 m_pFileBuf = FX_Alloc(uint8_t, m_BufSize);
2484 m_HeaderOffset = HeaderOffset; 2485 m_HeaderOffset = HeaderOffset;
2485 m_FileLen = pFileAccess->GetSize(); 2486 m_FileLen = pFileAccess->GetSize();
2486 m_Pos = 0; 2487 m_Pos = 0;
2487 m_pFileAccess = pFileAccess; 2488 m_pFileAccess = pFileAccess;
2488 m_BufOffset = 0; 2489 m_BufOffset = 0;
2489 pFileAccess->ReadBlock( 2490 pFileAccess->ReadBlock(
2490 m_pFileBuf, 0, 2491 m_pFileBuf, 0,
2491 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize)); 2492 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));
2492 } 2493 }
2493 int32_t CPDF_SyntaxParser::GetDirectNum() { 2494 int32_t CPDF_SyntaxParser::GetDirectNum() {
2494 GetNextWord(); 2495 bool bIsNumber;
2495 if (!m_bIsNumber) { 2496 GetNextWordInternal(&bIsNumber);
2497 if (!bIsNumber)
2496 return 0; 2498 return 0;
2497 } 2499
2498 m_WordBuffer[m_WordSize] = 0; 2500 m_WordBuffer[m_WordSize] = 0;
2499 return FXSYS_atoi(reinterpret_cast<const FX_CHAR*>(m_WordBuffer)); 2501 return FXSYS_atoi(reinterpret_cast<const FX_CHAR*>(m_WordBuffer));
2500 } 2502 }
2501 2503
2502 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, 2504 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
2503 FX_FILESIZE limit, 2505 FX_FILESIZE limit,
2504 const CFX_ByteStringC& tag, 2506 const CFX_ByteStringC& tag,
2505 FX_BOOL checkKeyword) { 2507 FX_BOOL checkKeyword) {
2506 const FX_DWORD taglen = tag.GetLength(); 2508 const FX_DWORD taglen = tag.GetLength();
2507 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]); 2509 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]);
(...skipping 1108 matching lines...) Expand 10 before | Expand all | Expand 10 after
3616 3618
3617 m_docStatus = PDF_DATAAVAIL_DONE; 3619 m_docStatus = PDF_DATAAVAIL_DONE;
3618 return TRUE; 3620 return TRUE;
3619 } 3621 }
3620 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( 3622 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt(
3621 FX_FILESIZE pos, 3623 FX_FILESIZE pos,
3622 FX_DWORD objnum, 3624 FX_DWORD objnum,
3623 CPDF_IndirectObjects* pObjList) { 3625 CPDF_IndirectObjects* pObjList) {
3624 FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3626 FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3625 m_syntaxParser.RestorePos(pos); 3627 m_syntaxParser.RestorePos(pos);
3626 FX_BOOL bIsNumber; 3628 bool bIsNumber;
3627 CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber); 3629 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber);
3628 if (!bIsNumber) { 3630 if (!bIsNumber)
3629 return NULL; 3631 return nullptr;
3630 } 3632
3631 FX_DWORD parser_objnum = FXSYS_atoi(word); 3633 FX_DWORD parser_objnum = FXSYS_atoi(word);
3632 if (objnum && parser_objnum != objnum) { 3634 if (objnum && parser_objnum != objnum)
3633 return NULL; 3635 return nullptr;
3634 } 3636
3635 word = m_syntaxParser.GetNextWord(bIsNumber); 3637 word = m_syntaxParser.GetNextWord(&bIsNumber);
3636 if (!bIsNumber) { 3638 if (!bIsNumber)
3637 return NULL; 3639 return nullptr;
3638 } 3640
3639 FX_DWORD gennum = FXSYS_atoi(word); 3641 FX_DWORD gennum = FXSYS_atoi(word);
3640 if (m_syntaxParser.GetKeyword() != "obj") { 3642 if (m_syntaxParser.GetKeyword() != "obj") {
3641 m_syntaxParser.RestorePos(SavedPos); 3643 m_syntaxParser.RestorePos(SavedPos);
3642 return NULL; 3644 return nullptr;
3643 } 3645 }
3644 CPDF_Object* pObj = 3646 CPDF_Object* pObj =
3645 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, nullptr, true); 3647 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, nullptr, true);
3646 m_syntaxParser.RestorePos(SavedPos); 3648 m_syntaxParser.RestorePos(SavedPos);
3647 return pObj; 3649 return pObj;
3648 } 3650 }
3649 IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() { 3651 IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() {
3650 FX_DWORD req_size = 1024; 3652 FX_DWORD req_size = 1024;
3651 if (!m_pFileAvail->IsDataAvail(0, req_size)) { 3653 if (!m_pFileAvail->IsDataAvail(0, req_size)) {
3652 return LinearizationUnknown; 3654 return LinearizationUnknown;
(...skipping 15 matching lines...) Expand all
3668 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) { 3670 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) {
3669 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE)); 3671 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));
3670 int32_t offset = GetHeaderOffset(file.get()); 3672 int32_t offset = GetHeaderOffset(file.get());
3671 if (offset == -1) { 3673 if (offset == -1) {
3672 m_docStatus = PDF_DATAAVAIL_ERROR; 3674 m_docStatus = PDF_DATAAVAIL_ERROR;
3673 return FALSE; 3675 return FALSE;
3674 } 3676 }
3675 m_dwHeaderOffset = offset; 3677 m_dwHeaderOffset = offset;
3676 m_syntaxParser.InitParser(file.get(), offset); 3678 m_syntaxParser.InitParser(file.get(), offset);
3677 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); 3679 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);
3678 FX_BOOL bNumber = FALSE; 3680 bool bNumber;
3679 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); 3681 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber);
3680 if (!bNumber) { 3682 if (!bNumber)
3681 return FALSE; 3683 return FALSE;
3682 } 3684
3683 FX_DWORD objnum = FXSYS_atoi(wordObjNum); 3685 FX_DWORD objnum = FXSYS_atoi(wordObjNum);
3684 if (m_pLinearized) { 3686 if (m_pLinearized) {
3685 m_pLinearized->Release(); 3687 m_pLinearized->Release();
3686 m_pLinearized = NULL; 3688 m_pLinearized = NULL;
3687 } 3689 }
3688 m_pLinearized = 3690 m_pLinearized =
3689 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum); 3691 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
3690 if (!m_pLinearized) { 3692 if (!m_pLinearized) {
3691 return FALSE; 3693 return FALSE;
3692 } 3694 }
(...skipping 19 matching lines...) Expand all
3712 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) { 3714 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) {
3713 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); 3715 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
3714 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); 3716 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);
3715 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { 3717 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
3716 uint8_t buffer[1024]; 3718 uint8_t buffer[1024];
3717 m_pFileRead->ReadBlock(buffer, req_pos, dwSize); 3719 m_pFileRead->ReadBlock(buffer, req_pos, dwSize);
3718 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE)); 3720 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));
3719 m_syntaxParser.InitParser(file.get(), 0); 3721 m_syntaxParser.InitParser(file.get(), 0);
3720 m_syntaxParser.RestorePos(dwSize - 1); 3722 m_syntaxParser.RestorePos(dwSize - 1);
3721 if (m_syntaxParser.SearchWord("startxref", TRUE, FALSE, dwSize)) { 3723 if (m_syntaxParser.SearchWord("startxref", TRUE, FALSE, dwSize)) {
3722 FX_BOOL bNumber; 3724 m_syntaxParser.GetNextWord(nullptr);
3723 m_syntaxParser.GetNextWord(bNumber); 3725 bool bNumber;
3724 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); 3726 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(&bNumber);
3725 if (!bNumber) { 3727 if (!bNumber) {
3726 m_docStatus = PDF_DATAAVAIL_ERROR; 3728 m_docStatus = PDF_DATAAVAIL_ERROR;
3727 return FALSE; 3729 return FALSE;
3728 } 3730 }
3729 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 3731 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
3730 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { 3732 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {
3731 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3733 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3732 return TRUE; 3734 return TRUE;
3733 } 3735 }
3734 m_dwLastXRefOffset = m_dwXRefOffset; 3736 m_dwLastXRefOffset = m_dwXRefOffset;
(...skipping 12 matching lines...) Expand all
3747 xref_offset = 0; 3749 xref_offset = 0;
3748 FX_DWORD req_size = 3750 FX_DWORD req_size =
3749 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3751 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3750 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { 3752 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {
3751 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam); 3753 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam);
3752 CFX_BinaryBuf buf(iSize); 3754 CFX_BinaryBuf buf(iSize);
3753 uint8_t* pBuf = buf.GetBuffer(); 3755 uint8_t* pBuf = buf.GetBuffer();
3754 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); 3756 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
3755 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); 3757 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
3756 m_parser.m_Syntax.InitParser(file.get(), 0); 3758 m_parser.m_Syntax.InitParser(file.get(), 0);
3757 FX_BOOL bNumber = FALSE; 3759 bool bNumber;
3758 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); 3760 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(&bNumber);
3759 if (!bNumber) { 3761 if (!bNumber)
3760 return -1; 3762 return -1;
3761 } 3763
3762 FX_DWORD objNum = FXSYS_atoi(objnum); 3764 FX_DWORD objNum = FXSYS_atoi(objnum);
3763 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL); 3765 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);
3764 if (!pObj) { 3766 if (!pObj) {
3765 m_Pos += m_parser.m_Syntax.SavePos(); 3767 m_Pos += m_parser.m_Syntax.SavePos();
3766 return 0; 3768 return 0;
3767 } 3769 }
3768 CPDF_Dictionary* pDict = pObj->GetDict(); 3770 CPDF_Dictionary* pDict = pObj->GetDict();
3769 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr); 3771 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr);
3770 if (pName) { 3772 if (pName) {
3771 if (pName->GetString() == "XRef") { 3773 if (pName->GetString() == "XRef") {
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after
4967 if (!m_pLinearizedDict) 4969 if (!m_pLinearizedDict)
4968 return -1; 4970 return -1;
4969 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4971 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
4970 if (!pRange) 4972 if (!pRange)
4971 return -1; 4973 return -1;
4972 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4974 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
4973 if (!pStreamLen) 4975 if (!pStreamLen)
4974 return -1; 4976 return -1;
4975 return pStreamLen->GetInteger(); 4977 return pStreamLen->GetInteger();
4976 } 4978 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698