| 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..735cd2b38a0415886702ff66bf7c5375bd686f05 100644
|
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
|
| @@ -582,7 +582,9 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| m_pTrailer->Release();
|
| m_pTrailer = NULL;
|
| }
|
| - int32_t status = 0;
|
| +
|
| + ParserState state = ParserState::kDefault;
|
| +
|
| int32_t inside_index = 0;
|
| FX_DWORD objnum = 0;
|
| FX_DWORD gennum = 0;
|
| @@ -604,98 +606,106 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
|
|
| for (FX_DWORD i = 0; i < size; i++) {
|
| uint8_t byte = buffer[i];
|
| - switch (status) {
|
| - case 0:
|
| + switch (state) {
|
| + case ParserState::kDefault:
|
| if (PDFCharIsWhitespace(byte))
|
| - status = 1;
|
| + state = ParserState::kWhitespace;
|
|
|
| if (std::isdigit(byte)) {
|
| --i;
|
| - status = 1;
|
| + state = ParserState::kWhitespace;
|
| }
|
|
|
| if (byte == '%') {
|
| inside_index = 0;
|
| - status = 9;
|
| + state = ParserState::kComment;
|
| }
|
|
|
| if (byte == '(') {
|
| - status = 10;
|
| + state = ParserState::kString;
|
| depth = 1;
|
| }
|
|
|
| if (byte == '<') {
|
| inside_index = 1;
|
| - status = 11;
|
| + state = ParserState::kHexString;
|
| }
|
|
|
| if (byte == '\\')
|
| - status = 13;
|
| + state = ParserState::kEscapedString;
|
|
|
| if (byte == 't') {
|
| - status = 7;
|
| + state = 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;
|
| + state = ParserState::kObjNum;
|
| objnum = FXSYS_toDecimalDigit(byte);
|
| +
|
| } else if (byte == 't') {
|
| - status = 7;
|
| + state = ParserState::kTrailer;
|
| inside_index = 1;
|
| +
|
| } else if (byte == 'x') {
|
| - status = 8;
|
| + state = ParserState::kXref;
|
| inside_index = 1;
|
| +
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = 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;
|
| + state = ParserState::kPostObjNum;
|
| } else {
|
| --i;
|
| - status = 14;
|
| + state = ParserState::kEndObj;
|
| inside_index = 0;
|
| }
|
| break;
|
| - case 3:
|
| +
|
| + case ParserState::kPostObjNum:
|
| if (std::isdigit(byte)) {
|
| start_pos1 = pos + i;
|
| - status = 4;
|
| + state = ParserState::kGenNum;
|
| gennum = FXSYS_toDecimalDigit(byte);
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| break;
|
| } else if (byte == 't') {
|
| - status = 7;
|
| + state = ParserState::kTrailer;
|
| inside_index = 1;
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = 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;
|
| + state = ParserState::kPostGenNum;
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 5:
|
| +
|
| + case ParserState::kPostGenNum:
|
| if (byte == 'o') {
|
| - status = 6;
|
| + state = ParserState::kBeginObj;
|
| inside_index = 1;
|
| } else if (PDFCharIsWhitespace(byte)) {
|
| break;
|
| @@ -704,21 +714,22 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| gennum = FXSYS_toDecimalDigit(byte);
|
| start_pos = start_pos1;
|
| start_pos1 = pos + i;
|
| - status = 4;
|
| + state = ParserState::kGenNum;
|
| } else if (byte == 't') {
|
| - status = 7;
|
| + state = ParserState::kTrailer;
|
| inside_index = 1;
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 6:
|
| +
|
| + case ParserState::kBeginObj:
|
| switch (inside_index) {
|
| case 1:
|
| if (byte != 'b') {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| } else {
|
| inside_index++;
|
| }
|
| @@ -726,7 +737,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| case 2:
|
| if (byte != 'j') {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| } else {
|
| inside_index++;
|
| }
|
| @@ -734,7 +745,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| case 3:
|
| if (PDFCharIsWhitespace(byte) || PDFCharIsDelimiter(byte)) {
|
| if (objnum > 0x1000000) {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| break;
|
| }
|
| FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
|
| @@ -793,11 +804,12 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| }
|
| --i;
|
| - status = 0;
|
| + state = 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 +872,34 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| }
|
| }
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| } else if (byte == "trailer"[inside_index]) {
|
| inside_index++;
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 8:
|
| +
|
| + case ParserState::kXref:
|
| if (inside_index == 4) {
|
| last_xref = pos + i - 4;
|
| - status = 1;
|
| + state = ParserState::kWhitespace;
|
| } else if (byte == "xref"[inside_index]) {
|
| inside_index++;
|
| } else {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 9:
|
| +
|
| + case ParserState::kComment:
|
| if (byte == '\r' || byte == '\n') {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 10:
|
| +
|
| + case ParserState::kString:
|
| if (byte == ')') {
|
| if (depth > 0) {
|
| depth--;
|
| @@ -893,29 +908,32 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() {
|
| depth++;
|
| }
|
| if (!depth) {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 11:
|
| +
|
| + case ParserState::kHexString:
|
| if (byte == '>' || (byte == '<' && inside_index == 1))
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| inside_index = 0;
|
| break;
|
| - case 13:
|
| +
|
| + case ParserState::kEscapedString:
|
| if (PDFCharIsDelimiter(byte) || PDFCharIsWhitespace(byte)) {
|
| --i;
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| }
|
| break;
|
| - case 14:
|
| +
|
| + case ParserState::kEndObj:
|
| if (PDFCharIsWhitespace(byte)) {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| } else if (byte == '%' || byte == '(' || byte == '<' ||
|
| byte == '\\') {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| --i;
|
| } else if (inside_index == 6) {
|
| - status = 0;
|
| + state = ParserState::kDefault;
|
| --i;
|
| } else if (byte == "endobj"[inside_index]) {
|
| inside_index++;
|
|
|