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 543f8f6323b315b8cad8b0343e28e67951d67142..9318403766a3313267d81181b36d55a71c8818b5 100644 |
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
@@ -13,6 +13,7 @@ |
#include "core/include/fpdfapi/fpdf_module.h" |
#include "core/include/fpdfapi/fpdf_page.h" |
#include "core/include/fpdfapi/fpdf_parser.h" |
+#include "core/include/fxcrt/fx_ext.h" |
#include "core/include/fxcrt/fx_safe_types.h" |
#include "core/src/fpdfapi/fpdf_page/pageint.h" |
#include "third_party/base/nonstd_unique_ptr.h" |
@@ -164,85 +165,83 @@ FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, |
m_bXRefStream = FALSE; |
m_LastXRefOffset = 0; |
m_bOwnFileRead = bOwnFileRead; |
+ |
int32_t offset = GetHeaderOffset(pFileAccess); |
if (offset == -1) { |
- if (bOwnFileRead && pFileAccess) { |
+ if (bOwnFileRead && pFileAccess) |
pFileAccess->Release(); |
- } |
return PDFPARSE_ERROR_FORMAT; |
} |
m_Syntax.InitParser(pFileAccess, offset); |
+ |
uint8_t ch; |
- if (!m_Syntax.GetCharAt(5, ch)) { |
+ if (!m_Syntax.GetCharAt(5, ch)) |
return PDFPARSE_ERROR_FORMAT; |
- } |
- if (ch >= '0' && ch <= '9') { |
- m_FileVersion = (ch - '0') * 10; |
- } |
- if (!m_Syntax.GetCharAt(7, ch)) { |
+ if (std::isdigit(ch)) |
+ m_FileVersion = FXSYS_toDecimalDigit(ch) * 10; |
+ |
+ if (!m_Syntax.GetCharAt(7, ch)) |
return PDFPARSE_ERROR_FORMAT; |
- } |
- if (ch >= '0' && ch <= '9') { |
- m_FileVersion += ch - '0'; |
- } |
- if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) { |
+ if (std::isdigit(ch)) |
+ m_FileVersion += FXSYS_toDecimalDigit(ch); |
+ |
+ if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9); |
- if (!bReParse) { |
+ if (!bReParse) |
m_pDocument = new CPDF_Document(this); |
- } |
+ |
FX_BOOL bXRefRebuilt = FALSE; |
if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) { |
FX_FILESIZE startxref_offset = m_Syntax.SavePos(); |
void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), |
m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
CompareFileSize); |
- if (pResult == NULL) { |
+ if (!pResult) |
m_SortedOffset.Add(startxref_offset); |
- } |
+ |
m_Syntax.GetKeyword(); |
FX_BOOL bNumber; |
CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber); |
- if (!bNumber) { |
+ if (!bNumber) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str); |
if (!LoadAllCrossRefV4(m_LastXRefOffset) && |
!LoadAllCrossRefV5(m_LastXRefOffset)) { |
- if (!RebuildCrossRef()) { |
+ if (!RebuildCrossRef()) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
bXRefRebuilt = TRUE; |
m_LastXRefOffset = 0; |
} |
} else { |
- if (!RebuildCrossRef()) { |
+ if (!RebuildCrossRef()) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
bXRefRebuilt = TRUE; |
} |
FX_DWORD dwRet = SetEncryptHandler(); |
- if (dwRet != PDFPARSE_ERROR_SUCCESS) { |
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) |
return dwRet; |
- } |
+ |
m_pDocument->LoadDoc(); |
- if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) { |
- if (bXRefRebuilt) { |
+ if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) { |
+ if (bXRefRebuilt) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
ReleaseEncryptHandler(); |
- if (!RebuildCrossRef()) { |
+ if (!RebuildCrossRef()) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
dwRet = SetEncryptHandler(); |
- if (dwRet != PDFPARSE_ERROR_SUCCESS) { |
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) |
return dwRet; |
- } |
+ |
m_pDocument->LoadDoc(); |
- if (m_pDocument->GetRoot() == NULL) { |
+ if (!m_pDocument->GetRoot()) |
return PDFPARSE_ERROR_FORMAT; |
- } |
} |
FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
sizeof(FX_FILESIZE), CompareFileSize); |
@@ -251,13 +250,12 @@ FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, |
ReleaseEncryptHandler(); |
RebuildCrossRef(); |
RootObjNum = GetRootObjNum(); |
- if (RootObjNum == 0) { |
+ if (RootObjNum == 0) |
return PDFPARSE_ERROR_FORMAT; |
- } |
+ |
dwRet = SetEncryptHandler(); |
- if (dwRet != PDFPARSE_ERROR_SUCCESS) { |
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) |
return dwRet; |
- } |
} |
if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) { |
CPDF_Reference* pMetadata = |
@@ -461,9 +459,8 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
int32_t offset = FXSYS_atoi(pEntry); |
if (offset == 0) { |
for (int32_t c = 0; c < 10; c++) { |
- if (pEntry[c] < '0' || pEntry[c] > '9') { |
+ if (!std::isdigit(pEntry[c])) |
return FALSE; |
- } |
} |
} |
m_CrossRef.SetAtGrow(objnum, offset); |
@@ -562,9 +559,8 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry); |
if (offset == 0) { |
for (int32_t c = 0; c < 10; c++) { |
- if (pEntry[c] < '0' || pEntry[c] > '9') { |
+ if (!std::isdigit(pEntry[c])) |
return false; |
- } |
} |
} |
m_CrossRef.SetAtGrow(objnum, offset); |
@@ -632,28 +628,32 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
uint8_t byte = buffer[i]; |
switch (status) { |
case 0: |
- if (PDFCharIsWhitespace(byte)) { |
+ if (PDFCharIsWhitespace(byte)) |
status = 1; |
- } |
- if (byte <= '9' && byte >= '0') { |
+ |
+ if (std::isdigit(byte)) { |
--i; |
status = 1; |
} |
+ |
if (byte == '%') { |
inside_index = 0; |
status = 9; |
} |
+ |
if (byte == '(') { |
status = 10; |
depth = 1; |
} |
+ |
if (byte == '<') { |
inside_index = 1; |
status = 11; |
} |
- if (byte == '\\') { |
+ |
+ if (byte == '\\') |
status = 13; |
- } |
+ |
if (byte == 't') { |
status = 7; |
inside_index = 1; |
@@ -662,10 +662,10 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
case 1: |
if (PDFCharIsWhitespace(byte)) { |
break; |
- } else if (byte <= '9' && byte >= '0') { |
+ } else if (std::isdigit(byte)) { |
start_pos = pos + i; |
status = 2; |
- objnum = byte - '0'; |
+ objnum = FXSYS_toDecimalDigit(byte); |
} else if (byte == 't') { |
status = 7; |
inside_index = 1; |
@@ -678,8 +678,8 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
break; |
case 2: |
- if (byte <= '9' && byte >= '0') { |
- objnum = objnum * 10 + byte - '0'; |
+ if (std::isdigit(byte)) { |
+ objnum = objnum * 10 + FXSYS_toDecimalDigit(byte); |
break; |
} else if (PDFCharIsWhitespace(byte)) { |
status = 3; |
@@ -690,10 +690,10 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
break; |
case 3: |
- if (byte <= '9' && byte >= '0') { |
+ if (std::isdigit(byte)) { |
start_pos1 = pos + i; |
status = 4; |
- gennum = byte - '0'; |
+ gennum = FXSYS_toDecimalDigit(byte); |
} else if (PDFCharIsWhitespace(byte)) { |
break; |
} else if (byte == 't') { |
@@ -705,8 +705,8 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
} |
break; |
case 4: |
- if (byte <= '9' && byte >= '0') { |
- gennum = gennum * 10 + byte - '0'; |
+ if (std::isdigit(byte)) { |
+ gennum = gennum * 10 + FXSYS_toDecimalDigit(byte); |
break; |
} else if (PDFCharIsWhitespace(byte)) { |
status = 5; |
@@ -721,9 +721,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
inside_index = 1; |
} else if (PDFCharIsWhitespace(byte)) { |
break; |
- } else if (byte <= '9' && byte >= '0') { |
+ } else if (std::isdigit(byte)) { |
objnum = gennum; |
- gennum = byte - '0'; |
+ gennum = FXSYS_toDecimalDigit(byte); |
start_pos = start_pos1; |
start_pos1 = pos + i; |
status = 4; |
@@ -1858,7 +1858,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() { |
break; |
case 1: |
if (ch >= '0' && ch <= '7') { |
- iEscCode = ch - '0'; |
+ iEscCode = FXSYS_toDecimalDigit(ch); |
status = 2; |
break; |
} |
@@ -1883,7 +1883,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() { |
break; |
case 2: |
if (ch >= '0' && ch <= '7') { |
- iEscCode = iEscCode * 8 + ch - '0'; |
+ iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch); |
status = 3; |
} else { |
buf.AppendChar(iEscCode); |
@@ -1893,7 +1893,7 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() { |
break; |
case 3: |
if (ch >= '0' && ch <= '7') { |
- iEscCode = iEscCode * 8 + ch - '0'; |
+ iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch); |
buf.AppendChar(iEscCode); |
status = 0; |
} else { |
@@ -1918,48 +1918,33 @@ CFX_ByteString CPDF_SyntaxParser::ReadString() { |
} |
CFX_ByteString CPDF_SyntaxParser::ReadHexString() { |
uint8_t ch; |
- if (!GetNextChar(ch)) { |
+ if (!GetNextChar(ch)) |
return CFX_ByteString(); |
- } |
+ |
CFX_BinaryBuf buf; |
- FX_BOOL bFirst = TRUE; |
+ bool bFirst = true; |
uint8_t code = 0; |
while (1) { |
- if (ch == '>') { |
+ if (ch == '>') |
break; |
- } |
- if (ch >= '0' && ch <= '9') { |
- if (bFirst) { |
- code = (ch - '0') * 16; |
- } else { |
- code += ch - '0'; |
- buf.AppendByte((uint8_t)code); |
- } |
- bFirst = !bFirst; |
- } else if (ch >= 'A' && ch <= 'F') { |
- if (bFirst) { |
- code = (ch - 'A' + 10) * 16; |
- } else { |
- code += ch - 'A' + 10; |
- buf.AppendByte((uint8_t)code); |
- } |
- bFirst = !bFirst; |
- } else if (ch >= 'a' && ch <= 'f') { |
+ |
+ if (std::isxdigit(ch)) { |
+ int val = FXSYS_toHexDigit(ch); |
if (bFirst) { |
- code = (ch - 'a' + 10) * 16; |
+ code = val * 16; |
} else { |
- code += ch - 'a' + 10; |
+ code += val; |
buf.AppendByte((uint8_t)code); |
} |
bFirst = !bFirst; |
} |
- if (!GetNextChar(ch)) { |
+ |
+ if (!GetNextChar(ch)) |
break; |
- } |
} |
- if (!bFirst) { |
+ if (!bFirst) |
buf.AppendByte((uint8_t)code); |
- } |
+ |
return buf.GetByteString(); |
} |
void CPDF_SyntaxParser::ToNextLine() { |