OLD | NEW |
---|---|
(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 } | |
OLD | NEW |