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

Side by Side Diff: core/src/fpdfapi/fpdf_parser/cpdf_simple_parser.cpp

Issue 1773103003: Split off CPDF_Parser and CPDF_SimpleParser into .h/.cpp files (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 9 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "core/include/fpdfapi/cpdf_simple_parser.h"
8
9 #include "core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.h"
10
11 CPDF_SimpleParser::CPDF_SimpleParser(const uint8_t* pData, FX_DWORD dwSize) {
12 m_pData = pData;
dsinclair 2016/03/09 15:24:57 Move these to : m_pData(pData), m_dwSize(dwSize),
Tom Sepez 2016/03/09 18:39:29 Done.
13 m_dwSize = dwSize;
14 m_dwCurPos = 0;
15 }
16
17 CPDF_SimpleParser::CPDF_SimpleParser(const CFX_ByteStringC& str) {
dsinclair 2016/03/09 15:24:57 : m_pData(str.GetPtr()), m_dwSize(str.GetLength())
Tom Sepez 2016/03/09 18:39:29 Done.
18 m_pData = str.GetPtr();
19 m_dwSize = str.GetLength();
20 m_dwCurPos = 0;
21 }
22
23 void CPDF_SimpleParser::ParseWord(const uint8_t*& pStart, FX_DWORD& dwSize) {
24 pStart = NULL;
dsinclair 2016/03/09 15:24:57 nit: nullptr
Tom Sepez 2016/03/09 18:39:29 Done.
25 dwSize = 0;
26 uint8_t ch;
27 while (1) {
28 if (m_dwSize <= m_dwCurPos)
29 return;
30 ch = m_pData[m_dwCurPos++];
31 while (PDFCharIsWhitespace(ch)) {
32 if (m_dwSize <= m_dwCurPos)
33 return;
34 ch = m_pData[m_dwCurPos++];
35 }
36
37 if (ch != '%')
38 break;
39
40 while (1) {
41 if (m_dwSize <= m_dwCurPos)
42 return;
43 ch = m_pData[m_dwCurPos++];
44 if (ch == '\r' || ch == '\n')
dsinclair 2016/03/09 15:24:57 PDFCharIsLineEnding(ch)
Tom Sepez 2016/03/09 18:39:29 Done.
45 break;
46 }
47 }
48
49 FX_DWORD start_pos = m_dwCurPos - 1;
50 pStart = m_pData + start_pos;
51 if (PDFCharIsDelimiter(ch)) {
52 if (ch == '/') {
53 while (1) {
54 if (m_dwSize <= m_dwCurPos)
55 return;
56 ch = m_pData[m_dwCurPos++];
57 if (!PDFCharIsOther(ch) && !PDFCharIsNumeric(ch)) {
58 m_dwCurPos--;
59 dwSize = m_dwCurPos - start_pos;
60 return;
61 }
62 }
63 } else {
64 dwSize = 1;
65 if (ch == '<') {
66 if (m_dwSize <= m_dwCurPos)
67 return;
68 ch = m_pData[m_dwCurPos++];
69 if (ch == '<')
70 dwSize = 2;
71 else
72 m_dwCurPos--;
73 } else if (ch == '>') {
74 if (m_dwSize <= m_dwCurPos)
75 return;
76 ch = m_pData[m_dwCurPos++];
77 if (ch == '>')
78 dwSize = 2;
79 else
80 m_dwCurPos--;
81 }
82 }
83 return;
84 }
85
86 dwSize = 1;
87 while (1) {
88 if (m_dwSize <= m_dwCurPos)
89 return;
90 ch = m_pData[m_dwCurPos++];
91
92 if (PDFCharIsDelimiter(ch) || PDFCharIsWhitespace(ch)) {
93 m_dwCurPos--;
94 break;
95 }
96 dwSize++;
97 }
98 }
99
100 CFX_ByteStringC CPDF_SimpleParser::GetWord() {
101 const uint8_t* pStart;
102 FX_DWORD dwSize;
103 ParseWord(pStart, dwSize);
104 if (dwSize == 1 && pStart[0] == '<') {
105 while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
106 m_dwCurPos++;
107 }
108 if (m_dwCurPos < m_dwSize) {
109 m_dwCurPos++;
110 }
111 return CFX_ByteStringC(pStart,
112 (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
113 }
114 if (dwSize == 1 && pStart[0] == '(') {
115 int level = 1;
116 while (m_dwCurPos < m_dwSize) {
117 if (m_pData[m_dwCurPos] == ')') {
118 level--;
119 if (level == 0) {
120 break;
121 }
122 }
123 if (m_pData[m_dwCurPos] == '\\') {
124 if (m_dwSize <= m_dwCurPos) {
125 break;
126 }
127 m_dwCurPos++;
128 } else if (m_pData[m_dwCurPos] == '(') {
129 level++;
130 }
131 if (m_dwSize <= m_dwCurPos) {
132 break;
133 }
134 m_dwCurPos++;
135 }
136 if (m_dwCurPos < m_dwSize) {
137 m_dwCurPos++;
138 }
139 return CFX_ByteStringC(pStart,
140 (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
141 }
142 return CFX_ByteStringC(pStart, dwSize);
143 }
144
145 bool CPDF_SimpleParser::FindTagParamFromStart(const CFX_ByteStringC& token,
146 int nParams) {
147 nParams++;
148 FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
149 int buf_index = 0;
150 int buf_count = 0;
151 m_dwCurPos = 0;
152 while (1) {
153 pBuf[buf_index++] = m_dwCurPos;
154 if (buf_index == nParams) {
155 buf_index = 0;
156 }
157 buf_count++;
158 if (buf_count > nParams) {
159 buf_count = nParams;
160 }
161 CFX_ByteStringC word = GetWord();
162 if (word.IsEmpty()) {
163 FX_Free(pBuf);
164 return false;
165 }
166 if (word == token) {
167 if (buf_count < nParams) {
168 continue;
169 }
170 m_dwCurPos = pBuf[buf_index];
171 FX_Free(pBuf);
172 return true;
173 }
174 }
175 return false;
176 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698