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

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

Issue 1558083002: Change CPDF_SyntaxParser::GetNextWord() to not pass by non-const ref. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
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 <memory> 9 #include <memory>
10 #include <set> 10 #include <set>
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 FX_BOOL bXRefRebuilt = FALSE; 216 FX_BOOL bXRefRebuilt = FALSE;
217 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { 217 if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) {
218 FX_FILESIZE startxref_offset = m_Syntax.SavePos(); 218 FX_FILESIZE startxref_offset = m_Syntax.SavePos();
219 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), 219 void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
220 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), 220 m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
221 CompareFileSize); 221 CompareFileSize);
222 if (!pResult) 222 if (!pResult)
223 m_SortedOffset.Add(startxref_offset); 223 m_SortedOffset.Add(startxref_offset);
224 224
225 m_Syntax.GetKeyword(); 225 m_Syntax.GetKeyword();
226 FX_BOOL bNumber; 226 bool bNumber;
227 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); 227 CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber);
228 if (!bNumber) 228 if (!bNumber)
229 return PDFPARSE_ERROR_FORMAT; 229 return PDFPARSE_ERROR_FORMAT;
230 230
231 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 231 m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
232 if (!LoadAllCrossRefV4(m_LastXRefOffset) && 232 if (!LoadAllCrossRefV4(m_LastXRefOffset) &&
233 !LoadAllCrossRefV5(m_LastXRefOffset)) { 233 !LoadAllCrossRefV5(m_LastXRefOffset)) {
234 if (!RebuildCrossRef()) 234 if (!RebuildCrossRef())
235 return PDFPARSE_ERROR_FORMAT; 235 return PDFPARSE_ERROR_FORMAT;
236 236
237 bXRefRebuilt = TRUE; 237 bXRefRebuilt = TRUE;
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 return false; 517 return false;
518 518
519 if (!FindPosInOffsets(pos)) 519 if (!FindPosInOffsets(pos))
520 m_SortedOffset.Add(pos); 520 m_SortedOffset.Add(pos);
521 521
522 if (streampos && !FindPosInOffsets(streampos)) 522 if (streampos && !FindPosInOffsets(streampos))
523 m_SortedOffset.Add(streampos); 523 m_SortedOffset.Add(streampos);
524 524
525 while (1) { 525 while (1) {
526 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 526 FX_FILESIZE SavedPos = m_Syntax.SavePos();
527 FX_BOOL bIsNumber; 527 bool bIsNumber;
528 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 528 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
529 if (word.IsEmpty()) 529 if (word.IsEmpty())
530 return false; 530 return false;
531 531
532 if (!bIsNumber) { 532 if (!bIsNumber) {
533 m_Syntax.RestorePos(SavedPos); 533 m_Syntax.RestorePos(SavedPos);
534 break; 534 break;
535 } 535 }
536 FX_DWORD start_objnum = FXSYS_atoi(word); 536 FX_DWORD start_objnum = FXSYS_atoi(word);
537 if (start_objnum >= kMaxObjectNumber) 537 if (start_objnum >= kMaxObjectNumber)
538 return false; 538 return false;
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 } else { 871 } else {
872 if (pObj->IsStream()) { 872 if (pObj->IsStream()) {
873 m_pTrailer = ToDictionary(pTrailer->Clone()); 873 m_pTrailer = ToDictionary(pTrailer->Clone());
874 pObj->Release(); 874 pObj->Release();
875 } else { 875 } else {
876 m_pTrailer = pTrailer; 876 m_pTrailer = pTrailer;
877 } 877 }
878 FX_FILESIZE dwSavePos = m_Syntax.SavePos(); 878 FX_FILESIZE dwSavePos = m_Syntax.SavePos();
879 CFX_ByteString strWord = m_Syntax.GetKeyword(); 879 CFX_ByteString strWord = m_Syntax.GetKeyword();
880 if (!strWord.Compare("startxref")) { 880 if (!strWord.Compare("startxref")) {
881 FX_BOOL bNumber = FALSE; 881 bool bNumber;
882 CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber); 882 CFX_ByteString bsOffset =
883 m_Syntax.GetNextWord(&bNumber);
883 if (bNumber) { 884 if (bNumber) {
884 m_LastXRefOffset = FXSYS_atoi(bsOffset); 885 m_LastXRefOffset = FXSYS_atoi(bsOffset);
885 } 886 }
886 } 887 }
887 m_Syntax.RestorePos(dwSavePos); 888 m_Syntax.RestorePos(dwSavePos);
888 } 889 }
889 } else { 890 } else {
890 pObj->Release(); 891 pObj->Release();
891 } 892 }
892 } 893 }
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 1303
1303 if (m_V5Type[objnum] != 1) 1304 if (m_V5Type[objnum] != 1)
1304 return; 1305 return;
1305 1306
1306 FX_FILESIZE pos = m_ObjectInfo[objnum].pos; 1307 FX_FILESIZE pos = m_ObjectInfo[objnum].pos;
1307 if (pos == 0) { 1308 if (pos == 0) {
1308 return; 1309 return;
1309 } 1310 }
1310 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1311 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1311 m_Syntax.RestorePos(pos); 1312 m_Syntax.RestorePos(pos);
1312 FX_BOOL bIsNumber; 1313 bool bIsNumber;
1313 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1314 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1314 if (!bIsNumber) { 1315 if (!bIsNumber) {
1315 m_Syntax.RestorePos(SavedPos); 1316 m_Syntax.RestorePos(SavedPos);
1316 return; 1317 return;
1317 } 1318 }
1318 FX_DWORD parser_objnum = FXSYS_atoi(word); 1319 FX_DWORD parser_objnum = FXSYS_atoi(word);
1319 if (parser_objnum && parser_objnum != objnum) { 1320 if (parser_objnum && parser_objnum != objnum) {
1320 m_Syntax.RestorePos(SavedPos); 1321 m_Syntax.RestorePos(SavedPos);
1321 return; 1322 return;
1322 } 1323 }
1323 word = m_Syntax.GetNextWord(bIsNumber); 1324 word = m_Syntax.GetNextWord(&bIsNumber);
1324 if (!bIsNumber) { 1325 if (!bIsNumber) {
1325 m_Syntax.RestorePos(SavedPos); 1326 m_Syntax.RestorePos(SavedPos);
1326 return; 1327 return;
1327 } 1328 }
1328 if (m_Syntax.GetKeyword() != "obj") { 1329 if (m_Syntax.GetKeyword() != "obj") {
1329 m_Syntax.RestorePos(SavedPos); 1330 m_Syntax.RestorePos(SavedPos);
1330 return; 1331 return;
1331 } 1332 }
1332 void* pResult = 1333 void* pResult =
1333 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), 1334 FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
1334 sizeof(FX_FILESIZE), CompareFileSize); 1335 sizeof(FX_FILESIZE), CompareFileSize);
1335 if (!pResult) { 1336 if (!pResult) {
1336 m_Syntax.RestorePos(SavedPos); 1337 m_Syntax.RestorePos(SavedPos);
1337 return; 1338 return;
1338 } 1339 }
1339 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; 1340 FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
1340 FX_BOOL bNextOffValid = FALSE; 1341 FX_BOOL bNextOffValid = FALSE;
1341 if (nextoff != pos) { 1342 if (nextoff != pos) {
1342 m_Syntax.RestorePos(nextoff); 1343 m_Syntax.RestorePos(nextoff);
1343 word = m_Syntax.GetNextWord(bIsNumber); 1344 word = m_Syntax.GetNextWord(&bIsNumber);
1344 if (word == "xref") { 1345 if (word == "xref") {
1345 bNextOffValid = TRUE; 1346 bNextOffValid = TRUE;
1346 } else if (bIsNumber) { 1347 } else if (bIsNumber) {
1347 word = m_Syntax.GetNextWord(bIsNumber); 1348 word = m_Syntax.GetNextWord(&bIsNumber);
1348 if (bIsNumber && m_Syntax.GetKeyword() == "obj") { 1349 if (bIsNumber && m_Syntax.GetKeyword() == "obj") {
1349 bNextOffValid = TRUE; 1350 bNextOffValid = TRUE;
1350 } 1351 }
1351 } 1352 }
1352 } 1353 }
1353 if (!bNextOffValid) { 1354 if (!bNextOffValid) {
1354 m_Syntax.RestorePos(pos); 1355 m_Syntax.RestorePos(pos);
1355 while (1) { 1356 while (1) {
1356 if (m_Syntax.GetKeyword() == "endobj") { 1357 if (m_Syntax.GetKeyword() == "endobj") {
1357 break; 1358 break;
(...skipping 10 matching lines...) Expand all
1368 m_Syntax.ReadBlock(pBuffer, size); 1369 m_Syntax.ReadBlock(pBuffer, size);
1369 m_Syntax.RestorePos(SavedPos); 1370 m_Syntax.RestorePos(SavedPos);
1370 } 1371 }
1371 1372
1372 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, 1373 CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList,
1373 FX_FILESIZE pos, 1374 FX_FILESIZE pos,
1374 FX_DWORD objnum, 1375 FX_DWORD objnum,
1375 PARSE_CONTEXT* pContext) { 1376 PARSE_CONTEXT* pContext) {
1376 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1377 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1377 m_Syntax.RestorePos(pos); 1378 m_Syntax.RestorePos(pos);
1378 FX_BOOL bIsNumber; 1379 bool bIsNumber;
1379 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1380 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1380 if (!bIsNumber) { 1381 if (!bIsNumber) {
1381 m_Syntax.RestorePos(SavedPos); 1382 m_Syntax.RestorePos(SavedPos);
1382 return NULL; 1383 return NULL;
1383 } 1384 }
1384 FX_FILESIZE objOffset = m_Syntax.SavePos(); 1385 FX_FILESIZE objOffset = m_Syntax.SavePos();
1385 objOffset -= word.GetLength(); 1386 objOffset -= word.GetLength();
1386 FX_DWORD parser_objnum = FXSYS_atoi(word); 1387 FX_DWORD parser_objnum = FXSYS_atoi(word);
1387 if (objnum && parser_objnum != objnum) { 1388 if (objnum && parser_objnum != objnum) {
1388 m_Syntax.RestorePos(SavedPos); 1389 m_Syntax.RestorePos(SavedPos);
1389 return NULL; 1390 return NULL;
1390 } 1391 }
1391 word = m_Syntax.GetNextWord(bIsNumber); 1392 word = m_Syntax.GetNextWord(&bIsNumber);
1392 if (!bIsNumber) { 1393 if (!bIsNumber) {
1393 m_Syntax.RestorePos(SavedPos); 1394 m_Syntax.RestorePos(SavedPos);
1394 return NULL; 1395 return NULL;
1395 } 1396 }
1396 FX_DWORD parser_gennum = FXSYS_atoi(word); 1397 FX_DWORD parser_gennum = FXSYS_atoi(word);
1397 if (m_Syntax.GetKeyword() != "obj") { 1398 if (m_Syntax.GetKeyword() != "obj") {
1398 m_Syntax.RestorePos(SavedPos); 1399 m_Syntax.RestorePos(SavedPos);
1399 return NULL; 1400 return NULL;
1400 } 1401 }
1401 CPDF_Object* pObj = 1402 CPDF_Object* pObj =
(...skipping 13 matching lines...) Expand all
1415 return pObj; 1416 return pObj;
1416 } 1417 }
1417 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict( 1418 CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(
1418 CPDF_IndirectObjects* pObjList, 1419 CPDF_IndirectObjects* pObjList,
1419 FX_FILESIZE pos, 1420 FX_FILESIZE pos,
1420 FX_DWORD objnum, 1421 FX_DWORD objnum,
1421 struct PARSE_CONTEXT* pContext, 1422 struct PARSE_CONTEXT* pContext,
1422 FX_FILESIZE* pResultPos) { 1423 FX_FILESIZE* pResultPos) {
1423 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1424 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1424 m_Syntax.RestorePos(pos); 1425 m_Syntax.RestorePos(pos);
1425 FX_BOOL bIsNumber; 1426 bool bIsNumber;
1426 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1427 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1427 if (!bIsNumber) { 1428 if (!bIsNumber) {
1428 m_Syntax.RestorePos(SavedPos); 1429 m_Syntax.RestorePos(SavedPos);
1429 return NULL; 1430 return NULL;
1430 } 1431 }
1431 FX_DWORD parser_objnum = FXSYS_atoi(word); 1432 FX_DWORD parser_objnum = FXSYS_atoi(word);
1432 if (objnum && parser_objnum != objnum) { 1433 if (objnum && parser_objnum != objnum) {
1433 m_Syntax.RestorePos(SavedPos); 1434 m_Syntax.RestorePos(SavedPos);
1434 return NULL; 1435 return NULL;
1435 } 1436 }
1436 word = m_Syntax.GetNextWord(bIsNumber); 1437 word = m_Syntax.GetNextWord(&bIsNumber);
1437 if (!bIsNumber) { 1438 if (!bIsNumber) {
1438 m_Syntax.RestorePos(SavedPos); 1439 m_Syntax.RestorePos(SavedPos);
1439 return NULL; 1440 return NULL;
1440 } 1441 }
1441 FX_DWORD gennum = FXSYS_atoi(word); 1442 FX_DWORD gennum = FXSYS_atoi(word);
1442 if (m_Syntax.GetKeyword() != "obj") { 1443 if (m_Syntax.GetKeyword() != "obj") {
1443 m_Syntax.RestorePos(SavedPos); 1444 m_Syntax.RestorePos(SavedPos);
1444 return NULL; 1445 return NULL;
1445 } 1446 }
1446 CPDF_Object* pObj = 1447 CPDF_Object* pObj =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 return; 1489 return;
1489 } 1490 }
1490 m_Syntax.m_pCryptoHandler.reset(pSecurityHandler->CreateCryptoHandler()); 1491 m_Syntax.m_pCryptoHandler.reset(pSecurityHandler->CreateCryptoHandler());
1491 m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler); 1492 m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);
1492 } 1493 }
1493 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, 1494 FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess,
1494 FX_DWORD offset) { 1495 FX_DWORD offset) {
1495 m_Syntax.InitParser(pFileAccess, offset); 1496 m_Syntax.InitParser(pFileAccess, offset);
1496 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9); 1497 m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);
1497 FX_FILESIZE SavedPos = m_Syntax.SavePos(); 1498 FX_FILESIZE SavedPos = m_Syntax.SavePos();
1498 FX_BOOL bIsNumber; 1499 bool bIsNumber;
1499 CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber); 1500 CFX_ByteString word = m_Syntax.GetNextWord(&bIsNumber);
1500 if (!bIsNumber) { 1501 if (!bIsNumber) {
1501 return FALSE; 1502 return FALSE;
1502 } 1503 }
1503 FX_DWORD objnum = FXSYS_atoi(word); 1504 FX_DWORD objnum = FXSYS_atoi(word);
1504 word = m_Syntax.GetNextWord(bIsNumber); 1505 word = m_Syntax.GetNextWord(&bIsNumber);
1505 if (!bIsNumber) { 1506 if (!bIsNumber) {
1506 return FALSE; 1507 return FALSE;
1507 } 1508 }
1508 FX_DWORD gennum = FXSYS_atoi(word); 1509 FX_DWORD gennum = FXSYS_atoi(word);
1509 if (m_Syntax.GetKeyword() != "obj") { 1510 if (m_Syntax.GetKeyword() != "obj") {
1510 m_Syntax.RestorePos(SavedPos); 1511 m_Syntax.RestorePos(SavedPos);
1511 return FALSE; 1512 return FALSE;
1512 } 1513 }
1513 m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0); 1514 m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0);
1514 if (!m_pLinearized) { 1515 if (!m_pLinearized) {
1515 return FALSE; 1516 return FALSE;
1516 } 1517 }
1517 1518
1518 CPDF_Dictionary* pDict = m_pLinearized->GetDict(); 1519 CPDF_Dictionary* pDict = m_pLinearized->GetDict();
1519 if (pDict && pDict->GetElement("Linearized")) { 1520 if (pDict && pDict->GetElement("Linearized")) {
1520 m_Syntax.GetNextWord(bIsNumber); 1521 m_Syntax.GetNextWord(nullptr);
1521 1522
1522 CPDF_Object* pLen = pDict->GetElement("L"); 1523 CPDF_Object* pLen = pDict->GetElement("L");
1523 if (!pLen) { 1524 if (!pLen) {
1524 m_pLinearized->Release(); 1525 m_pLinearized->Release();
1525 m_pLinearized = NULL; 1526 m_pLinearized = NULL;
1526 return FALSE; 1527 return FALSE;
1527 } 1528 }
1528 if (pLen->GetInteger() != (int)pFileAccess->GetSize()) { 1529 if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {
1529 return FALSE; 1530 return FALSE;
1530 } 1531 }
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 return TRUE; 1764 return TRUE;
1764 } 1765 }
1765 FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) { 1766 FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, FX_DWORD size) {
1766 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) { 1767 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {
1767 return FALSE; 1768 return FALSE;
1768 } 1769 }
1769 m_Pos += size; 1770 m_Pos += size;
1770 return TRUE; 1771 return TRUE;
1771 } 1772 }
1772 #define MAX_WORD_BUFFER 256 1773 #define MAX_WORD_BUFFER 256
1773 void CPDF_SyntaxParser::GetNextWord() { 1774 bool CPDF_SyntaxParser::GetNextWordInternal() {
Wei Li 2016/01/05 03:34:17 Consider using the similar prototype as GetNextWor
Lei Zhang 2016/01/06 01:19:22 Sure.
1774 m_WordSize = 0; 1775 m_WordSize = 0;
1775 m_bIsNumber = TRUE; 1776 bool bIsNumber = true;
1776 uint8_t ch; 1777 uint8_t ch;
1777 if (!GetNextChar(ch)) { 1778 if (!GetNextChar(ch)) {
1778 return; 1779 return bIsNumber;
1779 } 1780 }
1780 while (1) { 1781 while (1) {
1781 while (PDFCharIsWhitespace(ch)) { 1782 while (PDFCharIsWhitespace(ch)) {
1782 if (!GetNextChar(ch)) 1783 if (!GetNextChar(ch))
1783 return; 1784 return bIsNumber;
1784 } 1785 }
1785 if (ch != '%') 1786 if (ch != '%')
1786 break; 1787 break;
1787 1788
1788 while (1) { 1789 while (1) {
1789 if (!GetNextChar(ch)) 1790 if (!GetNextChar(ch))
1790 return; 1791 return bIsNumber;
1791 if (PDFCharIsLineEnding(ch)) 1792 if (PDFCharIsLineEnding(ch))
1792 break; 1793 break;
1793 } 1794 }
1794 } 1795 }
1795 1796
1796 if (PDFCharIsDelimiter(ch)) { 1797 if (PDFCharIsDelimiter(ch)) {
1797 m_bIsNumber = FALSE; 1798 bIsNumber = false;
1798 m_WordBuffer[m_WordSize++] = ch; 1799 m_WordBuffer[m_WordSize++] = ch;
1799 if (ch == '/') { 1800 if (ch == '/') {
1800 while (1) { 1801 while (1) {
1801 if (!GetNextChar(ch)) 1802 if (!GetNextChar(ch))
1802 return; 1803 return bIsNumber;
1803 1804
1804 if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { 1805 if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) {
1805 m_Pos--; 1806 m_Pos--;
1806 return; 1807 return bIsNumber;
1807 } 1808 }
1808 1809
1809 if (m_WordSize < MAX_WORD_BUFFER) 1810 if (m_WordSize < MAX_WORD_BUFFER)
1810 m_WordBuffer[m_WordSize++] = ch; 1811 m_WordBuffer[m_WordSize++] = ch;
1811 } 1812 }
1812 } else if (ch == '<') { 1813 } else if (ch == '<') {
1813 if (!GetNextChar(ch)) 1814 if (!GetNextChar(ch))
1814 return; 1815 return bIsNumber;
1815 if (ch == '<') 1816 if (ch == '<')
1816 m_WordBuffer[m_WordSize++] = ch; 1817 m_WordBuffer[m_WordSize++] = ch;
1817 else 1818 else
1818 m_Pos--; 1819 m_Pos--;
1819 } else if (ch == '>') { 1820 } else if (ch == '>') {
1820 if (!GetNextChar(ch)) 1821 if (!GetNextChar(ch))
1821 return; 1822 return bIsNumber;
1822 if (ch == '>') 1823 if (ch == '>')
1823 m_WordBuffer[m_WordSize++] = ch; 1824 m_WordBuffer[m_WordSize++] = ch;
1824 else 1825 else
1825 m_Pos--; 1826 m_Pos--;
1826 } 1827 }
1827 return; 1828 return bIsNumber;
1828 } 1829 }
1829 1830
1830 while (1) { 1831 while (1) {
1831 if (m_WordSize < MAX_WORD_BUFFER) 1832 if (m_WordSize < MAX_WORD_BUFFER)
1832 m_WordBuffer[m_WordSize++] = ch; 1833 m_WordBuffer[m_WordSize++] = ch;
1833 1834
1834 if (!PDFCharIsNumeric(ch)) 1835 if (!PDFCharIsNumeric(ch))
1835 m_bIsNumber = FALSE; 1836 bIsNumber = false;
1836 if (!GetNextChar(ch)) 1837 if (!GetNextChar(ch))
1837 return; 1838 return bIsNumber;
1838 1839
1839 if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { 1840 if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) {
1840 m_Pos--; 1841 m_Pos--;
1841 break; 1842 break;
1842 } 1843 }
1843 } 1844 }
1845 return bIsNumber;
1844 } 1846 }
1847
1845 CFX_ByteString CPDF_SyntaxParser::ReadString() { 1848 CFX_ByteString CPDF_SyntaxParser::ReadString() {
1846 uint8_t ch; 1849 uint8_t ch;
1847 if (!GetNextChar(ch)) { 1850 if (!GetNextChar(ch)) {
1848 return CFX_ByteString(); 1851 return CFX_ByteString();
1849 } 1852 }
1850 CFX_ByteTextBuf buf; 1853 CFX_ByteTextBuf buf;
1851 int32_t parlevel = 0; 1854 int32_t parlevel = 0;
1852 int32_t status = 0, iEscCode = 0; 1855 int32_t status = 0, iEscCode = 0;
1853 while (1) { 1856 while (1) {
1854 switch (status) { 1857 switch (status) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 while (1) { 1995 while (1) {
1993 if (!GetNextChar(ch)) 1996 if (!GetNextChar(ch))
1994 return; 1997 return;
1995 if (PDFCharIsLineEnding(ch)) 1998 if (PDFCharIsLineEnding(ch))
1996 break; 1999 break;
1997 } 2000 }
1998 } 2001 }
1999 m_Pos--; 2002 m_Pos--;
2000 } 2003 }
2001 2004
2002 CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) { 2005 CFX_ByteString CPDF_SyntaxParser::GetNextWord(bool* bIsNumber) {
2003 GetNextWord(); 2006 bool bWordIsNumber = GetNextWordInternal();
2004 bIsNumber = m_bIsNumber; 2007 if (bIsNumber)
2008 *bIsNumber = bWordIsNumber;
2005 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); 2009 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
2006 } 2010 }
2011
2007 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { 2012 CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
2008 GetNextWord(); 2013 return GetNextWord(nullptr);
2009 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
2010 } 2014 }
2015
2011 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, 2016 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList,
2012 FX_DWORD objnum, 2017 FX_DWORD objnum,
2013 FX_DWORD gennum, 2018 FX_DWORD gennum,
2014 PARSE_CONTEXT* pContext, 2019 PARSE_CONTEXT* pContext,
2015 FX_BOOL bDecrypt) { 2020 FX_BOOL bDecrypt) {
2016 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2021 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2017 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2022 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2018 return NULL; 2023 return NULL;
2019 } 2024 }
2020 FX_FILESIZE SavedPos = m_Pos; 2025 FX_FILESIZE SavedPos = m_Pos;
2021 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2026 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2022 FX_BOOL bIsNumber; 2027 bool bIsNumber;
2023 CFX_ByteString word = GetNextWord(bIsNumber); 2028 CFX_ByteString word = GetNextWord(&bIsNumber);
2024 if (word.GetLength() == 0) { 2029 if (word.GetLength() == 0) {
2025 if (bTypeOnly) 2030 if (bTypeOnly)
2026 return (CPDF_Object*)PDFOBJ_INVALID; 2031 return (CPDF_Object*)PDFOBJ_INVALID;
2027 return NULL; 2032 return NULL;
2028 } 2033 }
2029 if (bIsNumber) { 2034 if (bIsNumber) {
2030 FX_FILESIZE SavedPos = m_Pos; 2035 FX_FILESIZE SavedPos = m_Pos;
2031 CFX_ByteString nextword = GetNextWord(bIsNumber); 2036 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2032 if (bIsNumber) { 2037 if (bIsNumber) {
2033 CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2038 CFX_ByteString nextword2 = GetNextWord(nullptr);
2034 if (nextword2 == "R") { 2039 if (nextword2 == "R") {
2035 FX_DWORD objnum = FXSYS_atoi(word); 2040 FX_DWORD objnum = FXSYS_atoi(word);
2036 if (bTypeOnly) 2041 if (bTypeOnly)
2037 return (CPDF_Object*)PDFOBJ_REFERENCE; 2042 return (CPDF_Object*)PDFOBJ_REFERENCE;
2038 return new CPDF_Reference(pObjList, objnum); 2043 return new CPDF_Reference(pObjList, objnum);
2039 } 2044 }
2040 } 2045 }
2041 m_Pos = SavedPos; 2046 m_Pos = SavedPos;
2042 if (bTypeOnly) 2047 if (bTypeOnly)
2043 return (CPDF_Object*)PDFOBJ_NUMBER; 2048 return (CPDF_Object*)PDFOBJ_NUMBER;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 return (CPDF_Object*)PDFOBJ_DICTIONARY; 2096 return (CPDF_Object*)PDFOBJ_DICTIONARY;
2092 2097
2093 if (pContext) 2098 if (pContext)
2094 pContext->m_DictStart = SavedPos; 2099 pContext->m_DictStart = SavedPos;
2095 2100
2096 int32_t nKeys = 0; 2101 int32_t nKeys = 0;
2097 FX_FILESIZE dwSignValuePos = 0; 2102 FX_FILESIZE dwSignValuePos = 0;
2098 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( 2103 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
2099 new CPDF_Dictionary); 2104 new CPDF_Dictionary);
2100 while (1) { 2105 while (1) {
2101 FX_BOOL bIsNumber; 2106 CFX_ByteString key = GetNextWord(nullptr);
2102 CFX_ByteString key = GetNextWord(bIsNumber);
2103 if (key.IsEmpty()) 2107 if (key.IsEmpty())
2104 return nullptr; 2108 return nullptr;
2105 2109
2106 FX_FILESIZE SavedPos = m_Pos - key.GetLength(); 2110 FX_FILESIZE SavedPos = m_Pos - key.GetLength();
2107 if (key == ">>") 2111 if (key == ">>")
2108 break; 2112 break;
2109 2113
2110 if (key == "endobj") { 2114 if (key == "endobj") {
2111 m_Pos = SavedPos; 2115 m_Pos = SavedPos;
2112 break; 2116 break;
(...skipping 30 matching lines...) Expand all
2143 pDict->SetAt("Contents", pObj); 2147 pDict->SetAt("Contents", pObj);
2144 m_Pos = dwSavePos; 2148 m_Pos = dwSavePos;
2145 } 2149 }
2146 if (pContext) { 2150 if (pContext) {
2147 pContext->m_DictEnd = m_Pos; 2151 pContext->m_DictEnd = m_Pos;
2148 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2152 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2149 return pDict.release(); 2153 return pDict.release();
2150 } 2154 }
2151 } 2155 }
2152 FX_FILESIZE SavedPos = m_Pos; 2156 FX_FILESIZE SavedPos = m_Pos;
2153 FX_BOOL bIsNumber; 2157 CFX_ByteString nextword = GetNextWord(nullptr);
2154 CFX_ByteString nextword = GetNextWord(bIsNumber);
2155 if (nextword != "stream") { 2158 if (nextword != "stream") {
2156 m_Pos = SavedPos; 2159 m_Pos = SavedPos;
2157 return pDict.release(); 2160 return pDict.release();
2158 } 2161 }
2159 2162
2160 return ReadStream(pDict.release(), pContext, objnum, gennum); 2163 return ReadStream(pDict.release(), pContext, objnum, gennum);
2161 } 2164 }
2162 if (word == ">>") { 2165 if (word == ">>") {
2163 m_Pos = SavedPos; 2166 m_Pos = SavedPos;
2164 return nullptr; 2167 return nullptr;
2165 } 2168 }
2166 if (bTypeOnly) 2169 if (bTypeOnly)
2167 return (CPDF_Object*)PDFOBJ_INVALID; 2170 return (CPDF_Object*)PDFOBJ_INVALID;
2168 2171
2169 return nullptr; 2172 return nullptr;
2170 } 2173 }
2171 2174
2172 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict( 2175 CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(
2173 CPDF_IndirectObjects* pObjList, 2176 CPDF_IndirectObjects* pObjList,
2174 FX_DWORD objnum, 2177 FX_DWORD objnum,
2175 FX_DWORD gennum, 2178 FX_DWORD gennum,
2176 struct PARSE_CONTEXT* pContext) { 2179 struct PARSE_CONTEXT* pContext) {
2177 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 2180 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
2178 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) { 2181 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) {
2179 return NULL; 2182 return NULL;
2180 } 2183 }
2181 FX_FILESIZE SavedPos = m_Pos; 2184 FX_FILESIZE SavedPos = m_Pos;
2182 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY); 2185 FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
2183 FX_BOOL bIsNumber; 2186 bool bIsNumber;
2184 CFX_ByteString word = GetNextWord(bIsNumber); 2187 CFX_ByteString word = GetNextWord(&bIsNumber);
2185 if (word.GetLength() == 0) { 2188 if (word.GetLength() == 0) {
2186 if (bTypeOnly) 2189 if (bTypeOnly)
2187 return (CPDF_Object*)PDFOBJ_INVALID; 2190 return (CPDF_Object*)PDFOBJ_INVALID;
2188 return nullptr; 2191 return nullptr;
2189 } 2192 }
2190 if (bIsNumber) { 2193 if (bIsNumber) {
2191 FX_FILESIZE SavedPos = m_Pos; 2194 FX_FILESIZE SavedPos = m_Pos;
2192 CFX_ByteString nextword = GetNextWord(bIsNumber); 2195 CFX_ByteString nextword = GetNextWord(&bIsNumber);
2193 if (bIsNumber) { 2196 if (bIsNumber) {
2194 CFX_ByteString nextword2 = GetNextWord(bIsNumber); 2197 CFX_ByteString nextword2 = GetNextWord(nullptr);
2195 if (nextword2 == "R") { 2198 if (nextword2 == "R") {
2196 if (bTypeOnly) 2199 if (bTypeOnly)
2197 return (CPDF_Object*)PDFOBJ_REFERENCE; 2200 return (CPDF_Object*)PDFOBJ_REFERENCE;
2198 FX_DWORD objnum = FXSYS_atoi(word); 2201 FX_DWORD objnum = FXSYS_atoi(word);
2199 return new CPDF_Reference(pObjList, objnum); 2202 return new CPDF_Reference(pObjList, objnum);
2200 } 2203 }
2201 } 2204 }
2202 m_Pos = SavedPos; 2205 m_Pos = SavedPos;
2203 if (bTypeOnly) 2206 if (bTypeOnly)
2204 return (CPDF_Object*)PDFOBJ_NUMBER; 2207 return (CPDF_Object*)PDFOBJ_NUMBER;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2247 } 2250 }
2248 if (word == "<<") { 2251 if (word == "<<") {
2249 if (bTypeOnly) 2252 if (bTypeOnly)
2250 return (CPDF_Object*)PDFOBJ_DICTIONARY; 2253 return (CPDF_Object*)PDFOBJ_DICTIONARY;
2251 if (pContext) 2254 if (pContext)
2252 pContext->m_DictStart = SavedPos; 2255 pContext->m_DictStart = SavedPos;
2253 2256
2254 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( 2257 std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
2255 new CPDF_Dictionary); 2258 new CPDF_Dictionary);
2256 while (1) { 2259 while (1) {
2257 FX_BOOL bIsNumber;
2258 FX_FILESIZE SavedPos = m_Pos; 2260 FX_FILESIZE SavedPos = m_Pos;
2259 CFX_ByteString key = GetNextWord(bIsNumber); 2261 CFX_ByteString key = GetNextWord(nullptr);
2260 if (key.IsEmpty()) 2262 if (key.IsEmpty())
2261 return nullptr; 2263 return nullptr;
2262 2264
2263 if (key == ">>") 2265 if (key == ">>")
2264 break; 2266 break;
2265 2267
2266 if (key == "endobj") { 2268 if (key == "endobj") {
2267 m_Pos = SavedPos; 2269 m_Pos = SavedPos;
2268 break; 2270 break;
2269 } 2271 }
(...skipping 14 matching lines...) Expand all
2284 obj.release()); 2286 obj.release());
2285 } 2287 }
2286 } 2288 }
2287 if (pContext) { 2289 if (pContext) {
2288 pContext->m_DictEnd = m_Pos; 2290 pContext->m_DictEnd = m_Pos;
2289 if (pContext->m_Flags & PDFPARSE_NOSTREAM) { 2291 if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
2290 return pDict.release(); 2292 return pDict.release();
2291 } 2293 }
2292 } 2294 }
2293 FX_FILESIZE SavedPos = m_Pos; 2295 FX_FILESIZE SavedPos = m_Pos;
2294 FX_BOOL bIsNumber; 2296 CFX_ByteString nextword = GetNextWord(nullptr);
2295 CFX_ByteString nextword = GetNextWord(bIsNumber);
2296 if (nextword != "stream") { 2297 if (nextword != "stream") {
2297 m_Pos = SavedPos; 2298 m_Pos = SavedPos;
2298 return pDict.release(); 2299 return pDict.release();
2299 } 2300 }
2300 2301
2301 return ReadStream(pDict.release(), pContext, objnum, gennum); 2302 return ReadStream(pDict.release(), pContext, objnum, gennum);
2302 } 2303 }
2303 if (word == ">>") { 2304 if (word == ">>") {
2304 m_Pos = SavedPos; 2305 m_Pos = SavedPos;
2305 return nullptr; 2306 return nullptr;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 if (!pCryptoHandler) { 2350 if (!pCryptoHandler) {
2350 FX_BOOL bSearchForKeyword = TRUE; 2351 FX_BOOL bSearchForKeyword = TRUE;
2351 if (len >= 0) { 2352 if (len >= 0) {
2352 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos; 2353 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos;
2353 pos += len; 2354 pos += len;
2354 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) { 2355 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) {
2355 m_Pos = pos.ValueOrDie(); 2356 m_Pos = pos.ValueOrDie();
2356 } 2357 }
2357 m_Pos += ReadEOLMarkers(m_Pos); 2358 m_Pos += ReadEOLMarkers(m_Pos);
2358 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1); 2359 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1);
2359 GetNextWord(); 2360 GetNextWordInternal();
2360 // Earlier version of PDF specification doesn't require EOL marker before 2361 // Earlier version of PDF specification doesn't require EOL marker before
2361 // 'endstream' keyword. If keyword 'endstream' follows the bytes in 2362 // 'endstream' keyword. If keyword 'endstream' follows the bytes in
2362 // specified length, it signals the end of stream. 2363 // specified length, it signals the end of stream.
2363 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.GetPtr(), 2364 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.GetPtr(),
2364 kEndStreamStr.GetLength()) == 0) { 2365 kEndStreamStr.GetLength()) == 0) {
2365 bSearchForKeyword = FALSE; 2366 bSearchForKeyword = FALSE;
2366 } 2367 }
2367 } 2368 }
2368 if (bSearchForKeyword) { 2369 if (bSearchForKeyword) {
2369 // If len is not available, len needs to be calculated 2370 // If len is not available, len needs to be calculated
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
2449 len = dest_buf.GetSize(); 2450 len = dest_buf.GetSize();
2450 dest_buf.DetachBuffer(); 2451 dest_buf.DetachBuffer();
2451 } 2452 }
2452 } 2453 }
2453 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict); 2454 CPDF_Stream* pStream = new CPDF_Stream(pData, len, pDict);
2454 if (pContext) { 2455 if (pContext) {
2455 pContext->m_DataEnd = pContext->m_DataStart + len; 2456 pContext->m_DataEnd = pContext->m_DataStart + len;
2456 } 2457 }
2457 streamStartPos = m_Pos; 2458 streamStartPos = m_Pos;
2458 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1); 2459 FXSYS_memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1);
2459 GetNextWord(); 2460 GetNextWordInternal();
2460 int numMarkers = ReadEOLMarkers(m_Pos); 2461 int numMarkers = ReadEOLMarkers(m_Pos);
2461 if (m_WordSize == kEndObjStr.GetLength() && numMarkers != 0 && 2462 if (m_WordSize == kEndObjStr.GetLength() && numMarkers != 0 &&
2462 FXSYS_memcmp(m_WordBuffer, kEndObjStr.GetPtr(), kEndObjStr.GetLength()) == 2463 FXSYS_memcmp(m_WordBuffer, kEndObjStr.GetPtr(), kEndObjStr.GetLength()) ==
2463 0) { 2464 0) {
2464 m_Pos = streamStartPos; 2465 m_Pos = streamStartPos;
2465 } 2466 }
2466 return pStream; 2467 return pStream;
2467 } 2468 }
2468 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, 2469 void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess,
2469 FX_DWORD HeaderOffset) { 2470 FX_DWORD HeaderOffset) {
2470 FX_Free(m_pFileBuf); 2471 FX_Free(m_pFileBuf);
2471 m_pFileBuf = FX_Alloc(uint8_t, m_BufSize); 2472 m_pFileBuf = FX_Alloc(uint8_t, m_BufSize);
2472 m_HeaderOffset = HeaderOffset; 2473 m_HeaderOffset = HeaderOffset;
2473 m_FileLen = pFileAccess->GetSize(); 2474 m_FileLen = pFileAccess->GetSize();
2474 m_Pos = 0; 2475 m_Pos = 0;
2475 m_pFileAccess = pFileAccess; 2476 m_pFileAccess = pFileAccess;
2476 m_BufOffset = 0; 2477 m_BufOffset = 0;
2477 pFileAccess->ReadBlock( 2478 pFileAccess->ReadBlock(
2478 m_pFileBuf, 0, 2479 m_pFileBuf, 0,
2479 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize)); 2480 (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));
2480 } 2481 }
2481 int32_t CPDF_SyntaxParser::GetDirectNum() { 2482 int32_t CPDF_SyntaxParser::GetDirectNum() {
2482 GetNextWord(); 2483 if (!GetNextWordInternal())
2483 if (!m_bIsNumber) {
2484 return 0; 2484 return 0;
2485 } 2485
2486 m_WordBuffer[m_WordSize] = 0; 2486 m_WordBuffer[m_WordSize] = 0;
2487 return FXSYS_atoi((const FX_CHAR*)m_WordBuffer); 2487 return FXSYS_atoi((const FX_CHAR*)m_WordBuffer);
2488 } 2488 }
2489 2489
2490 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, 2490 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
2491 FX_FILESIZE limit, 2491 FX_FILESIZE limit,
2492 const CFX_ByteStringC& tag, 2492 const CFX_ByteStringC& tag,
2493 FX_BOOL checkKeyword) { 2493 FX_BOOL checkKeyword) {
2494 const FX_DWORD taglen = tag.GetLength(); 2494 const FX_DWORD taglen = tag.GetLength();
2495 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]); 2495 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]);
(...skipping 1113 matching lines...) Expand 10 before | Expand all | Expand 10 after
3609 3609
3610 m_docStatus = PDF_DATAAVAIL_DONE; 3610 m_docStatus = PDF_DATAAVAIL_DONE;
3611 return TRUE; 3611 return TRUE;
3612 } 3612 }
3613 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt( 3613 CPDF_Object* CPDF_DataAvail::ParseIndirectObjectAt(
3614 FX_FILESIZE pos, 3614 FX_FILESIZE pos,
3615 FX_DWORD objnum, 3615 FX_DWORD objnum,
3616 CPDF_IndirectObjects* pObjList) { 3616 CPDF_IndirectObjects* pObjList) {
3617 FX_FILESIZE SavedPos = m_syntaxParser.SavePos(); 3617 FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
3618 m_syntaxParser.RestorePos(pos); 3618 m_syntaxParser.RestorePos(pos);
3619 FX_BOOL bIsNumber; 3619 bool bIsNumber;
3620 CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber); 3620 CFX_ByteString word = m_syntaxParser.GetNextWord(&bIsNumber);
3621 if (!bIsNumber) { 3621 if (!bIsNumber)
3622 return NULL; 3622 return nullptr;
3623 } 3623
3624 FX_DWORD parser_objnum = FXSYS_atoi(word); 3624 FX_DWORD parser_objnum = FXSYS_atoi(word);
3625 if (objnum && parser_objnum != objnum) { 3625 if (objnum && parser_objnum != objnum) {
3626 return NULL; 3626 return nullptr;
3627 } 3627 }
3628 word = m_syntaxParser.GetNextWord(bIsNumber); 3628 word = m_syntaxParser.GetNextWord(&bIsNumber);
3629 if (!bIsNumber) { 3629 if (!bIsNumber)
3630 return NULL; 3630 return nullptr;
3631 } 3631
3632 FX_DWORD gennum = FXSYS_atoi(word); 3632 FX_DWORD gennum = FXSYS_atoi(word);
3633 if (m_syntaxParser.GetKeyword() != "obj") { 3633 if (m_syntaxParser.GetKeyword() != "obj") {
3634 m_syntaxParser.RestorePos(SavedPos); 3634 m_syntaxParser.RestorePos(SavedPos);
3635 return NULL; 3635 return nullptr;
3636 } 3636 }
3637 CPDF_Object* pObj = 3637 CPDF_Object* pObj =
3638 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, 0); 3638 m_syntaxParser.GetObject(pObjList, parser_objnum, gennum, 0);
3639 m_syntaxParser.RestorePos(SavedPos); 3639 m_syntaxParser.RestorePos(SavedPos);
3640 return pObj; 3640 return pObj;
3641 } 3641 }
3642 IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() { 3642 IPDF_DataAvail::DocLinearizationStatus CPDF_DataAvail::IsLinearizedPDF() {
3643 FX_DWORD req_size = 1024; 3643 FX_DWORD req_size = 1024;
3644 if (!m_pFileAvail->IsDataAvail(0, req_size)) { 3644 if (!m_pFileAvail->IsDataAvail(0, req_size)) {
3645 return LinearizationUnknown; 3645 return LinearizationUnknown;
(...skipping 15 matching lines...) Expand all
3661 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) { 3661 FX_BOOL CPDF_DataAvail::IsLinearizedFile(uint8_t* pData, FX_DWORD dwLen) {
3662 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE)); 3662 ScopedFileStream file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));
3663 int32_t offset = GetHeaderOffset(file.get()); 3663 int32_t offset = GetHeaderOffset(file.get());
3664 if (offset == -1) { 3664 if (offset == -1) {
3665 m_docStatus = PDF_DATAAVAIL_ERROR; 3665 m_docStatus = PDF_DATAAVAIL_ERROR;
3666 return FALSE; 3666 return FALSE;
3667 } 3667 }
3668 m_dwHeaderOffset = offset; 3668 m_dwHeaderOffset = offset;
3669 m_syntaxParser.InitParser(file.get(), offset); 3669 m_syntaxParser.InitParser(file.get(), offset);
3670 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9); 3670 m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);
3671 FX_BOOL bNumber = FALSE; 3671 bool bNumber;
3672 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber); 3672 CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(&bNumber);
3673 if (!bNumber) { 3673 if (!bNumber)
3674 return FALSE; 3674 return FALSE;
3675 } 3675
3676 FX_DWORD objnum = FXSYS_atoi(wordObjNum); 3676 FX_DWORD objnum = FXSYS_atoi(wordObjNum);
3677 if (m_pLinearized) { 3677 if (m_pLinearized) {
3678 m_pLinearized->Release(); 3678 m_pLinearized->Release();
3679 m_pLinearized = NULL; 3679 m_pLinearized = NULL;
3680 } 3680 }
3681 m_pLinearized = 3681 m_pLinearized =
3682 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum); 3682 ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
3683 if (!m_pLinearized) { 3683 if (!m_pLinearized) {
3684 return FALSE; 3684 return FALSE;
3685 } 3685 }
(...skipping 19 matching lines...) Expand all
3705 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) { 3705 FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints) {
3706 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0); 3706 FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
3707 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos); 3707 FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);
3708 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) { 3708 if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
3709 uint8_t buffer[1024]; 3709 uint8_t buffer[1024];
3710 m_pFileRead->ReadBlock(buffer, req_pos, dwSize); 3710 m_pFileRead->ReadBlock(buffer, req_pos, dwSize);
3711 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE)); 3711 ScopedFileStream file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));
3712 m_syntaxParser.InitParser(file.get(), 0); 3712 m_syntaxParser.InitParser(file.get(), 0);
3713 m_syntaxParser.RestorePos(dwSize - 1); 3713 m_syntaxParser.RestorePos(dwSize - 1);
3714 if (m_syntaxParser.SearchWord("startxref", TRUE, FALSE, dwSize)) { 3714 if (m_syntaxParser.SearchWord("startxref", TRUE, FALSE, dwSize)) {
3715 FX_BOOL bNumber; 3715 m_syntaxParser.GetNextWord(nullptr);
3716 m_syntaxParser.GetNextWord(bNumber); 3716 bool bNumber;
3717 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber); 3717 CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(&bNumber);
3718 if (!bNumber) { 3718 if (!bNumber) {
3719 m_docStatus = PDF_DATAAVAIL_ERROR; 3719 m_docStatus = PDF_DATAAVAIL_ERROR;
3720 return FALSE; 3720 return FALSE;
3721 } 3721 }
3722 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); 3722 m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
3723 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) { 3723 if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {
3724 m_docStatus = PDF_DATAAVAIL_LOADALLFILE; 3724 m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
3725 return TRUE; 3725 return TRUE;
3726 } 3726 }
3727 m_dwLastXRefOffset = m_dwXRefOffset; 3727 m_dwLastXRefOffset = m_dwXRefOffset;
(...skipping 12 matching lines...) Expand all
3740 xref_offset = 0; 3740 xref_offset = 0;
3741 FX_DWORD req_size = 3741 FX_DWORD req_size =
3742 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512); 3742 (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
3743 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) { 3743 if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {
3744 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam); 3744 int32_t iSize = (int32_t)(m_Pos + req_size - m_dwCurrentXRefSteam);
3745 CFX_BinaryBuf buf(iSize); 3745 CFX_BinaryBuf buf(iSize);
3746 uint8_t* pBuf = buf.GetBuffer(); 3746 uint8_t* pBuf = buf.GetBuffer();
3747 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize); 3747 m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
3748 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE)); 3748 ScopedFileStream file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
3749 m_parser.m_Syntax.InitParser(file.get(), 0); 3749 m_parser.m_Syntax.InitParser(file.get(), 0);
3750 FX_BOOL bNumber = FALSE; 3750 bool bNumber;
3751 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber); 3751 CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(&bNumber);
3752 if (!bNumber) { 3752 if (!bNumber)
3753 return -1; 3753 return -1;
3754 } 3754
3755 FX_DWORD objNum = FXSYS_atoi(objnum); 3755 FX_DWORD objNum = FXSYS_atoi(objnum);
3756 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL); 3756 CPDF_Object* pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);
3757 if (!pObj) { 3757 if (!pObj) {
3758 m_Pos += m_parser.m_Syntax.SavePos(); 3758 m_Pos += m_parser.m_Syntax.SavePos();
3759 return 0; 3759 return 0;
3760 } 3760 }
3761 CPDF_Dictionary* pDict = pObj->GetDict(); 3761 CPDF_Dictionary* pDict = pObj->GetDict();
3762 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr); 3762 CPDF_Name* pName = ToName(pDict ? pDict->GetElement("Type") : nullptr);
3763 if (pName) { 3763 if (pName) {
3764 if (pName->GetString() == "XRef") { 3764 if (pName->GetString() == "XRef") {
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after
4987 if (!m_pLinearizedDict) 4987 if (!m_pLinearizedDict)
4988 return -1; 4988 return -1;
4989 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4989 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
4990 if (!pRange) 4990 if (!pRange)
4991 return -1; 4991 return -1;
4992 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4992 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
4993 if (!pStreamLen) 4993 if (!pStreamLen)
4994 return -1; 4994 return -1;
4995 return pStreamLen->GetInteger(); 4995 return pStreamLen->GetInteger();
4996 } 4996 }
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