Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp |
index 37b82dd564a40ddbc5e04d65d9739246f74b1bb0..a08cf7d466645750dea9c34eb1f97c21478e32f8 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp |
@@ -4,8 +4,9 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
-#include "core/include/fpdfapi/fpdf_parser.h" |
+#include "core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.h" |
+#include "core/include/fpdfapi/fpdf_parser.h" |
#include "core/include/fxcrt/fx_ext.h" |
// Indexed by 8-bit character code, contains either: |
@@ -60,171 +61,28 @@ const char PDF_CharType[256] = { |
'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', |
'R', 'R', 'R', 'R', 'R', 'R', 'R', 'W'}; |
-CPDF_SimpleParser::CPDF_SimpleParser(const uint8_t* pData, FX_DWORD dwSize) { |
- m_pData = pData; |
- m_dwSize = dwSize; |
- m_dwCurPos = 0; |
-} |
- |
-CPDF_SimpleParser::CPDF_SimpleParser(const CFX_ByteStringC& str) { |
- m_pData = str.GetPtr(); |
- m_dwSize = str.GetLength(); |
- m_dwCurPos = 0; |
-} |
+int32_t GetHeaderOffset(IFX_FileRead* pFile) { |
+ // TODO(dsinclair): This is a complicated way of saying %PDF, simplify? |
+ const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); |
-void CPDF_SimpleParser::ParseWord(const uint8_t*& pStart, FX_DWORD& dwSize) { |
- pStart = NULL; |
- dwSize = 0; |
- uint8_t ch; |
- while (1) { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- while (PDFCharIsWhitespace(ch)) { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- } |
+ const size_t kBufSize = 4; |
+ uint8_t buf[kBufSize]; |
+ int32_t offset = 0; |
+ while (offset <= 1024) { |
+ if (!pFile->ReadBlock(buf, offset, kBufSize)) |
+ return -1; |
- if (ch != '%') |
- break; |
- |
- while (1) { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- if (ch == '\r' || ch == '\n') |
- break; |
- } |
- } |
+ if (*(FX_DWORD*)buf == tag) |
+ return offset; |
- FX_DWORD start_pos = m_dwCurPos - 1; |
- pStart = m_pData + start_pos; |
- if (PDFCharIsDelimiter(ch)) { |
- if (ch == '/') { |
- while (1) { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) { |
- m_dwCurPos--; |
- dwSize = m_dwCurPos - start_pos; |
- return; |
- } |
- } |
- } else { |
- dwSize = 1; |
- if (ch == '<') { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- if (ch == '<') |
- dwSize = 2; |
- else |
- m_dwCurPos--; |
- } else if (ch == '>') { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- if (ch == '>') |
- dwSize = 2; |
- else |
- m_dwCurPos--; |
- } |
- } |
- return; |
- } |
- |
- dwSize = 1; |
- while (1) { |
- if (m_dwSize <= m_dwCurPos) |
- return; |
- ch = m_pData[m_dwCurPos++]; |
- |
- if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) { |
- m_dwCurPos--; |
- break; |
- } |
- dwSize++; |
+ ++offset; |
} |
+ return -1; |
} |
-CFX_ByteStringC CPDF_SimpleParser::GetWord() { |
- const uint8_t* pStart; |
- FX_DWORD dwSize; |
- ParseWord(pStart, dwSize); |
- if (dwSize == 1 && pStart[0] == '<') { |
- while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') { |
- m_dwCurPos++; |
- } |
- if (m_dwCurPos < m_dwSize) { |
- m_dwCurPos++; |
- } |
- return CFX_ByteStringC(pStart, |
- (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData))); |
- } |
- if (dwSize == 1 && pStart[0] == '(') { |
- int level = 1; |
- while (m_dwCurPos < m_dwSize) { |
- if (m_pData[m_dwCurPos] == ')') { |
- level--; |
- if (level == 0) { |
- break; |
- } |
- } |
- if (m_pData[m_dwCurPos] == '\\') { |
- if (m_dwSize <= m_dwCurPos) { |
- break; |
- } |
- m_dwCurPos++; |
- } else if (m_pData[m_dwCurPos] == '(') { |
- level++; |
- } |
- if (m_dwSize <= m_dwCurPos) { |
- break; |
- } |
- m_dwCurPos++; |
- } |
- if (m_dwCurPos < m_dwSize) { |
- m_dwCurPos++; |
- } |
- return CFX_ByteStringC(pStart, |
- (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData))); |
- } |
- return CFX_ByteStringC(pStart, dwSize); |
-} |
- |
-bool CPDF_SimpleParser::FindTagParamFromStart(const CFX_ByteStringC& token, |
- int nParams) { |
- nParams++; |
- FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams); |
- int buf_index = 0; |
- int buf_count = 0; |
- m_dwCurPos = 0; |
- while (1) { |
- pBuf[buf_index++] = m_dwCurPos; |
- if (buf_index == nParams) { |
- buf_index = 0; |
- } |
- buf_count++; |
- if (buf_count > nParams) { |
- buf_count = nParams; |
- } |
- CFX_ByteStringC word = GetWord(); |
- if (word.IsEmpty()) { |
- FX_Free(pBuf); |
- return false; |
- } |
- if (word == token) { |
- if (buf_count < nParams) { |
- continue; |
- } |
- m_dwCurPos = pBuf[buf_index]; |
- FX_Free(pBuf); |
- return true; |
- } |
- } |
- return false; |
+int32_t GetDirectInteger(CPDF_Dictionary* pDict, const CFX_ByteStringC& key) { |
+ CPDF_Number* pObj = ToNumber(pDict->GetElement(key)); |
+ return pObj ? pObj->GetInteger() : 0; |
} |
CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& bstr) { |