Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
index 7482f0b8e4fc12427b49cdc9752ad5003771310a..fa1ab9843ba55bd251dd5b8f6fb4329eb8c7530a 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
@@ -8,6 +8,7 @@ |
#include <utility> |
#include <vector> |
+#include "../../../../third_party/base/nonstd_unique_ptr.h" |
#include "../../../include/fpdfapi/fpdf_module.h" |
#include "../../../include/fpdfapi/fpdf_page.h" |
#include "../../../include/fpdfapi/fpdf_parser.h" |
@@ -484,6 +485,7 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
m_Syntax.RestorePos(SavedPos + count * recordsize); |
return TRUE; |
} |
+ |
FX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
FX_FILESIZE streampos, |
FX_BOOL bSkip, |
@@ -592,12 +594,11 @@ FX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
} |
m_Syntax.RestorePos(SavedPos + count * recordsize); |
} |
- if (streampos) |
- if (!LoadCrossRefV5(streampos, streampos, FALSE)) { |
- return FALSE; |
- } |
+ if (streampos && !LoadCrossRefV5(streampos, streampos, FALSE)) |
Tom Sepez
2015/09/23 21:48:41
nit: maybe return !streampos || LoadCrossRefV5(..)
Lei Zhang
2015/09/25 09:33:48
Done.
|
+ return FALSE; |
return TRUE; |
} |
+ |
FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) { |
if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) { |
return FALSE; |
@@ -2700,76 +2701,74 @@ FX_BOOL CPDF_SyntaxParser::SearchWord(const CFX_ByteStringC& tag, |
} |
return FALSE; |
} |
+ |
struct _SearchTagRecord { |
const uint8_t* m_pTag; |
FX_DWORD m_Len; |
FX_DWORD m_Offset; |
}; |
+ |
int32_t CPDF_SyntaxParser::SearchMultiWord(const CFX_ByteStringC& tags, |
FX_BOOL bWholeWord, |
FX_FILESIZE limit) { |
- int32_t ntags = 1, i; |
- for (i = 0; i < tags.GetLength(); i++) |
+ int32_t ntags = 1; |
+ for (int i = 0; i < tags.GetLength(); i++) { |
if (tags[i] == 0) { |
ntags++; |
} |
- _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags); |
- FX_DWORD start = 0, itag = 0, max_len = 0; |
- for (i = 0; i <= tags.GetLength(); i++) { |
+ } |
+ std::vector<_SearchTagRecord> patterns(ntags); |
+ FX_DWORD start = 0; |
+ FX_DWORD itag = 0; |
+ FX_DWORD max_len = 0; |
+ for (int i = 0; i <= tags.GetLength(); i++) { |
if (tags[i] == 0) { |
FX_DWORD len = i - start; |
if (len > max_len) { |
max_len = len; |
} |
- pPatterns[itag].m_pTag = tags.GetPtr() + start; |
- pPatterns[itag].m_Len = len; |
- pPatterns[itag].m_Offset = 0; |
+ patterns[itag].m_pTag = tags.GetPtr() + start; |
+ patterns[itag].m_Len = len; |
+ patterns[itag].m_Offset = 0; |
start = i + 1; |
itag++; |
} |
} |
- FX_FILESIZE pos = m_Pos; |
uint8_t byte; |
- GetCharAt(pos++, byte); |
- int32_t found = -1; |
- while (1) { |
- for (i = 0; i < ntags; i++) { |
- if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) { |
- pPatterns[i].m_Offset++; |
- if (pPatterns[i].m_Offset == pPatterns[i].m_Len) { |
+ GetCharAt(m_Pos, byte); |
+ for (FX_FILESIZE pos = m_Pos + 1;; ++pos) { |
+ for (int i = 0; i < ntags; i++) { |
+ if (patterns[i].m_pTag[patterns[i].m_Offset] == byte) { |
+ patterns[i].m_Offset++; |
+ if (patterns[i].m_Offset == patterns[i].m_Len) { |
if (!bWholeWord || |
- IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, |
- pPatterns[i].m_Len)) { |
- found = i; |
- goto end; |
+ IsWholeWord(pos - patterns[i].m_Len, limit, patterns[i].m_pTag, |
+ patterns[i].m_Len)) { |
+ return i; |
} else { |
- if (pPatterns[i].m_pTag[0] == byte) { |
- pPatterns[i].m_Offset = 1; |
+ if (patterns[i].m_pTag[0] == byte) { |
+ patterns[i].m_Offset = 1; |
} else { |
- pPatterns[i].m_Offset = 0; |
+ patterns[i].m_Offset = 0; |
} |
} |
} |
} else { |
- if (pPatterns[i].m_pTag[0] == byte) { |
- pPatterns[i].m_Offset = 1; |
+ if (patterns[i].m_pTag[0] == byte) { |
+ patterns[i].m_Offset = 1; |
} else { |
- pPatterns[i].m_Offset = 0; |
+ patterns[i].m_Offset = 0; |
} |
} |
} |
- if (limit && pos >= m_Pos + limit) { |
- goto end; |
- } |
- if (!GetCharAt(pos, byte)) { |
- goto end; |
+ |
+ if ((limit && pos >= m_Pos + limit) || !GetCharAt(pos, byte)) { |
Tom Sepez
2015/09/23 21:48:41
I would like to have the first half of this || use
Lei Zhang
2015/09/25 09:33:48
Done.
|
+ return -1; |
} |
- pos++; |
} |
-end: |
- FX_Free(pPatterns); |
- return found; |
+ return -1; |
Tom Sepez
2015/09/23 21:48:41
notreached? Only way out of your loop by return? w
Lei Zhang
2015/09/25 09:33:48
Acknowledged.
|
} |
+ |
FX_FILESIZE CPDF_SyntaxParser::FindTag(const CFX_ByteStringC& tag, |
FX_FILESIZE limit) { |
int32_t taglen = tag.GetLength(); |
@@ -2814,20 +2813,19 @@ class CPDF_DataAvail final : public IPDF_DataAvail { |
CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead); |
~CPDF_DataAvail() override; |
- virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) override; |
+ FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) override; |
- virtual void SetDocument(CPDF_Document* pDoc) override; |
+ void SetDocument(CPDF_Document* pDoc) override; |
- virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) override; |
+ FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) override; |
- virtual int32_t IsFormAvail(IFX_DownloadHints* pHints) override; |
+ int32_t IsFormAvail(IFX_DownloadHints* pHints) override; |
- virtual int32_t IsLinearizedPDF() override; |
+ int32_t IsLinearizedPDF() override; |
- virtual FX_BOOL IsLinearized() override { return m_bLinearized; } |
+ FX_BOOL IsLinearized() override { return m_bLinearized; } |
- virtual void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, |
- FX_DWORD* pSize) override; |
+ void GetLinearizedMainXRefInfo(FX_FILESIZE* pPos, FX_DWORD* pSize) override; |
protected: |
static const int kMaxDataAvailRecursionDepth = 64; |