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

Side by Side Diff: core/fpdfapi/parser/cpdf_syntax_parser.cpp

Issue 2477443002: Remove FX_BOOL from core (Closed)
Patch Set: Created 4 years, 1 month 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 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 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/fpdfapi/parser/cpdf_syntax_parser.h" 7 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 : m_MetadataObjnum(0), 44 : m_MetadataObjnum(0),
45 m_pFileAccess(nullptr), 45 m_pFileAccess(nullptr),
46 m_pFileBuf(nullptr), 46 m_pFileBuf(nullptr),
47 m_BufSize(CPDF_ModuleMgr::kFileBufSize), 47 m_BufSize(CPDF_ModuleMgr::kFileBufSize),
48 m_pPool(pPool) {} 48 m_pPool(pPool) {}
49 49
50 CPDF_SyntaxParser::~CPDF_SyntaxParser() { 50 CPDF_SyntaxParser::~CPDF_SyntaxParser() {
51 FX_Free(m_pFileBuf); 51 FX_Free(m_pFileBuf);
52 } 52 }
53 53
54 FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) { 54 bool CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, uint8_t& ch) {
55 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos); 55 CFX_AutoRestorer<FX_FILESIZE> save_pos(&m_Pos);
56 m_Pos = pos; 56 m_Pos = pos;
57 return GetNextChar(ch); 57 return GetNextChar(ch);
58 } 58 }
59 59
60 FX_BOOL CPDF_SyntaxParser::GetNextChar(uint8_t& ch) { 60 bool CPDF_SyntaxParser::GetNextChar(uint8_t& ch) {
61 FX_FILESIZE pos = m_Pos + m_HeaderOffset; 61 FX_FILESIZE pos = m_Pos + m_HeaderOffset;
62 if (pos >= m_FileLen) 62 if (pos >= m_FileLen)
63 return FALSE; 63 return false;
64 64
65 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { 65 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
66 FX_FILESIZE read_pos = pos; 66 FX_FILESIZE read_pos = pos;
67 uint32_t read_size = m_BufSize; 67 uint32_t read_size = m_BufSize;
68 if ((FX_FILESIZE)read_size > m_FileLen) 68 if ((FX_FILESIZE)read_size > m_FileLen)
69 read_size = (uint32_t)m_FileLen; 69 read_size = (uint32_t)m_FileLen;
70 70
71 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { 71 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
72 if (m_FileLen < (FX_FILESIZE)read_size) { 72 if (m_FileLen < (FX_FILESIZE)read_size) {
73 read_pos = 0; 73 read_pos = 0;
74 read_size = (uint32_t)m_FileLen; 74 read_size = (uint32_t)m_FileLen;
75 } else { 75 } else {
76 read_pos = m_FileLen - read_size; 76 read_pos = m_FileLen - read_size;
77 } 77 }
78 } 78 }
79 79
80 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) 80 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size))
81 return FALSE; 81 return false;
82 82
83 m_BufOffset = read_pos; 83 m_BufOffset = read_pos;
84 } 84 }
85 ch = m_pFileBuf[pos - m_BufOffset]; 85 ch = m_pFileBuf[pos - m_BufOffset];
86 m_Pos++; 86 m_Pos++;
87 return TRUE; 87 return true;
88 } 88 }
89 89
90 FX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, uint8_t& ch) { 90 bool CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, uint8_t& ch) {
91 pos += m_HeaderOffset; 91 pos += m_HeaderOffset;
92 if (pos >= m_FileLen) 92 if (pos >= m_FileLen)
93 return FALSE; 93 return false;
94 94
95 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) { 95 if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
96 FX_FILESIZE read_pos; 96 FX_FILESIZE read_pos;
97 if (pos < (FX_FILESIZE)m_BufSize) 97 if (pos < (FX_FILESIZE)m_BufSize)
98 read_pos = 0; 98 read_pos = 0;
99 else 99 else
100 read_pos = pos - m_BufSize + 1; 100 read_pos = pos - m_BufSize + 1;
101 101
102 uint32_t read_size = m_BufSize; 102 uint32_t read_size = m_BufSize;
103 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) { 103 if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
104 if (m_FileLen < (FX_FILESIZE)read_size) { 104 if (m_FileLen < (FX_FILESIZE)read_size) {
105 read_pos = 0; 105 read_pos = 0;
106 read_size = (uint32_t)m_FileLen; 106 read_size = (uint32_t)m_FileLen;
107 } else { 107 } else {
108 read_pos = m_FileLen - read_size; 108 read_pos = m_FileLen - read_size;
109 } 109 }
110 } 110 }
111 111
112 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) 112 if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size))
113 return FALSE; 113 return false;
114 114
115 m_BufOffset = read_pos; 115 m_BufOffset = read_pos;
116 } 116 }
117 ch = m_pFileBuf[pos - m_BufOffset]; 117 ch = m_pFileBuf[pos - m_BufOffset];
118 return TRUE; 118 return true;
119 } 119 }
120 120
121 FX_BOOL CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, uint32_t size) { 121 bool CPDF_SyntaxParser::ReadBlock(uint8_t* pBuf, uint32_t size) {
122 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) 122 if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size))
123 return FALSE; 123 return false;
124 m_Pos += size; 124 m_Pos += size;
125 return TRUE; 125 return true;
126 } 126 }
127 127
128 void CPDF_SyntaxParser::GetNextWordInternal(bool* bIsNumber) { 128 void CPDF_SyntaxParser::GetNextWordInternal(bool* bIsNumber) {
129 m_WordSize = 0; 129 m_WordSize = 0;
130 if (bIsNumber) 130 if (bIsNumber)
131 *bIsNumber = true; 131 *bIsNumber = true;
132 132
133 uint8_t ch; 133 uint8_t ch;
134 if (!GetNextChar(ch)) 134 if (!GetNextChar(ch))
135 return; 135 return;
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize); 374 return CFX_ByteString((const FX_CHAR*)m_WordBuffer, m_WordSize);
375 } 375 }
376 376
377 CFX_ByteString CPDF_SyntaxParser::GetKeyword() { 377 CFX_ByteString CPDF_SyntaxParser::GetKeyword() {
378 return GetNextWord(nullptr); 378 return GetNextWord(nullptr);
379 } 379 }
380 380
381 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList, 381 CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjectHolder* pObjList,
382 uint32_t objnum, 382 uint32_t objnum,
383 uint32_t gennum, 383 uint32_t gennum,
384 FX_BOOL bDecrypt) { 384 bool bDecrypt) {
385 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); 385 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
386 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth) 386 if (++s_CurrentRecursionDepth > kParserMaxRecursionDepth)
387 return nullptr; 387 return nullptr;
388 388
389 FX_FILESIZE SavedObjPos = m_Pos; 389 FX_FILESIZE SavedObjPos = m_Pos;
390 bool bIsNumber; 390 bool bIsNumber;
391 CFX_ByteString word = GetNextWord(&bIsNumber); 391 CFX_ByteString word = GetNextWord(&bIsNumber);
392 if (word.GetLength() == 0) 392 if (word.GetLength() == 0)
393 return nullptr; 393 return nullptr;
394 394
(...skipping 12 matching lines...) Expand all
407 if (word == "true" || word == "false") 407 if (word == "true" || word == "false")
408 return new CPDF_Boolean(word == "true"); 408 return new CPDF_Boolean(word == "true");
409 409
410 if (word == "null") 410 if (word == "null")
411 return new CPDF_Null; 411 return new CPDF_Null;
412 412
413 if (word == "(") { 413 if (word == "(") {
414 CFX_ByteString str = ReadString(); 414 CFX_ByteString str = ReadString();
415 if (m_pCryptoHandler && bDecrypt) 415 if (m_pCryptoHandler && bDecrypt)
416 m_pCryptoHandler->Decrypt(objnum, gennum, str); 416 m_pCryptoHandler->Decrypt(objnum, gennum, str);
417 return new CPDF_String(MaybeIntern(str), FALSE); 417 return new CPDF_String(MaybeIntern(str), false);
418 } 418 }
419 419
420 if (word == "<") { 420 if (word == "<") {
421 CFX_ByteString str = ReadHexString(); 421 CFX_ByteString str = ReadHexString();
422 if (m_pCryptoHandler && bDecrypt) 422 if (m_pCryptoHandler && bDecrypt)
423 m_pCryptoHandler->Decrypt(objnum, gennum, str); 423 m_pCryptoHandler->Decrypt(objnum, gennum, str);
424 return new CPDF_String(MaybeIntern(str), TRUE); 424 return new CPDF_String(MaybeIntern(str), true);
425 } 425 }
426 426
427 if (word == "[") { 427 if (word == "[") {
428 CPDF_Array* pArray = new CPDF_Array; 428 CPDF_Array* pArray = new CPDF_Array;
429 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) 429 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true))
430 pArray->Add(pObj); 430 pArray->Add(pObj);
431 431
432 return pArray; 432 return pArray;
433 } 433 }
434 434
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 if (word == "true" || word == "false") 528 if (word == "true" || word == "false")
529 return new CPDF_Boolean(word == "true"); 529 return new CPDF_Boolean(word == "true");
530 530
531 if (word == "null") 531 if (word == "null")
532 return new CPDF_Null; 532 return new CPDF_Null;
533 533
534 if (word == "(") { 534 if (word == "(") {
535 CFX_ByteString str = ReadString(); 535 CFX_ByteString str = ReadString();
536 if (m_pCryptoHandler) 536 if (m_pCryptoHandler)
537 m_pCryptoHandler->Decrypt(objnum, gennum, str); 537 m_pCryptoHandler->Decrypt(objnum, gennum, str);
538 return new CPDF_String(MaybeIntern(str), FALSE); 538 return new CPDF_String(MaybeIntern(str), false);
539 } 539 }
540 540
541 if (word == "<") { 541 if (word == "<") {
542 CFX_ByteString str = ReadHexString(); 542 CFX_ByteString str = ReadHexString();
543 if (m_pCryptoHandler) 543 if (m_pCryptoHandler)
544 m_pCryptoHandler->Decrypt(objnum, gennum, str); 544 m_pCryptoHandler->Decrypt(objnum, gennum, str);
545 return new CPDF_String(MaybeIntern(str), TRUE); 545 return new CPDF_String(MaybeIntern(str), true);
546 } 546 }
547 547
548 if (word == "[") { 548 if (word == "[") {
549 std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray( 549 std::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray(
550 new CPDF_Array); 550 new CPDF_Array);
551 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true)) 551 while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, true))
552 pArray->Add(pObj); 552 pArray->Add(pObj);
553 553
554 return m_WordBuffer[0] == ']' ? pArray.release() : nullptr; 554 return m_WordBuffer[0] == ']' ? pArray.release() : nullptr;
555 } 555 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // Locate the start of stream. 643 // Locate the start of stream.
644 ToNextLine(); 644 ToNextLine();
645 FX_FILESIZE streamStartPos = m_Pos; 645 FX_FILESIZE streamStartPos = m_Pos;
646 646
647 const CFX_ByteStringC kEndStreamStr("endstream"); 647 const CFX_ByteStringC kEndStreamStr("endstream");
648 const CFX_ByteStringC kEndObjStr("endobj"); 648 const CFX_ByteStringC kEndObjStr("endobj");
649 649
650 CPDF_CryptoHandler* pCryptoHandler = 650 CPDF_CryptoHandler* pCryptoHandler =
651 objnum == (uint32_t)m_MetadataObjnum ? nullptr : m_pCryptoHandler.get(); 651 objnum == (uint32_t)m_MetadataObjnum ? nullptr : m_pCryptoHandler.get();
652 if (!pCryptoHandler) { 652 if (!pCryptoHandler) {
653 FX_BOOL bSearchForKeyword = TRUE; 653 bool bSearchForKeyword = true;
654 if (len >= 0) { 654 if (len >= 0) {
655 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos; 655 pdfium::base::CheckedNumeric<FX_FILESIZE> pos = m_Pos;
656 pos += len; 656 pos += len;
657 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen) 657 if (pos.IsValid() && pos.ValueOrDie() < m_FileLen)
658 m_Pos = pos.ValueOrDie(); 658 m_Pos = pos.ValueOrDie();
659 659
660 m_Pos += ReadEOLMarkers(m_Pos); 660 m_Pos += ReadEOLMarkers(m_Pos);
661 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1); 661 FXSYS_memset(m_WordBuffer, 0, kEndStreamStr.GetLength() + 1);
662 GetNextWordInternal(nullptr); 662 GetNextWordInternal(nullptr);
663 // Earlier version of PDF specification doesn't require EOL marker before 663 // Earlier version of PDF specification doesn't require EOL marker before
664 // 'endstream' keyword. If keyword 'endstream' follows the bytes in 664 // 'endstream' keyword. If keyword 'endstream' follows the bytes in
665 // specified length, it signals the end of stream. 665 // specified length, it signals the end of stream.
666 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.raw_str(), 666 if (FXSYS_memcmp(m_WordBuffer, kEndStreamStr.raw_str(),
667 kEndStreamStr.GetLength()) == 0) { 667 kEndStreamStr.GetLength()) == 0) {
668 bSearchForKeyword = FALSE; 668 bSearchForKeyword = false;
669 } 669 }
670 } 670 }
671 671
672 if (bSearchForKeyword) { 672 if (bSearchForKeyword) {
673 // If len is not available, len needs to be calculated 673 // If len is not available, len needs to be calculated
674 // by searching the keywords "endstream" or "endobj". 674 // by searching the keywords "endstream" or "endobj".
675 m_Pos = streamStartPos; 675 m_Pos = streamStartPos;
676 FX_FILESIZE endStreamOffset = 0; 676 FX_FILESIZE endStreamOffset = 0;
677 while (endStreamOffset >= 0) { 677 while (endStreamOffset >= 0) {
678 endStreamOffset = FindTag(kEndStreamStr, 0); 678 endStreamOffset = FindTag(kEndStreamStr, 0);
679 679
680 // Can't find "endstream". 680 // Can't find "endstream".
681 if (endStreamOffset < 0) 681 if (endStreamOffset < 0)
682 break; 682 break;
683 683
684 // Stop searching when "endstream" is found. 684 // Stop searching when "endstream" is found.
685 if (IsWholeWord(m_Pos - kEndStreamStr.GetLength(), m_FileLen, 685 if (IsWholeWord(m_Pos - kEndStreamStr.GetLength(), m_FileLen,
686 kEndStreamStr, TRUE)) { 686 kEndStreamStr, true)) {
687 endStreamOffset = m_Pos - streamStartPos - kEndStreamStr.GetLength(); 687 endStreamOffset = m_Pos - streamStartPos - kEndStreamStr.GetLength();
688 break; 688 break;
689 } 689 }
690 } 690 }
691 691
692 m_Pos = streamStartPos; 692 m_Pos = streamStartPos;
693 FX_FILESIZE endObjOffset = 0; 693 FX_FILESIZE endObjOffset = 0;
694 while (endObjOffset >= 0) { 694 while (endObjOffset >= 0) {
695 endObjOffset = FindTag(kEndObjStr, 0); 695 endObjOffset = FindTag(kEndObjStr, 0);
696 696
697 // Can't find "endobj". 697 // Can't find "endobj".
698 if (endObjOffset < 0) 698 if (endObjOffset < 0)
699 break; 699 break;
700 700
701 // Stop searching when "endobj" is found. 701 // Stop searching when "endobj" is found.
702 if (IsWholeWord(m_Pos - kEndObjStr.GetLength(), m_FileLen, kEndObjStr, 702 if (IsWholeWord(m_Pos - kEndObjStr.GetLength(), m_FileLen, kEndObjStr,
703 TRUE)) { 703 true)) {
704 endObjOffset = m_Pos - streamStartPos - kEndObjStr.GetLength(); 704 endObjOffset = m_Pos - streamStartPos - kEndObjStr.GetLength();
705 break; 705 break;
706 } 706 }
707 } 707 }
708 708
709 // Can't find "endstream" or "endobj". 709 // Can't find "endstream" or "endobj".
710 if (endStreamOffset < 0 && endObjOffset < 0) { 710 if (endStreamOffset < 0 && endObjOffset < 0) {
711 pDict->Release(); 711 pDict->Release();
712 return nullptr; 712 return nullptr;
713 } 713 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 if (!bIsNumber) 803 if (!bIsNumber)
804 return 0; 804 return 0;
805 805
806 m_WordBuffer[m_WordSize] = 0; 806 m_WordBuffer[m_WordSize] = 0;
807 return FXSYS_atoui(reinterpret_cast<const FX_CHAR*>(m_WordBuffer)); 807 return FXSYS_atoui(reinterpret_cast<const FX_CHAR*>(m_WordBuffer));
808 } 808 }
809 809
810 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, 810 bool CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos,
811 FX_FILESIZE limit, 811 FX_FILESIZE limit,
812 const CFX_ByteStringC& tag, 812 const CFX_ByteStringC& tag,
813 FX_BOOL checkKeyword) { 813 bool checkKeyword) {
814 const uint32_t taglen = tag.GetLength(); 814 const uint32_t taglen = tag.GetLength();
815 815
816 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]); 816 bool bCheckLeft = !PDFCharIsDelimiter(tag[0]) && !PDFCharIsWhitespace(tag[0]);
817 bool bCheckRight = !PDFCharIsDelimiter(tag[taglen - 1]) && 817 bool bCheckRight = !PDFCharIsDelimiter(tag[taglen - 1]) &&
818 !PDFCharIsWhitespace(tag[taglen - 1]); 818 !PDFCharIsWhitespace(tag[taglen - 1]);
819 819
820 uint8_t ch; 820 uint8_t ch;
821 if (bCheckRight && startpos + (int32_t)taglen <= limit && 821 if (bCheckRight && startpos + (int32_t)taglen <= limit &&
822 GetCharAt(startpos + (int32_t)taglen, ch)) { 822 GetCharAt(startpos + (int32_t)taglen, ch)) {
823 if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) || 823 if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) ||
824 (checkKeyword && PDFCharIsDelimiter(ch))) { 824 (checkKeyword && PDFCharIsDelimiter(ch))) {
825 return false; 825 return false;
826 } 826 }
827 } 827 }
828 828
829 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { 829 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) {
830 if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) || 830 if (PDFCharIsNumeric(ch) || PDFCharIsOther(ch) ||
831 (checkKeyword && PDFCharIsDelimiter(ch))) { 831 (checkKeyword && PDFCharIsDelimiter(ch))) {
832 return false; 832 return false;
833 } 833 }
834 } 834 }
835 return true; 835 return true;
836 } 836 }
837 837
838 // TODO(dsinclair): Split into a SearchWordForward and SearchWordBackwards 838 // TODO(dsinclair): Split into a SearchWordForward and SearchWordBackwards
839 // and drop the bool. 839 // and drop the bool.
840 FX_BOOL CPDF_SyntaxParser::SearchWord(const CFX_ByteStringC& tag, 840 bool CPDF_SyntaxParser::SearchWord(const CFX_ByteStringC& tag,
841 FX_BOOL bWholeWord, 841 bool bWholeWord,
842 FX_BOOL bForward, 842 bool bForward,
843 FX_FILESIZE limit) { 843 FX_FILESIZE limit) {
844 int32_t taglen = tag.GetLength(); 844 int32_t taglen = tag.GetLength();
845 if (taglen == 0) 845 if (taglen == 0)
846 return FALSE; 846 return false;
847 847
848 FX_FILESIZE pos = m_Pos; 848 FX_FILESIZE pos = m_Pos;
849 int32_t offset = 0; 849 int32_t offset = 0;
850 if (!bForward) 850 if (!bForward)
851 offset = taglen - 1; 851 offset = taglen - 1;
852 852
853 const uint8_t* tag_data = tag.raw_str(); 853 const uint8_t* tag_data = tag.raw_str();
854 uint8_t byte; 854 uint8_t byte;
855 while (1) { 855 while (1) {
856 if (bForward) { 856 if (bForward) {
857 if (limit && pos >= m_Pos + limit) 857 if (limit && pos >= m_Pos + limit)
858 return FALSE; 858 return false;
859 859
860 if (!GetCharAt(pos, byte)) 860 if (!GetCharAt(pos, byte))
861 return FALSE; 861 return false;
862 862
863 } else { 863 } else {
864 if (limit && pos <= m_Pos - limit) 864 if (limit && pos <= m_Pos - limit)
865 return FALSE; 865 return false;
866 866
867 if (!GetCharAtBackward(pos, byte)) 867 if (!GetCharAtBackward(pos, byte))
868 return FALSE; 868 return false;
869 } 869 }
870 870
871 if (byte == tag_data[offset]) { 871 if (byte == tag_data[offset]) {
872 if (bForward) { 872 if (bForward) {
873 offset++; 873 offset++;
874 if (offset < taglen) { 874 if (offset < taglen) {
875 pos++; 875 pos++;
876 continue; 876 continue;
877 } 877 }
878 } else { 878 } else {
879 offset--; 879 offset--;
880 if (offset >= 0) { 880 if (offset >= 0) {
881 pos--; 881 pos--;
882 continue; 882 continue;
883 } 883 }
884 } 884 }
885 885
886 FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos; 886 FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos;
887 if (!bWholeWord || IsWholeWord(startpos, limit, tag, FALSE)) { 887 if (!bWholeWord || IsWholeWord(startpos, limit, tag, false)) {
888 m_Pos = startpos; 888 m_Pos = startpos;
889 return TRUE; 889 return true;
890 } 890 }
891 } 891 }
892 892
893 if (bForward) { 893 if (bForward) {
894 offset = byte == tag_data[0] ? 1 : 0; 894 offset = byte == tag_data[0] ? 1 : 0;
895 pos++; 895 pos++;
896 } else { 896 } else {
897 offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1; 897 offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;
898 pos--; 898 pos--;
899 } 899 }
900 900
901 if (pos < 0) 901 if (pos < 0)
902 return FALSE; 902 return false;
903 } 903 }
904 904
905 return FALSE; 905 return false;
906 } 906 }
907 907
908 int32_t CPDF_SyntaxParser::SearchMultiWord(const CFX_ByteStringC& tags, 908 int32_t CPDF_SyntaxParser::SearchMultiWord(const CFX_ByteStringC& tags,
909 FX_BOOL bWholeWord, 909 bool bWholeWord,
910 FX_FILESIZE limit) { 910 FX_FILESIZE limit) {
911 int32_t ntags = 1; 911 int32_t ntags = 1;
912 for (int i = 0; i < tags.GetLength(); ++i) { 912 for (int i = 0; i < tags.GetLength(); ++i) {
913 if (tags[i] == 0) 913 if (tags[i] == 0)
914 ++ntags; 914 ++ntags;
915 } 915 }
916 916
917 // Ensure that the input byte string happens to be nul-terminated. This 917 // Ensure that the input byte string happens to be nul-terminated. This
918 // need not be the case, but the loop below uses this guarantee to put 918 // need not be the case, but the loop below uses this guarantee to put
919 // the last pattern into the vector. 919 // the last pattern into the vector.
(...skipping 24 matching lines...) Expand all
944 if (pat.m_bsTag[pat.m_Offset] != byte) { 944 if (pat.m_bsTag[pat.m_Offset] != byte) {
945 pat.m_Offset = (pat.m_bsTag[0] == byte) ? 1 : 0; 945 pat.m_Offset = (pat.m_bsTag[0] == byte) ? 1 : 0;
946 continue; 946 continue;
947 } 947 }
948 948
949 ++pat.m_Offset; 949 ++pat.m_Offset;
950 if (pat.m_Offset != pat.m_bsTag.GetLength()) 950 if (pat.m_Offset != pat.m_bsTag.GetLength())
951 continue; 951 continue;
952 952
953 if (!bWholeWord || IsWholeWord(pos - pat.m_bsTag.GetLength(), limit, 953 if (!bWholeWord || IsWholeWord(pos - pat.m_bsTag.GetLength(), limit,
954 pat.m_bsTag, FALSE)) { 954 pat.m_bsTag, false)) {
955 return i; 955 return i;
956 } 956 }
957 957
958 pat.m_Offset = (pat.m_bsTag[0] == byte) ? 1 : 0; 958 pat.m_Offset = (pat.m_bsTag[0] == byte) ? 1 : 0;
959 } 959 }
960 } 960 }
961 return -1; 961 return -1;
962 } 962 }
963 963
964 FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag, 964 FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag,
(...skipping 23 matching lines...) Expand all
988 } 988 }
989 989
990 void CPDF_SyntaxParser::SetEncrypt( 990 void CPDF_SyntaxParser::SetEncrypt(
991 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) { 991 std::unique_ptr<CPDF_CryptoHandler> pCryptoHandler) {
992 m_pCryptoHandler = std::move(pCryptoHandler); 992 m_pCryptoHandler = std::move(pCryptoHandler);
993 } 993 }
994 994
995 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) { 995 CFX_ByteString CPDF_SyntaxParser::MaybeIntern(const CFX_ByteString& str) {
996 return m_pPool ? m_pPool->Intern(str) : str; 996 return m_pPool ? m_pPool->Intern(str) : str;
997 } 997 }
OLDNEW
« no previous file with comments | « core/fpdfapi/parser/cpdf_syntax_parser.h ('k') | core/fpdfapi/parser/cpdf_syntax_parser_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698