Chromium Code Reviews| 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 9d646b2943e140c0f6764b5b61c04e65c861239a..189d070ff83e9aecfe9e9b35e6471e5c44a5d155 100644 |
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| @@ -36,6 +36,27 @@ struct SearchTagRecord { |
| FX_DWORD m_Offset; |
| }; |
| +enum class ParserState { |
|
Tom Sepez
2016/02/18 19:27:55
Can we make ParserState an enum nested privately i
dsinclair
2016/02/18 19:47:04
Done.
Is there a benefit over having it in the an
Tom Sepez
2016/02/18 19:49:16
Yes, it tells the reader that this state is associ
dsinclair
2016/02/18 19:51:03
Ah, right. Too spoiled by one class per file. Wasn
|
| + kDefault, |
| + kComment, |
|
Tom Sepez
2016/02/18 19:27:55
Can we keep these in the same order as before so t
dsinclair
2016/02/18 19:47:04
I checked through the code, all uses of status are
Tom Sepez
2016/02/18 19:49:16
Acknowledged.
|
| + kWhitespace, |
| + |
|
Tom Sepez
2016/02/18 19:27:55
nit: not sure we need blank lines here.
dsinclair
2016/02/18 19:47:04
Done. Was an attempt at grouping and readability.
|
| + kString, |
| + kHexString, |
| + kEscapedString, |
| + |
| + kXref, |
| + kObjNum, |
| + kPostObjNum, |
| + kGenNum, |
| + kPostGenNum, |
| + |
| + kTrailer, |
| + |
| + kBeginObj, |
| + kEndObj |
| +}; |
| + |
| int32_t GetHeaderOffset(IFX_FileRead* pFile) { |
| const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); |
| const size_t kBufSize = 4; |
| @@ -582,7 +603,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| m_pTrailer->Release(); |
| m_pTrailer = NULL; |
| } |
| - int32_t status = 0; |
| + |
| + enum ParserState status = ParserState::kDefault; |
|
Tom Sepez
2016/02/18 19:27:55
nit: |enum| needed ? Also, can we rename this |sta
dsinclair
2016/02/18 19:47:04
Done.
|
| + |
| int32_t inside_index = 0; |
| FX_DWORD objnum = 0; |
| FX_DWORD gennum = 0; |
| @@ -605,97 +628,105 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| for (FX_DWORD i = 0; i < size; i++) { |
| uint8_t byte = buffer[i]; |
| switch (status) { |
| - case 0: |
| + case ParserState::kDefault: |
| if (PDFCharIsWhitespace(byte)) |
| - status = 1; |
| + status = ParserState::kWhitespace; |
| if (std::isdigit(byte)) { |
| --i; |
| - status = 1; |
| + status = ParserState::kWhitespace; |
| } |
| if (byte == '%') { |
| inside_index = 0; |
| - status = 9; |
| + status = ParserState::kComment; |
| } |
| if (byte == '(') { |
| - status = 10; |
| + status = ParserState::kString; |
| depth = 1; |
| } |
| if (byte == '<') { |
| inside_index = 1; |
| - status = 11; |
| + status = ParserState::kHexString; |
| } |
| if (byte == '\\') |
| - status = 13; |
| + status = ParserState::kEscapedString; |
| if (byte == 't') { |
| - status = 7; |
| + status = ParserState::kTrailer; |
| inside_index = 1; |
| } |
| break; |
| - case 1: |
| + |
| + case ParserState::kWhitespace: |
| if (PDFCharIsWhitespace(byte)) { |
| break; |
| } else if (std::isdigit(byte)) { |
| start_pos = pos + i; |
| - status = 2; |
| + status = ParserState::kObjNum; |
| objnum = FXSYS_toDecimalDigit(byte); |
| + |
| } else if (byte == 't') { |
| - status = 7; |
| + status = ParserState::kTrailer; |
| inside_index = 1; |
| + |
| } else if (byte == 'x') { |
| - status = 8; |
| + status = ParserState::kXref; |
| inside_index = 1; |
| + |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 2: |
| + |
| + case ParserState::kObjNum: |
| if (std::isdigit(byte)) { |
| objnum = objnum * 10 + FXSYS_toDecimalDigit(byte); |
| break; |
| } else if (PDFCharIsWhitespace(byte)) { |
| - status = 3; |
| + status = ParserState::kPostObjNum; |
| } else { |
| --i; |
| - status = 14; |
| + status = ParserState::kEndObj; |
| inside_index = 0; |
| } |
| break; |
| - case 3: |
| + |
| + case ParserState::kPostObjNum: |
| if (std::isdigit(byte)) { |
| start_pos1 = pos + i; |
| - status = 4; |
| + status = ParserState::kGenNum; |
| gennum = FXSYS_toDecimalDigit(byte); |
| } else if (PDFCharIsWhitespace(byte)) { |
| break; |
| } else if (byte == 't') { |
| - status = 7; |
| + status = ParserState::kTrailer; |
| inside_index = 1; |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 4: |
| + |
| + case ParserState::kGenNum: |
| if (std::isdigit(byte)) { |
| gennum = gennum * 10 + FXSYS_toDecimalDigit(byte); |
| break; |
| } else if (PDFCharIsWhitespace(byte)) { |
| - status = 5; |
| + status = ParserState::kPostGenNum; |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 5: |
| + |
| + case ParserState::kPostGenNum: |
| if (byte == 'o') { |
| - status = 6; |
| + status = ParserState::kBeginObj; |
| inside_index = 1; |
| } else if (PDFCharIsWhitespace(byte)) { |
| break; |
| @@ -704,21 +735,22 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| gennum = FXSYS_toDecimalDigit(byte); |
| start_pos = start_pos1; |
| start_pos1 = pos + i; |
| - status = 4; |
| + status = ParserState::kGenNum; |
| } else if (byte == 't') { |
| - status = 7; |
| + status = ParserState::kTrailer; |
| inside_index = 1; |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 6: |
| + |
| + case ParserState::kBeginObj: |
| switch (inside_index) { |
| case 1: |
| if (byte != 'b') { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } else { |
| inside_index++; |
| } |
| @@ -726,7 +758,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| case 2: |
| if (byte != 'j') { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } else { |
| inside_index++; |
| } |
| @@ -734,7 +766,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| case 3: |
| if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { |
| if (objnum > 0x1000000) { |
| - status = 0; |
| + status = ParserState::kDefault; |
| break; |
| } |
| FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; |
| @@ -793,11 +825,12 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| } |
| } |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| break; |
| } |
| break; |
| - case 7: |
| + |
| + case ParserState::kTrailer: |
| if (inside_index == 7) { |
| if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) { |
| last_trailer = pos + i - 7; |
| @@ -860,31 +893,34 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| } |
| } |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } else if (byte == "trailer"[inside_index]) { |
| inside_index++; |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 8: |
| + |
| + case ParserState::kXref: |
| if (inside_index == 4) { |
| last_xref = pos + i - 4; |
| - status = 1; |
| + status = ParserState::kWhitespace; |
| } else if (byte == "xref"[inside_index]) { |
| inside_index++; |
| } else { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 9: |
| + |
| + case ParserState::kComment: |
| if (byte == '\r' || byte == '\n') { |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 10: |
| + |
| + case ParserState::kString: |
| if (byte == ')') { |
| if (depth > 0) { |
| depth--; |
| @@ -893,29 +929,32 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| depth++; |
| } |
| if (!depth) { |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 11: |
| + |
| + case ParserState::kHexString: |
| if (byte == '>' || (byte == '<' && inside_index == 1)) |
| - status = 0; |
| + status = ParserState::kDefault; |
| inside_index = 0; |
| break; |
| - case 13: |
|
Tom Sepez
2016/02/18 19:27:55
Heh. No 12.
dsinclair
2016/02/18 19:47:04
Acknowledged.
|
| + |
| + case ParserState::kEscapedString: |
| if (PDFCharIsDelimiter(byte) || PDFCharIsWhitespace(byte)) { |
| --i; |
| - status = 0; |
| + status = ParserState::kDefault; |
| } |
| break; |
| - case 14: |
| + |
| + case ParserState::kEndObj: |
| if (PDFCharIsWhitespace(byte)) { |
| - status = 0; |
| + status = ParserState::kDefault; |
| } else if (byte == '%' || byte == '(' || byte == '<' || |
| byte == '\\') { |
| - status = 0; |
| + status = ParserState::kDefault; |
| --i; |
| } else if (inside_index == 6) { |
| - status = 0; |
| + status = ParserState::kDefault; |
| --i; |
| } else if (byte == "endobj"[inside_index]) { |
| inside_index++; |