Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(575)

Unified Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 1715483002: Name the states for fpdf_parser_parser. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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++;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698