| OLD | NEW |
| 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 "../../../include/fpdfapi/fpdf_parser.h" | 7 #include "../../../include/fpdfapi/fpdf_parser.h" |
| 8 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
| 9 #include "../../../include/fpdfapi/fpdf_page.h" | 9 #include "../../../include/fpdfapi/fpdf_page.h" |
| 10 #include "../../../../third_party/numerics/safe_math.h" | 10 #include "../../../../third_party/numerics/safe_math.h" |
| 11 #include "../fpdf_page/pageint.h" | 11 #include "../fpdf_page/pageint.h" |
| 12 #include <utility> | 12 #include <utility> |
| 13 #include <vector> | 13 #include <vector> |
| 14 | 14 |
| 15 extern const FX_LPCSTR _PDF_CharType; | |
| 16 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) | 15 FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict) |
| 17 { | 16 { |
| 18 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); | 17 CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type")); |
| 19 if (!pType) { | 18 if (!pType) { |
| 20 pType = pDict->GetElementValue(FX_BSTRC("FT")); | 19 pType = pDict->GetElementValue(FX_BSTRC("FT")); |
| 21 if (!pType) { | 20 if (!pType) { |
| 22 return FALSE; | 21 return FALSE; |
| 23 } | 22 } |
| 24 } | 23 } |
| 25 if (pType->GetString() == FX_BSTRC("Sig")) { | 24 if (pType->GetString() == FX_BSTRC("Sig")) { |
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 if (size > 4096) { | 640 if (size > 4096) { |
| 642 size = 4096; | 641 size = 4096; |
| 643 } | 642 } |
| 644 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { | 643 if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) { |
| 645 break; | 644 break; |
| 646 } | 645 } |
| 647 for (FX_DWORD i = 0; i < size; i ++) { | 646 for (FX_DWORD i = 0; i < size; i ++) { |
| 648 FX_BYTE byte = buffer[i]; | 647 FX_BYTE byte = buffer[i]; |
| 649 switch (status) { | 648 switch (status) { |
| 650 case 0: | 649 case 0: |
| 651 if (_PDF_CharType[byte] == 'W') { | 650 if (PDF_CharType[byte] == 'W') { |
| 652 status = 1; | 651 status = 1; |
| 653 } | 652 } |
| 654 if (byte <= '9' && byte >= '0') { | 653 if (byte <= '9' && byte >= '0') { |
| 655 --i; | 654 --i; |
| 656 status = 1; | 655 status = 1; |
| 657 } | 656 } |
| 658 if (byte == '%') { | 657 if (byte == '%') { |
| 659 inside_index = 0; | 658 inside_index = 0; |
| 660 status = 9; | 659 status = 9; |
| 661 } | 660 } |
| 662 if (byte == '(') { | 661 if (byte == '(') { |
| 663 status = 10; | 662 status = 10; |
| 664 depth = 1; | 663 depth = 1; |
| 665 } | 664 } |
| 666 if (byte == '<') { | 665 if (byte == '<') { |
| 667 inside_index = 1; | 666 inside_index = 1; |
| 668 status = 11; | 667 status = 11; |
| 669 } | 668 } |
| 670 if (byte == '\\') { | 669 if (byte == '\\') { |
| 671 status = 13; | 670 status = 13; |
| 672 } | 671 } |
| 673 if (byte == 't') { | 672 if (byte == 't') { |
| 674 status = 7; | 673 status = 7; |
| 675 inside_index = 1; | 674 inside_index = 1; |
| 676 } | 675 } |
| 677 break; | 676 break; |
| 678 case 1: | 677 case 1: |
| 679 if (_PDF_CharType[byte] == 'W') { | 678 if (PDF_CharType[byte] == 'W') { |
| 680 break; | 679 break; |
| 681 } else if (byte <= '9' && byte >= '0') { | 680 } else if (byte <= '9' && byte >= '0') { |
| 682 start_pos = pos + i; | 681 start_pos = pos + i; |
| 683 status = 2; | 682 status = 2; |
| 684 objnum = byte - '0'; | 683 objnum = byte - '0'; |
| 685 } else if (byte == 't') { | 684 } else if (byte == 't') { |
| 686 status = 7; | 685 status = 7; |
| 687 inside_index = 1; | 686 inside_index = 1; |
| 688 } else if (byte == 'x') { | 687 } else if (byte == 'x') { |
| 689 status = 8; | 688 status = 8; |
| 690 inside_index = 1; | 689 inside_index = 1; |
| 691 } else { | 690 } else { |
| 692 --i; | 691 --i; |
| 693 status = 0; | 692 status = 0; |
| 694 } | 693 } |
| 695 break; | 694 break; |
| 696 case 2: | 695 case 2: |
| 697 if (byte <= '9' && byte >= '0') { | 696 if (byte <= '9' && byte >= '0') { |
| 698 objnum = objnum * 10 + byte - '0'; | 697 objnum = objnum * 10 + byte - '0'; |
| 699 break; | 698 break; |
| 700 } else if (_PDF_CharType[byte] == 'W') { | 699 } else if (PDF_CharType[byte] == 'W') { |
| 701 status = 3; | 700 status = 3; |
| 702 } else { | 701 } else { |
| 703 --i; | 702 --i; |
| 704 status = 14; | 703 status = 14; |
| 705 inside_index = 0; | 704 inside_index = 0; |
| 706 } | 705 } |
| 707 break; | 706 break; |
| 708 case 3: | 707 case 3: |
| 709 if (byte <= '9' && byte >= '0') { | 708 if (byte <= '9' && byte >= '0') { |
| 710 start_pos1 = pos + i; | 709 start_pos1 = pos + i; |
| 711 status = 4; | 710 status = 4; |
| 712 gennum = byte - '0'; | 711 gennum = byte - '0'; |
| 713 } else if (_PDF_CharType[byte] == 'W') { | 712 } else if (PDF_CharType[byte] == 'W') { |
| 714 break; | 713 break; |
| 715 } else if (byte == 't') { | 714 } else if (byte == 't') { |
| 716 status = 7; | 715 status = 7; |
| 717 inside_index = 1; | 716 inside_index = 1; |
| 718 } else { | 717 } else { |
| 719 --i; | 718 --i; |
| 720 status = 0; | 719 status = 0; |
| 721 } | 720 } |
| 722 break; | 721 break; |
| 723 case 4: | 722 case 4: |
| 724 if (byte <= '9' && byte >= '0') { | 723 if (byte <= '9' && byte >= '0') { |
| 725 gennum = gennum * 10 + byte - '0'; | 724 gennum = gennum * 10 + byte - '0'; |
| 726 break; | 725 break; |
| 727 } else if (_PDF_CharType[byte] == 'W') { | 726 } else if (PDF_CharType[byte] == 'W') { |
| 728 status = 5; | 727 status = 5; |
| 729 } else { | 728 } else { |
| 730 --i; | 729 --i; |
| 731 status = 0; | 730 status = 0; |
| 732 } | 731 } |
| 733 break; | 732 break; |
| 734 case 5: | 733 case 5: |
| 735 if (byte == 'o') { | 734 if (byte == 'o') { |
| 736 status = 6; | 735 status = 6; |
| 737 inside_index = 1; | 736 inside_index = 1; |
| 738 } else if (_PDF_CharType[byte] == 'W') { | 737 } else if (PDF_CharType[byte] == 'W') { |
| 739 break; | 738 break; |
| 740 } else if (byte <= '9' && byte >= '0') { | 739 } else if (byte <= '9' && byte >= '0') { |
| 741 objnum = gennum; | 740 objnum = gennum; |
| 742 gennum = byte - '0'; | 741 gennum = byte - '0'; |
| 743 start_pos = start_pos1; | 742 start_pos = start_pos1; |
| 744 start_pos1 = pos + i; | 743 start_pos1 = pos + i; |
| 745 status = 4; | 744 status = 4; |
| 746 } else if (byte == 't') { | 745 } else if (byte == 't') { |
| 747 status = 7; | 746 status = 7; |
| 748 inside_index = 1; | 747 inside_index = 1; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 763 break; | 762 break; |
| 764 case 2: | 763 case 2: |
| 765 if (byte != 'j') { | 764 if (byte != 'j') { |
| 766 --i; | 765 --i; |
| 767 status = 0; | 766 status = 0; |
| 768 } else { | 767 } else { |
| 769 inside_index ++; | 768 inside_index ++; |
| 770 } | 769 } |
| 771 break; | 770 break; |
| 772 case 3: | 771 case 3: |
| 773 if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte
] == 'D') { | 772 if (PDF_CharType[byte] == 'W' || PDF_CharType[byte]
== 'D') { |
| 774 if (objnum > 0x1000000) { | 773 if (objnum > 0x1000000) { |
| 775 status = 0; | 774 status = 0; |
| 776 break; | 775 break; |
| 777 } | 776 } |
| 778 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_Hea
derOffset; | 777 FX_FILESIZE obj_pos = start_pos - m_Syntax.m_Hea
derOffset; |
| 779 last_obj = start_pos; | 778 last_obj = start_pos; |
| 780 FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_So
rtedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFil
eSize); | 779 FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_So
rtedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFil
eSize); |
| 781 if (pResult == NULL) { | 780 if (pResult == NULL) { |
| 782 m_SortedOffset.Add(obj_pos); | 781 m_SortedOffset.Add(obj_pos); |
| 783 } | 782 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 pObject->Release(); | 836 pObject->Release(); |
| 838 } | 837 } |
| 839 } | 838 } |
| 840 --i; | 839 --i; |
| 841 status = 0; | 840 status = 0; |
| 842 break; | 841 break; |
| 843 } | 842 } |
| 844 break; | 843 break; |
| 845 case 7: | 844 case 7: |
| 846 if (inside_index == 7) { | 845 if (inside_index == 7) { |
| 847 if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] ==
'D') { | 846 if (PDF_CharType[byte] == 'W' || PDF_CharType[byte] == '
D') { |
| 848 last_trailer = pos + i - 7; | 847 last_trailer = pos + i - 7; |
| 849 m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffse
t); | 848 m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffse
t); |
| 850 CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument,
0, 0, 0); | 849 CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument,
0, 0, 0); |
| 851 if (pObj) { | 850 if (pObj) { |
| 852 if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj
->GetType() != PDFOBJ_STREAM) { | 851 if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj
->GetType() != PDFOBJ_STREAM) { |
| 853 pObj->Release(); | 852 pObj->Release(); |
| 854 } else { | 853 } else { |
| 855 CPDF_Dictionary* pTrailer = NULL; | 854 CPDF_Dictionary* pTrailer = NULL; |
| 856 if (pObj->GetType() == PDFOBJ_STREAM) { | 855 if (pObj->GetType() == PDFOBJ_STREAM) { |
| 857 pTrailer = ((CPDF_Stream*)pObj)->GetDict
(); | 856 pTrailer = ((CPDF_Stream*)pObj)->GetDict
(); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 } else if (byte == '>') { | 941 } else if (byte == '>') { |
| 943 status = 0; | 942 status = 0; |
| 944 } | 943 } |
| 945 inside_index = 0; | 944 inside_index = 0; |
| 946 break; | 945 break; |
| 947 case 12: | 946 case 12: |
| 948 --i; | 947 --i; |
| 949 status = 0; | 948 status = 0; |
| 950 break; | 949 break; |
| 951 case 13: | 950 case 13: |
| 952 if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W'
) { | 951 if (PDF_CharType[byte] == 'D' || PDF_CharType[byte] == 'W')
{ |
| 953 --i; | 952 --i; |
| 954 status = 0; | 953 status = 0; |
| 955 } | 954 } |
| 956 break; | 955 break; |
| 957 case 14: | 956 case 14: |
| 958 if (_PDF_CharType[byte] == 'W') { | 957 if (PDF_CharType[byte] == 'W') { |
| 959 status = 0; | 958 status = 0; |
| 960 } else if (byte == '%' || byte == '(' || byte == '<' || byte
== '\\') { | 959 } else if (byte == '%' || byte == '(' || byte == '<' || byte
== '\\') { |
| 961 status = 0; | 960 status = 0; |
| 962 --i; | 961 --i; |
| 963 } else if (inside_index == 6) { | 962 } else if (inside_index == 6) { |
| 964 status = 0; | 963 status = 0; |
| 965 --i; | 964 --i; |
| 966 } else if (byte == "endobj"[inside_index]) { | 965 } else if (byte == "endobj"[inside_index]) { |
| 967 inside_index++; | 966 inside_index++; |
| 968 } | 967 } |
| (...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1642 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; | 1641 FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum; |
| 1643 m_Syntax.m_MetadataObjnum = 0; | 1642 m_Syntax.m_MetadataObjnum = 0; |
| 1644 if (m_pTrailer) { | 1643 if (m_pTrailer) { |
| 1645 m_pTrailer->Release(); | 1644 m_pTrailer->Release(); |
| 1646 m_pTrailer = NULL; | 1645 m_pTrailer = NULL; |
| 1647 } | 1646 } |
| 1648 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); | 1647 m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset); |
| 1649 FX_BYTE ch = 0; | 1648 FX_BYTE ch = 0; |
| 1650 FX_DWORD dwCount = 0; | 1649 FX_DWORD dwCount = 0; |
| 1651 m_Syntax.GetNextChar(ch); | 1650 m_Syntax.GetNextChar(ch); |
| 1652 FX_INT32 type = _PDF_CharType[ch]; | 1651 FX_INT32 type = PDF_CharType[ch]; |
| 1653 while (type == 'W') { | 1652 while (type == 'W') { |
| 1654 ++dwCount; | 1653 ++dwCount; |
| 1655 if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_
HeaderOffset)) { | 1654 if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_
HeaderOffset)) { |
| 1656 break; | 1655 break; |
| 1657 } | 1656 } |
| 1658 m_Syntax.GetNextChar(ch); | 1657 m_Syntax.GetNextChar(ch); |
| 1659 type = _PDF_CharType[ch]; | 1658 type = PDF_CharType[ch]; |
| 1660 } | 1659 } |
| 1661 m_LastXRefOffset += dwCount; | 1660 m_LastXRefOffset += dwCount; |
| 1662 FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); | 1661 FX_POSITION pos = m_ObjectStreamMap.GetStartPosition(); |
| 1663 while (pos) { | 1662 while (pos) { |
| 1664 FX_LPVOID objnum; | 1663 FX_LPVOID objnum; |
| 1665 CPDF_StreamAcc* pStream; | 1664 CPDF_StreamAcc* pStream; |
| 1666 m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); | 1665 m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream); |
| 1667 delete pStream; | 1666 delete pStream; |
| 1668 } | 1667 } |
| 1669 m_ObjectStreamMap.RemoveAll(); | 1668 m_ObjectStreamMap.RemoveAll(); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1774 } | 1773 } |
| 1775 #define MAX_WORD_BUFFER 256 | 1774 #define MAX_WORD_BUFFER 256 |
| 1776 void CPDF_SyntaxParser::GetNextWord() | 1775 void CPDF_SyntaxParser::GetNextWord() |
| 1777 { | 1776 { |
| 1778 m_WordSize = 0; | 1777 m_WordSize = 0; |
| 1779 m_bIsNumber = TRUE; | 1778 m_bIsNumber = TRUE; |
| 1780 FX_BYTE ch; | 1779 FX_BYTE ch; |
| 1781 if (!GetNextChar(ch)) { | 1780 if (!GetNextChar(ch)) { |
| 1782 return; | 1781 return; |
| 1783 } | 1782 } |
| 1784 FX_BYTE type = _PDF_CharType[ch]; | 1783 FX_BYTE type = PDF_CharType[ch]; |
| 1785 while (1) { | 1784 while (1) { |
| 1786 while (type == 'W') { | 1785 while (type == 'W') { |
| 1787 if (!GetNextChar(ch)) { | 1786 if (!GetNextChar(ch)) { |
| 1788 return; | 1787 return; |
| 1789 } | 1788 } |
| 1790 type = _PDF_CharType[ch]; | 1789 type = PDF_CharType[ch]; |
| 1791 } | 1790 } |
| 1792 if (ch != '%') { | 1791 if (ch != '%') { |
| 1793 break; | 1792 break; |
| 1794 } | 1793 } |
| 1795 while (1) { | 1794 while (1) { |
| 1796 if (!GetNextChar(ch)) { | 1795 if (!GetNextChar(ch)) { |
| 1797 return; | 1796 return; |
| 1798 } | 1797 } |
| 1799 if (ch == '\r' || ch == '\n') { | 1798 if (ch == '\r' || ch == '\n') { |
| 1800 break; | 1799 break; |
| 1801 } | 1800 } |
| 1802 } | 1801 } |
| 1803 type = _PDF_CharType[ch]; | 1802 type = PDF_CharType[ch]; |
| 1804 } | 1803 } |
| 1805 if (type == 'D') { | 1804 if (type == 'D') { |
| 1806 m_bIsNumber = FALSE; | 1805 m_bIsNumber = FALSE; |
| 1807 m_WordBuffer[m_WordSize++] = ch; | 1806 m_WordBuffer[m_WordSize++] = ch; |
| 1808 if (ch == '/') { | 1807 if (ch == '/') { |
| 1809 while (1) { | 1808 while (1) { |
| 1810 if (!GetNextChar(ch)) { | 1809 if (!GetNextChar(ch)) { |
| 1811 return; | 1810 return; |
| 1812 } | 1811 } |
| 1813 type = _PDF_CharType[ch]; | 1812 type = PDF_CharType[ch]; |
| 1814 if (type != 'R' && type != 'N') { | 1813 if (type != 'R' && type != 'N') { |
| 1815 m_Pos --; | 1814 m_Pos --; |
| 1816 return; | 1815 return; |
| 1817 } | 1816 } |
| 1818 if (m_WordSize < MAX_WORD_BUFFER) { | 1817 if (m_WordSize < MAX_WORD_BUFFER) { |
| 1819 m_WordBuffer[m_WordSize++] = ch; | 1818 m_WordBuffer[m_WordSize++] = ch; |
| 1820 } | 1819 } |
| 1821 } | 1820 } |
| 1822 } else if (ch == '<') { | 1821 } else if (ch == '<') { |
| 1823 if (!GetNextChar(ch)) { | 1822 if (!GetNextChar(ch)) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1843 while (1) { | 1842 while (1) { |
| 1844 if (m_WordSize < MAX_WORD_BUFFER) { | 1843 if (m_WordSize < MAX_WORD_BUFFER) { |
| 1845 m_WordBuffer[m_WordSize++] = ch; | 1844 m_WordBuffer[m_WordSize++] = ch; |
| 1846 } | 1845 } |
| 1847 if (type != 'N') { | 1846 if (type != 'N') { |
| 1848 m_bIsNumber = FALSE; | 1847 m_bIsNumber = FALSE; |
| 1849 } | 1848 } |
| 1850 if (!GetNextChar(ch)) { | 1849 if (!GetNextChar(ch)) { |
| 1851 return; | 1850 return; |
| 1852 } | 1851 } |
| 1853 type = _PDF_CharType[ch]; | 1852 type = PDF_CharType[ch]; |
| 1854 if (type == 'D' || type == 'W') { | 1853 if (type == 'D' || type == 'W') { |
| 1855 m_Pos --; | 1854 m_Pos --; |
| 1856 break; | 1855 break; |
| 1857 } | 1856 } |
| 1858 } | 1857 } |
| 1859 } | 1858 } |
| 1860 CFX_ByteString CPDF_SyntaxParser::ReadString() | 1859 CFX_ByteString CPDF_SyntaxParser::ReadString() |
| 1861 { | 1860 { |
| 1862 FX_BYTE ch; | 1861 FX_BYTE ch; |
| 1863 if (!GetNextChar(ch)) { | 1862 if (!GetNextChar(ch)) { |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2011 } | 2010 } |
| 2012 } | 2011 } |
| 2013 } | 2012 } |
| 2014 } | 2013 } |
| 2015 void CPDF_SyntaxParser::ToNextWord() | 2014 void CPDF_SyntaxParser::ToNextWord() |
| 2016 { | 2015 { |
| 2017 FX_BYTE ch; | 2016 FX_BYTE ch; |
| 2018 if (!GetNextChar(ch)) { | 2017 if (!GetNextChar(ch)) { |
| 2019 return; | 2018 return; |
| 2020 } | 2019 } |
| 2021 FX_BYTE type = _PDF_CharType[ch]; | 2020 FX_BYTE type = PDF_CharType[ch]; |
| 2022 while (1) { | 2021 while (1) { |
| 2023 while (type == 'W') { | 2022 while (type == 'W') { |
| 2024 m_dwWordPos = m_Pos; | 2023 m_dwWordPos = m_Pos; |
| 2025 if (!GetNextChar(ch)) { | 2024 if (!GetNextChar(ch)) { |
| 2026 return; | 2025 return; |
| 2027 } | 2026 } |
| 2028 type = _PDF_CharType[ch]; | 2027 type = PDF_CharType[ch]; |
| 2029 } | 2028 } |
| 2030 if (ch != '%') { | 2029 if (ch != '%') { |
| 2031 break; | 2030 break; |
| 2032 } | 2031 } |
| 2033 while (1) { | 2032 while (1) { |
| 2034 if (!GetNextChar(ch)) { | 2033 if (!GetNextChar(ch)) { |
| 2035 return; | 2034 return; |
| 2036 } | 2035 } |
| 2037 if (ch == '\r' || ch == '\n') { | 2036 if (ch == '\r' || ch == '\n') { |
| 2038 break; | 2037 break; |
| 2039 } | 2038 } |
| 2040 } | 2039 } |
| 2041 type = _PDF_CharType[ch]; | 2040 type = PDF_CharType[ch]; |
| 2042 } | 2041 } |
| 2043 m_Pos --; | 2042 m_Pos --; |
| 2044 } | 2043 } |
| 2045 CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) | 2044 CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber) |
| 2046 { | 2045 { |
| 2047 GetNextWord(); | 2046 GetNextWord(); |
| 2048 bIsNumber = m_bIsNumber; | 2047 bIsNumber = m_bIsNumber; |
| 2049 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); | 2048 return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize); |
| 2050 } | 2049 } |
| 2051 CFX_ByteString CPDF_SyntaxParser::GetKeyword() | 2050 CFX_ByteString CPDF_SyntaxParser::GetKeyword() |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2523 { | 2522 { |
| 2524 GetNextWord(); | 2523 GetNextWord(); |
| 2525 if (!m_bIsNumber) { | 2524 if (!m_bIsNumber) { |
| 2526 return 0; | 2525 return 0; |
| 2527 } | 2526 } |
| 2528 m_WordBuffer[m_WordSize] = 0; | 2527 m_WordBuffer[m_WordSize] = 0; |
| 2529 return FXSYS_atoi((FX_LPCSTR)m_WordBuffer); | 2528 return FXSYS_atoi((FX_LPCSTR)m_WordBuffer); |
| 2530 } | 2529 } |
| 2531 FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit,
FX_LPCBYTE tag, FX_DWORD taglen) | 2530 FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit,
FX_LPCBYTE tag, FX_DWORD taglen) |
| 2532 { | 2531 { |
| 2533 FX_BYTE type = _PDF_CharType[tag[0]]; | 2532 FX_BYTE type = PDF_CharType[tag[0]]; |
| 2534 FX_BOOL bCheckLeft = type != 'D' && type != 'W'; | 2533 FX_BOOL bCheckLeft = type != 'D' && type != 'W'; |
| 2535 type = _PDF_CharType[tag[taglen - 1]]; | 2534 type = PDF_CharType[tag[taglen - 1]]; |
| 2536 FX_BOOL bCheckRight = type != 'D' && type != 'W'; | 2535 FX_BOOL bCheckRight = type != 'D' && type != 'W'; |
| 2537 FX_BYTE ch; | 2536 FX_BYTE ch; |
| 2538 if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpo
s + (FX_INT32)taglen, ch)) { | 2537 if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpo
s + (FX_INT32)taglen, ch)) { |
| 2539 FX_BYTE type = _PDF_CharType[ch]; | 2538 FX_BYTE type = PDF_CharType[ch]; |
| 2540 if (type == 'N' || type == 'R') { | 2539 if (type == 'N' || type == 'R') { |
| 2541 return FALSE; | 2540 return FALSE; |
| 2542 } | 2541 } |
| 2543 } | 2542 } |
| 2544 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { | 2543 if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) { |
| 2545 FX_BYTE type = _PDF_CharType[ch]; | 2544 FX_BYTE type = PDF_CharType[ch]; |
| 2546 if (type == 'N' || type == 'R') { | 2545 if (type == 'N' || type == 'R') { |
| 2547 return FALSE; | 2546 return FALSE; |
| 2548 } | 2547 } |
| 2549 } | 2548 } |
| 2550 return TRUE; | 2549 return TRUE; |
| 2551 } | 2550 } |
| 2552 FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL b
Forward, FX_FILESIZE limit) | 2551 FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL b
Forward, FX_FILESIZE limit) |
| 2553 { | 2552 { |
| 2554 FX_INT32 taglen = tag.GetLength(); | 2553 FX_INT32 taglen = tag.GetLength(); |
| 2555 if (taglen == 0) { | 2554 if (taglen == 0) { |
| (...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3821 m_Pos = dwOffset; | 3820 m_Pos = dwOffset; |
| 3822 } | 3821 } |
| 3823 #define MAX_WORD_BUFFER 256 | 3822 #define MAX_WORD_BUFFER 256 |
| 3824 FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token) | 3823 FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token) |
| 3825 { | 3824 { |
| 3826 m_WordSize = 0; | 3825 m_WordSize = 0; |
| 3827 FX_BYTE ch; | 3826 FX_BYTE ch; |
| 3828 if (!GetNextChar(ch)) { | 3827 if (!GetNextChar(ch)) { |
| 3829 return FALSE; | 3828 return FALSE; |
| 3830 } | 3829 } |
| 3831 FX_BYTE type = _PDF_CharType[ch]; | 3830 FX_BYTE type = PDF_CharType[ch]; |
| 3832 while (1) { | 3831 while (1) { |
| 3833 while (type == 'W') { | 3832 while (type == 'W') { |
| 3834 if (!GetNextChar(ch)) { | 3833 if (!GetNextChar(ch)) { |
| 3835 return FALSE; | 3834 return FALSE; |
| 3836 } | 3835 } |
| 3837 type = _PDF_CharType[ch]; | 3836 type = PDF_CharType[ch]; |
| 3838 } | 3837 } |
| 3839 if (ch != '%') { | 3838 if (ch != '%') { |
| 3840 break; | 3839 break; |
| 3841 } | 3840 } |
| 3842 while (1) { | 3841 while (1) { |
| 3843 if (!GetNextChar(ch)) { | 3842 if (!GetNextChar(ch)) { |
| 3844 return FALSE; | 3843 return FALSE; |
| 3845 } | 3844 } |
| 3846 if (ch == '\r' || ch == '\n') { | 3845 if (ch == '\r' || ch == '\n') { |
| 3847 break; | 3846 break; |
| 3848 } | 3847 } |
| 3849 } | 3848 } |
| 3850 type = _PDF_CharType[ch]; | 3849 type = PDF_CharType[ch]; |
| 3851 } | 3850 } |
| 3852 if (type == 'D') { | 3851 if (type == 'D') { |
| 3853 m_WordBuffer[m_WordSize++] = ch; | 3852 m_WordBuffer[m_WordSize++] = ch; |
| 3854 if (ch == '/') { | 3853 if (ch == '/') { |
| 3855 while (1) { | 3854 while (1) { |
| 3856 if (!GetNextChar(ch)) { | 3855 if (!GetNextChar(ch)) { |
| 3857 return FALSE; | 3856 return FALSE; |
| 3858 } | 3857 } |
| 3859 type = _PDF_CharType[ch]; | 3858 type = PDF_CharType[ch]; |
| 3860 if (type != 'R' && type != 'N') { | 3859 if (type != 'R' && type != 'N') { |
| 3861 m_Pos --; | 3860 m_Pos --; |
| 3862 CFX_ByteString ret(m_WordBuffer, m_WordSize); | 3861 CFX_ByteString ret(m_WordBuffer, m_WordSize); |
| 3863 token = ret; | 3862 token = ret; |
| 3864 return TRUE; | 3863 return TRUE; |
| 3865 } | 3864 } |
| 3866 if (m_WordSize < MAX_WORD_BUFFER) { | 3865 if (m_WordSize < MAX_WORD_BUFFER) { |
| 3867 m_WordBuffer[m_WordSize++] = ch; | 3866 m_WordBuffer[m_WordSize++] = ch; |
| 3868 } | 3867 } |
| 3869 } | 3868 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3890 token = ret; | 3889 token = ret; |
| 3891 return TRUE; | 3890 return TRUE; |
| 3892 } | 3891 } |
| 3893 while (1) { | 3892 while (1) { |
| 3894 if (m_WordSize < MAX_WORD_BUFFER) { | 3893 if (m_WordSize < MAX_WORD_BUFFER) { |
| 3895 m_WordBuffer[m_WordSize++] = ch; | 3894 m_WordBuffer[m_WordSize++] = ch; |
| 3896 } | 3895 } |
| 3897 if (!GetNextChar(ch)) { | 3896 if (!GetNextChar(ch)) { |
| 3898 return FALSE; | 3897 return FALSE; |
| 3899 } | 3898 } |
| 3900 type = _PDF_CharType[ch]; | 3899 type = PDF_CharType[ch]; |
| 3901 if (type == 'D' || type == 'W') { | 3900 if (type == 'D' || type == 'W') { |
| 3902 m_Pos --; | 3901 m_Pos --; |
| 3903 break; | 3902 break; |
| 3904 } | 3903 } |
| 3905 } | 3904 } |
| 3906 CFX_ByteString ret(m_WordBuffer, m_WordSize); | 3905 CFX_ByteString ret(m_WordBuffer, m_WordSize); |
| 3907 token = ret; | 3906 token = ret; |
| 3908 return TRUE; | 3907 return TRUE; |
| 3909 } | 3908 } |
| 3910 FX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch) | 3909 FX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch) |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4629 { | 4628 { |
| 4630 FX_INT32 iSize = m_childNode.GetSize(); | 4629 FX_INT32 iSize = m_childNode.GetSize(); |
| 4631 for (FX_INT32 i = 0; i < iSize; ++i) { | 4630 for (FX_INT32 i = 0; i < iSize; ++i) { |
| 4632 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; | 4631 CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i]; |
| 4633 if (pNode) { | 4632 if (pNode) { |
| 4634 delete pNode; | 4633 delete pNode; |
| 4635 } | 4634 } |
| 4636 } | 4635 } |
| 4637 m_childNode.RemoveAll(); | 4636 m_childNode.RemoveAll(); |
| 4638 } | 4637 } |
| OLD | NEW |