1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtCore module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40//
41// W A R N I N G
42// -------------
43//
44// This file is not part of the Qt API. It exists for the convenience
45// of other Qt classes. This header file may change from version to
46// version without notice, or even be removed.
47//
48// We mean it.
49//
50
51#include <QtCore/private/qglobal_p.h>
52
53// This file was generated by qlalr - DO NOT EDIT!
54#ifndef QXMLSTREAM_P_H
55#define QXMLSTREAM_P_H
56
57#if defined(ERROR)
58# undef ERROR
59#endif
60
61class QXmlStreamReader_Table
62{
63public:
64 enum VariousConstants {
65 EOF_SYMBOL = 0,
66 AMPERSAND = 5,
67 ANY = 41,
68 ATTLIST = 31,
69 BANG = 25,
70 CDATA = 47,
71 CDATA_START = 28,
72 COLON = 17,
73 COMMA = 19,
74 DASH = 20,
75 DBLQUOTE = 8,
76 DIGIT = 27,
77 DOCTYPE = 29,
78 DOT = 23,
79 ELEMENT = 30,
80 EMPTY = 40,
81 ENTITIES = 51,
82 ENTITY = 32,
83 ENTITY_DONE = 45,
84 EQ = 14,
85 ERROR = 43,
86 FIXED = 39,
87 HASH = 6,
88 ID = 48,
89 IDREF = 49,
90 IDREFS = 50,
91 IMPLIED = 38,
92 LANGLE = 3,
93 LBRACK = 9,
94 LETTER = 26,
95 LPAREN = 11,
96 NDATA = 36,
97 NMTOKEN = 52,
98 NMTOKENS = 53,
99 NOTATION = 33,
100 NOTOKEN = 1,
101 PARSE_ENTITY = 44,
102 PCDATA = 42,
103 PERCENT = 15,
104 PIPE = 13,
105 PLUS = 21,
106 PUBLIC = 35,
107 QUESTIONMARK = 24,
108 QUOTE = 7,
109 RANGLE = 4,
110 RBRACK = 10,
111 REQUIRED = 37,
112 RPAREN = 12,
113 SEMICOLON = 18,
114 SHIFT_THERE = 56,
115 SLASH = 16,
116 SPACE = 2,
117 STAR = 22,
118 SYSTEM = 34,
119 UNRESOLVED_ENTITY = 46,
120 VERSION = 55,
121 XML = 54,
122
123 ACCEPT_STATE = 416,
124 RULE_COUNT = 270,
125 STATE_COUNT = 427,
126 TERMINAL_COUNT = 57,
127 NON_TERMINAL_COUNT = 84,
128
129 GOTO_INDEX_OFFSET = 427,
130 GOTO_INFO_OFFSET = 1017,
131 GOTO_CHECK_OFFSET = 1017
132 };
133
134 static const char *const spell [];
135 static const short lhs [];
136 static const short rhs [];
137 static const short goto_default [];
138 static const short action_default [];
139 static const short action_index [];
140 static const short action_info [];
141 static const short action_check [];
142
143 static inline int nt_action (int state, int nt)
144 {
145 const int yyn = action_index [GOTO_INDEX_OFFSET + state] + nt;
146 if (yyn < 0 || action_check [GOTO_CHECK_OFFSET + yyn] != nt)
147 return goto_default [nt];
148
149 return action_info [GOTO_INFO_OFFSET + yyn];
150 }
151
152 static inline int t_action (int state, int token)
153 {
154 const int yyn = action_index [state] + token;
155
156 if (yyn < 0 || action_check [yyn] != token)
157 return - action_default [state];
158
159 return action_info [yyn];
160 }
161};
162
163
164const char *const QXmlStreamReader_Table::spell [] = {
165 "end of file", nullptr, " ", "<", ">", "&", "#", "\'", "\"", "[",
166 "]", "(", ")", "|", "=", "%", "/", ":", ";", ",",
167 "-", "+", "*", ".", "?", "!", "[a-zA-Z]", "[0-9]", "[CDATA[", "DOCTYPE",
168 "ELEMENT", "ATTLIST", "ENTITY", "NOTATION", "SYSTEM", "PUBLIC", "NDATA", "REQUIRED", "IMPLIED", "FIXED",
169 "EMPTY", "ANY", "PCDATA", nullptr, nullptr, nullptr, nullptr, "CDATA", "ID", "IDREF",
170 "IDREFS", "ENTITIES", "NMTOKEN", "NMTOKENS", "<?xml", "version", nullptr};
171
172const short QXmlStreamReader_Table::lhs [] = {
173 57, 57, 59, 59, 59, 59, 59, 59, 59, 59,
174 67, 68, 64, 72, 72, 72, 75, 66, 66, 66,
175 66, 79, 78, 80, 80, 80, 80, 80, 80, 80,
176 81, 81, 81, 81, 81, 81, 81, 87, 83, 88,
177 88, 88, 88, 91, 92, 93, 93, 93, 93, 94,
178 94, 96, 96, 96, 97, 97, 98, 98, 99, 99,
179 100, 100, 89, 89, 95, 90, 101, 101, 103, 103,
180 103, 103, 103, 103, 103, 103, 103, 103, 104, 105,
181 105, 105, 105, 107, 108, 109, 109, 84, 84, 110,
182 110, 112, 112, 85, 85, 85, 65, 65, 76, 114,
183 63, 115, 116, 86, 86, 86, 117, 117, 117, 117,
184 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
185 117, 117, 117, 117, 117, 117, 117, 117, 117, 118,
186 118, 119, 119, 119, 119, 119, 119, 119, 119, 122,
187 70, 70, 70, 70, 123, 124, 123, 124, 123, 124,
188 123, 124, 126, 126, 126, 126, 126, 126, 126, 126,
189 126, 126, 126, 126, 126, 126, 126, 126, 126, 126,
190 126, 126, 126, 126, 125, 73, 113, 113, 113, 113,
191 127, 128, 127, 128, 127, 128, 127, 128, 129, 129,
192 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
193 129, 129, 129, 129, 129, 129, 129, 129, 129, 129,
194 129, 129, 129, 106, 106, 106, 106, 131, 132, 131,
195 132, 131, 131, 132, 132, 133, 133, 133, 133, 135,
196 71, 71, 71, 136, 136, 137, 62, 60, 61, 138,
197 121, 82, 130, 134, 120, 139, 139, 139, 139, 58,
198 58, 58, 58, 58, 58, 58, 58, 58, 58, 74,
199 69, 69, 77, 111, 102, 102, 102, 102, 102, 140};
200
201const short QXmlStreamReader_Table::rhs [] = {
202 2, 1, 4, 2, 2, 2, 2, 2, 2, 0,
203 1, 1, 9, 2, 4, 0, 4, 4, 6, 6,
204 4, 1, 3, 1, 1, 1, 2, 2, 2, 0,
205 1, 1, 1, 1, 1, 1, 1, 4, 4, 1,
206 1, 1, 1, 1, 2, 1, 1, 1, 0, 2,
207 2, 2, 6, 6, 1, 5, 1, 5, 3, 5,
208 0, 1, 6, 8, 4, 2, 1, 5, 1, 1,
209 1, 1, 1, 1, 1, 1, 6, 7, 1, 2,
210 2, 1, 4, 3, 3, 1, 2, 5, 6, 4,
211 6, 3, 5, 5, 3, 4, 4, 5, 2, 3,
212 2, 2, 4, 5, 5, 7, 1, 1, 1, 1,
213 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
214 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
215 1, 2, 2, 2, 2, 1, 1, 1, 1, 1,
216 2, 2, 3, 3, 2, 2, 2, 2, 1, 1,
217 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
218 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
219 1, 1, 1, 1, 1, 1, 2, 2, 3, 3,
220 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
221 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
222 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
223 1, 1, 1, 2, 2, 3, 3, 2, 2, 2,
224 2, 1, 1, 1, 1, 1, 1, 1, 1, 5,
225 0, 1, 3, 1, 3, 2, 4, 3, 5, 1,
226 3, 3, 3, 3, 4, 1, 1, 2, 2, 2,
227 4, 2, 2, 2, 2, 2, 2, 2, 0, 1,
228 0, 1, 1, 1, 1, 1, 1, 1, 1, 2};
229
230const short QXmlStreamReader_Table::action_default [] = {
231 10, 259, 0, 2, 1, 0, 125, 117, 119, 120,
232 127, 129, 123, 11, 114, 108, 0, 109, 128, 111,
233 115, 113, 121, 124, 126, 107, 110, 112, 118, 116,
234 131, 122, 240, 12, 254, 136, 250, 253, 0, 130,
235 140, 257, 16, 252, 138, 137, 0, 256, 139, 259,
236 231, 258, 255, 0, 0, 264, 0, 247, 246, 0,
237 249, 248, 245, 241, 99, 263, 0, 236, 0, 0,
238 260, 97, 98, 101, 0, 132, 134, 133, 135, 0,
239 0, 261, 0, 0, 176, 0, 173, 165, 167, 168,
240 142, 154, 171, 162, 156, 157, 153, 159, 163, 161,
241 169, 172, 152, 155, 158, 160, 166, 164, 174, 170,
242 150, 175, 0, 144, 148, 146, 151, 141, 149, 0,
243 147, 143, 145, 0, 15, 14, 262, 0, 22, 21,
244 261, 30, 0, 20, 0, 0, 32, 37, 31, 0,
245 33, 261, 0, 34, 0, 24, 0, 35, 0, 26,
246 36, 25, 0, 242, 41, 40, 261, 43, 49, 261,
247 42, 0, 44, 261, 49, 261, 0, 261, 0, 49,
248 0, 48, 46, 47, 51, 52, 261, 261, 0, 57,
249 261, 54, 261, 0, 58, 0, 55, 261, 53, 261,
250 0, 56, 65, 0, 261, 61, 261, 0, 59, 62,
251 63, 0, 261, 0, 0, 60, 64, 45, 50, 66,
252 0, 39, 0, 0, 261, 0, 94, 95, 0, 0,
253 0, 0, 261, 0, 210, 201, 203, 205, 178, 190,
254 208, 199, 193, 191, 194, 189, 196, 198, 206, 209,
255 188, 192, 195, 197, 202, 200, 204, 207, 211, 213,
256 212, 186, 0, 0, 243, 180, 184, 182, 0, 0,
257 93, 187, 177, 185, 0, 183, 179, 181, 92, 0,
258 96, 0, 0, 0, 0, 0, 261, 86, 261, 0,
259 262, 0, 87, 0, 89, 69, 74, 73, 70, 71,
260 72, 261, 75, 76, 0, 0, 0, 269, 268, 266,
261 267, 265, 67, 261, 0, 261, 0, 0, 68, 77,
262 261, 0, 261, 0, 0, 78, 0, 79, 0, 82,
263 85, 0, 0, 215, 225, 224, 0, 227, 229, 228,
264 226, 0, 244, 217, 221, 219, 223, 214, 222, 0,
265 220, 216, 218, 0, 81, 80, 0, 83, 0, 84,
266 88, 100, 0, 38, 0, 0, 0, 0, 91, 90,
267 0, 103, 23, 27, 29, 28, 0, 0, 261, 262,
268 0, 261, 0, 106, 105, 261, 0, 104, 102, 0,
269 0, 18, 261, 17, 0, 19, 0, 0, 251, 0,
270 261, 0, 239, 0, 232, 238, 0, 237, 234, 261,
271 261, 262, 233, 235, 0, 261, 0, 230, 261, 0,
272 261, 0, 231, 0, 0, 13, 270, 9, 5, 8,
273 4, 0, 7, 259, 6, 0, 3};
274
275const short QXmlStreamReader_Table::goto_default [] = {
276 2, 4, 3, 49, 388, 43, 37, 52, 47, 41,
277 249, 53, 127, 84, 393, 81, 85, 126, 42, 46,
278 169, 130, 131, 146, 145, 149, 138, 136, 140, 147,
279 139, 159, 160, 157, 168, 167, 209, 165, 164, 166,
280 187, 180, 196, 200, 303, 302, 295, 321, 320, 319,
281 279, 277, 278, 142, 56, 141, 222, 38, 34, 148,
282 39, 48, 40, 248, 45, 36, 119, 112, 330, 111,
283 264, 252, 251, 250, 339, 326, 325, 329, 398, 399,
284 50, 51, 59, 0};
285
286const short QXmlStreamReader_Table::action_index [] = {
287 -21, -57, 33, 119, 960, 70, -57, -57, -57, -57,
288 -57, -57, -57, -57, -57, -57, 105, -57, -57, -57,
289 -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
290 -57, -57, -57, -57, -57, -57, -57, -57, 40, -57,
291 795, -57, 47, -57, -57, -57, 107, -57, -57, -57,
292 84, -57, -57, -38, 80, -57, 12, -57, -57, 97,
293 -57, -57, -57, -57, -57, -57, 13, -57, 56, 34,
294 -57, -57, -57, -57, 51, -57, -57, -57, -57, 53,
295 57, 84, 300, 255, -57, 84, -57, -57, -57, -57,
296 -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
297 -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
298 -57, -57, 355, -57, -57, -57, -57, -57, -57, 326,
299 -57, -57, -57, 48, -57, -57, -57, 50, -57, -57,
300 84, 155, 32, -57, 38, 22, -57, -57, -57, 115,
301 -57, 35, 156, -57, 173, -57, 245, -57, 44, -57,
302 -57, -57, 16, -57, -57, -57, 29, -57, 116, 29,
303 -57, 133, -57, 29, 129, 84, 15, 29, -22, 121,
304 74, -57, -57, -57, -57, 82, 29, 29, 88, -57,
305 29, 7, 29, 86, -57, 83, -57, 27, 19, 26,
306 94, -57, -57, 106, 29, 3, 29, -8, -57, -57,
307 -57, 104, 29, -6, -7, -57, -57, -57, -57, -57,
308 17, -57, -2, 11, 29, 18, -57, -57, 850, 65,
309 465, 67, 84, 135, -57, -57, -57, -57, -57, -57,
310 -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
311 -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
312 -57, -57, 630, 24, -57, -57, -57, -57, 84, 76,
313 -57, -57, -57, -57, 740, -57, -57, -57, -57, 39,
314 -57, 23, 21, 14, 78, 22, 84, -57, 84, 184,
315 20, 31, -57, 41, -57, -57, -57, -57, -57, -57,
316 -57, 84, -57, -57, 36, 126, 162, -57, -57, -57,
317 -57, -57, -57, 29, 79, 29, 29, 160, -57, -57,
318 29, 145, 29, 75, 29, -57, 575, -57, 410, -57,
319 -57, 110, 64, -57, -57, -57, 685, -57, -57, -57,
320 -57, -17, -57, -57, -57, -57, -57, -57, -57, 520,
321 -57, -57, -57, 29, -57, -57, 61, -57, 29, -57,
322 -57, -57, 29, -57, 29, 29, -15, 29, -57, -57,
323 29, -57, -57, -57, -57, -57, 95, 43, 29, 45,
324 9, 29, 10, -57, -57, 29, 2, -57, -57, -24,
325 190, -57, 29, -57, 1, -57, 905, 150, -57, -26,
326 29, 0, -57, 109, -26, -57, 8, -57, -57, 29,
327 29, -19, -57, -57, -11, 29, 59, -57, 29, -5,
328 29, 103, 29, -16, 6, -57, -57, -57, -57, -57,
329 -57, 69, -57, -57, -57, 905, -57,
330
331 -84, -84, -84, 204, 75, -84, -84, -84, -84, -84,
332 -84, -84, -84, -84, -84, -84, 7, -84, -84, -84,
333 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
334 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
335 101, -84, -84, -84, -84, -84, -84, -84, -84, 64,
336 54, -84, -84, -84, -84, -84, -84, -84, -84, -84,
337 -84, -84, -84, -84, -84, -84, 68, -84, 30, -84,
338 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
339 32, -84, -16, -7, -84, 42, -84, -84, -84, -84,
340 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
341 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
342 -84, -84, 45, -84, -84, -84, -84, -84, -84, 44,
343 -84, -84, -84, 33, -84, -84, -84, -84, -84, -84,
344 36, 108, -84, -84, -84, 69, -84, -84, -84, 62,
345 -84, 63, -84, -84, -84, -84, 118, -84, -84, -84,
346 -84, -84, -84, -84, -84, -84, -2, -84, -84, -10,
347 -84, -84, -84, 25, -21, 11, -84, 20, -84, -25,
348 -84, -84, -84, -84, -84, -84, 1, 2, -36, -84,
349 -9, -84, 5, -13, -84, -8, -84, 6, -84, 8,
350 12, -84, -84, -84, 23, -84, 4, -1, -84, -84,
351 -84, -84, 0, -84, -14, -84, -84, -84, -84, -84,
352 -84, -84, 55, -84, 58, -84, -84, -84, -84, 53,
353 47, 123, 67, 66, -84, -84, -84, -84, -84, -84,
354 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
355 -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
356 -84, -84, -15, -84, -84, -84, -84, -84, 41, 40,
357 -84, -84, -84, -84, -46, -84, -84, -84, -84, -84,
358 -84, 35, -84, 34, 37, 18, 70, -84, 89, -84,
359 43, -84, -84, -84, -84, -84, -84, -84, -84, -84,
360 -84, 48, -84, -84, -84, -84, -84, -84, -84, -84,
361 -84, -84, -84, 31, -84, 29, 27, 17, -84, -84,
362 38, 24, 39, -84, 49, -84, 71, -84, 93, -84,
363 -84, -84, -12, -84, -84, -84, 94, -84, -84, -84,
364 -84, -84, -84, -84, -84, -84, -84, -84, -84, 78,
365 -84, -84, -84, 50, -84, -84, 46, -84, 56, -84,
366 -84, -84, 60, -84, 61, 59, 51, 57, -84, -84,
367 14, -84, -84, -84, -84, -84, -11, -6, 72, -5,
368 -84, -3, -84, -84, -84, 52, -84, -84, -84, -20,
369 77, -84, 21, -84, -84, -84, 76, 16, -84, 19,
370 26, -84, -84, -84, 10, -84, -84, -84, -84, 80,
371 13, 73, -84, -84, -84, 22, -27, -84, 9, -84,
372 28, 15, 82, -84, -84, -84, -84, -84, -84, -84,
373 -84, -84, -84, 3, -84, 98, -84};
374
375const short QXmlStreamReader_Table::action_info [] = {
376 65, 332, 65, 405, 392, 385, 377, 65, 414, 410,
377 415, 55, 397, 374, 373, 217, 206, 408, 65, 65,
378 207, 211, 216, 1, 55, 199, 182, 192, 70, 70,
379 63, 70, 189, 416, 153, 350, 133, 70, 72, 55,
380 65, 351, 254, 270, 73, 284, 65, 310, 55, 65,
381 83, 82, 83, 82, 129, 83, 82, 54, 70, 128,
382 83, 82, 66, 64, 83, 82, 318, 316, 318, 316,
383 54, 212, 83, 82, 83, 82, 54, 55, 367, 366,
384 69, 80, 79, 83, 82, 163, 70, 314, 305, 272,
385 55, 306, 305, 354, 163, 177, 55, 163, 379, 163,
386 65, 176, 83, 82, 55, 163, 58, 57, 0, 65,
387 83, 82, 65, 395, 65, 62, 203, 202, 195, 194,
388 65, 417, 16, 61, 60, 396, 156, 272, 0, 66,
389 64, 65, 317, 318, 316, 378, 379, 171, 173, 162,
390 172, 54, 171, 173, 163, 172, 0, 345, 344, 343,
391 171, 173, 0, 172, 0, 155, 154, 70, 134, 65,
392 0, 55, 297, 220, 218, 298, 389, 0, 300, 0,
393 135, 301, 299, 33, 66, 64, 65, 297, 0, 297,
394 298, 0, 298, 300, 0, 300, 301, 299, 301, 299,
395 221, 219, 70, 272, 381, 291, 0, 0, 0, 128,
396 13, 0, 0, 273, 271, 274, 275, 0, 0, 0,
397 0, 0, 0, 0, 0, 0, 287, 294, 0, 0,
398 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
399 0, 285, 288, 289, 290, 286, 292, 293, 0, 0,
400 0, 0, 0, 0, 0, 0, 0, 70, 134, 0,
401 0, 0, 0, 0, 0, 362, 0, 108, 0, 103,
402 135, 94, 117, 116, 95, 104, 97, 105, 99, 93,
403 98, 107, 87, 106, 88, 89, 100, 109, 92, 101,
404 86, 96, 91, 0, 0, 0, 0, 0, 0, 0,
405 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
406 0, 0, 108, 0, 103, 0, 94, 102, 90, 95,
407 104, 97, 105, 99, 93, 98, 107, 87, 106, 88,
408 89, 100, 109, 92, 101, 86, 96, 91, 108, 0,
409 103, 0, 94, 121, 120, 95, 104, 97, 105, 99,
410 93, 98, 107, 87, 106, 88, 89, 100, 109, 92,
411 101, 86, 96, 91, 0, 0, 0, 108, 0, 103,
412 0, 94, 114, 113, 95, 104, 97, 105, 99, 93,
413 98, 107, 87, 106, 88, 89, 100, 109, 92, 101,
414 86, 96, 91, 0, 0, 0, 0, 0, 0, 0,
415 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
416 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
417 0, 0, 108, 0, 103, 322, 94, 337, 336, 95,
418 104, 97, 105, 99, 93, 98, 107, 87, 106, 88,
419 89, 100, 109, 92, 101, 86, 96, 91, 0, 0,
420 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
421 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
422 0, 0, 0, 0, 0, 0, 0, 246, 233, 241,
423 223, 232, 262, 261, 234, 242, 236, 243, 237, 231,
424 0, 245, 225, 244, 226, 227, 238, 247, 230, 239,
425 224, 235, 229, 0, 0, 0, 0, 0, 0, 0,
426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
427 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
428 0, 0, 108, 0, 103, 322, 94, 341, 340, 95,
429 104, 97, 105, 99, 93, 98, 107, 87, 106, 88,
430 89, 100, 109, 92, 101, 86, 96, 91, 0, 0,
431 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
433 0, 0, 0, 0, 0, 0, 0, 108, 0, 103,
434 322, 94, 324, 323, 95, 104, 97, 105, 99, 93,
435 98, 107, 87, 106, 88, 89, 100, 109, 92, 101,
436 86, 96, 91, 0, 0, 0, 0, 0, 0, 0,
437 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
438 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
439 0, 0, 246, 233, 241, 223, 232, 256, 255, 234,
440 242, 236, 243, 237, 231, 0, 245, 225, 244, 226,
441 227, 238, 247, 230, 239, 224, 235, 229, 0, 0,
442 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
443 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
444 0, 0, 0, 0, 0, 0, 0, 108, 0, 103,
445 322, 94, 334, 333, 95, 104, 97, 105, 99, 93,
446 98, 107, 87, 106, 88, 89, 100, 109, 92, 101,
447 86, 96, 91, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
449 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
450 0, 0, 246, 233, 241, 223, 232, 266, 265, 234,
451 242, 236, 243, 237, 231, 0, 245, 225, 244, 226,
452 227, 238, 247, 230, 239, 224, 235, 229, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 30, 0, 25,
456 74, 15, 24, 10, 17, 26, 19, 27, 21, 14,
457 20, 29, 7, 28, 8, 9, 22, 31, 12, 23,
458 6, 18, 11, 0, 0, 0, 0, 0, 0, 0,
459 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
460 13, 0, 0, 0, 0, 0, 0, 0, 0, 0,
461 0, 0, 246, 233, 241, 223, 232, 240, 228, 234,
462 242, 236, 243, 237, 231, 0, 245, 225, 244, 226,
463 227, 238, 247, 230, 239, 224, 235, 229, 0, 0,
464 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
465 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
466 0, 0, 0, 0, 0, 0, 0, 30, 387, 25,
467 5, 15, 24, 10, 17, 26, 19, 27, 21, 14,
468 20, 29, 7, 28, 8, 9, 22, 31, 12, 23,
469 6, 18, 11, 0, 0, 0, 0, 0, 0, 0,
470 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
471 13, 32, 0, 0, 0, 0, 0, 0, 0, 33,
472 0, 0, 30, 16, 25, 5, 15, 24, 10, 17,
473 26, 19, 27, 21, 14, 20, 29, 7, 28, 8,
474 9, 22, 31, 12, 23, 6, 18, 11, 0, 0,
475 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
476 0, 0, 0, 0, 0, 13, 32, 0, 0, 0,
477 0, 0, 0, 0, 33, 0, 0,
478
479 380, 179, 210, 181, 425, 368, 205, 375, 371, 372,
480 161, 208, 204, 178, 185, 174, 201, 183, 188, 198,
481 190, 409, 407, 175, 184, 404, 267, 67, 412, 186,
482 400, 361, 193, 384, 406, 197, 67, 170, 391, 390,
483 411, 307, 331, 304, 309, 125, 124, 71, 132, 191,
484 311, 313, 110, 260, 352, 276, 0, 257, 259, 123,
485 296, 118, 308, 348, 376, 386, 315, 346, 312, 258,
486 215, 394, 360, 349, 358, 213, 359, 353, 356, 269,
487 0, 328, 281, 0, 370, 44, 44, 280, 328, 369,
488 0, 355, 402, 400, 383, 347, 413, 401, 382, 394,
489 158, 283, 426, 328, 328, 357, 280, 0, 44, 214,
490 0, 76, 122, 115, 137, 0, 150, 0, 143, 263,
491 253, 0, 68, 152, 137, 151, 150, 144, 143, 0,
492 0, 0, 0, 0, 327, 365, 268, 144, 35, 35,
493 282, 327, 363, 364, 0, 0, 0, 0, 0, 0,
494 0, 403, 0, 0, 342, 0, 327, 327, 0, 0,
495 0, 35, 78, 0, 75, 77, 0, 0, 0, 338,
496 335, 0, 0, 0, 0, 0, 0, 0, 0, 0,
497 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
498 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
499 0, 0, 0, 0, 0, 0, 0, 423, 0, 420,
500 418, 424, 422, 419, 0, 0, 0, 0, 0, 0,
501 0, 0, 0, 421, 0, 0, 0, 0, 0, 0,
502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
503 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
505 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
506 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
507 0, 0, 0, 0, 0, 0, 0, 0};
508
509const short QXmlStreamReader_Table::action_check [] = {
510 26, 18, 26, 14, 4, 4, 4, 26, 24, 14,
511 4, 26, 4, 4, 4, 4, 22, 55, 26, 26,
512 42, 4, 4, 44, 26, 22, 19, 12, 2, 2,
513 18, 2, 13, 0, 18, 4, 4, 2, 4, 26,
514 26, 20, 18, 4, 4, 4, 26, 11, 26, 26,
515 7, 8, 7, 8, 4, 7, 8, 6, 2, 9,
516 7, 8, 24, 25, 7, 8, 7, 8, 7, 8,
517 6, 36, 7, 8, 7, 8, 6, 26, 34, 35,
518 24, 34, 35, 7, 8, 11, 2, 12, 13, 20,
519 26, 12, 13, 15, 11, 13, 26, 11, 29, 11,
520 26, 19, 7, 8, 26, 11, 26, 27, -1, 26,
521 7, 8, 26, 4, 26, 18, 12, 13, 12, 13,
522 26, 2, 3, 26, 27, 16, 11, 20, -1, 24,
523 25, 26, 6, 7, 8, 28, 29, 21, 22, 6,
524 24, 6, 21, 22, 11, 24, -1, 37, 38, 39,
525 21, 22, -1, 24, -1, 40, 41, 2, 3, 26,
526 -1, 26, 17, 7, 8, 20, 16, -1, 23, -1,
527 15, 26, 27, 54, 24, 25, 26, 17, -1, 17,
528 20, -1, 20, 23, -1, 23, 26, 27, 26, 27,
529 34, 35, 2, 20, 4, 11, -1, -1, -1, 9,
530 45, -1, -1, 30, 31, 32, 33, -1, -1, -1,
531 -1, -1, -1, -1, -1, -1, 32, 33, -1, -1,
532 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
533 -1, 47, 48, 49, 50, 51, 52, 53, -1, -1,
534 -1, -1, -1, -1, -1, -1, -1, 2, 3, -1,
535 -1, -1, -1, -1, -1, 10, -1, 2, -1, 4,
536 15, 6, 7, 8, 9, 10, 11, 12, 13, 14,
537 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
538 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
539 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
540 -1, -1, 2, -1, 4, -1, 6, 7, 8, 9,
541 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
542 20, 21, 22, 23, 24, 25, 26, 27, 2, -1,
543 4, -1, 6, 7, 8, 9, 10, 11, 12, 13,
544 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
545 24, 25, 26, 27, -1, -1, -1, 2, -1, 4,
546 -1, 6, 7, 8, 9, 10, 11, 12, 13, 14,
547 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
548 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
549 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
550 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
551 -1, -1, 2, -1, 4, 5, 6, 7, 8, 9,
552 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
553 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
554 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
555 -1, -1, -1, -1, -1, 45, -1, -1, -1, -1,
556 -1, -1, -1, -1, -1, -1, -1, 2, 3, 4,
557 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
558 -1, 16, 17, 18, 19, 20, 21, 22, 23, 24,
559 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
560 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
561 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
562 -1, -1, 2, -1, 4, 5, 6, 7, 8, 9,
563 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
564 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
565 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
566 -1, -1, -1, -1, -1, 45, -1, -1, -1, -1,
567 -1, -1, -1, -1, -1, -1, -1, 2, -1, 4,
568 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
569 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
570 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
571 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
572 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
573 -1, -1, 2, 3, 4, 5, 6, 7, 8, 9,
574 10, 11, 12, 13, 14, -1, 16, 17, 18, 19,
575 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
576 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
577 -1, -1, -1, -1, -1, 45, -1, -1, -1, -1,
578 -1, -1, -1, -1, -1, -1, -1, 2, -1, 4,
579 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
580 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
581 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
582 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
583 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
584 -1, -1, 2, 3, 4, 5, 6, 7, 8, 9,
585 10, 11, 12, 13, 14, -1, 16, 17, 18, 19,
586 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
587 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
588 -1, -1, -1, -1, -1, 45, -1, -1, -1, -1,
589 -1, -1, -1, -1, -1, -1, -1, 2, -1, 4,
590 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
591 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
592 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
593 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
594 45, -1, -1, -1, -1, -1, -1, -1, -1, -1,
595 -1, -1, 2, 3, 4, 5, 6, 7, 8, 9,
596 10, 11, 12, 13, 14, -1, 16, 17, 18, 19,
597 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
598 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
599 -1, -1, -1, -1, -1, 45, -1, -1, -1, -1,
600 -1, -1, -1, -1, -1, -1, -1, 2, 3, 4,
601 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
602 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
603 25, 26, 27, -1, -1, -1, -1, -1, -1, -1,
604 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
605 45, 46, -1, -1, -1, -1, -1, -1, -1, 54,
606 -1, -1, 2, 3, 4, 5, 6, 7, 8, 9,
607 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
608 20, 21, 22, 23, 24, 25, 26, 27, -1, -1,
609 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
610 -1, -1, -1, -1, -1, 45, 46, -1, -1, -1,
611 -1, -1, -1, -1, 54, -1, -1,
612
613 20, 37, 12, 12, 1, 16, 20, 13, 13, 12,
614 12, 36, 12, 12, 12, 36, 12, 12, 12, 20,
615 12, 12, 49, 12, 37, 12, 72, 20, 13, 37,
616 20, 17, 12, 12, 12, 12, 20, 12, 12, 20,
617 12, 12, 54, 12, 17, 13, 13, 17, 12, 37,
618 12, 12, 68, 13, 20, 20, -1, 72, 17, 17,
619 12, 68, 45, 20, 12, 1, 17, 17, 44, 16,
620 12, 17, 54, 17, 17, 12, 17, 17, 17, 12,
621 -1, 10, 12, -1, 12, 10, 10, 17, 10, 17,
622 -1, 54, 12, 20, 17, 49, 14, 17, 21, 17,
623 38, 12, 4, 10, 10, 54, 17, -1, 10, 54,
624 -1, 10, 68, 68, 6, -1, 8, -1, 10, 72,
625 54, -1, 54, 54, 6, 17, 8, 19, 10, -1,
626 -1, -1, -1, -1, 63, 17, 13, 19, 63, 63,
627 51, 63, 24, 25, -1, -1, -1, -1, -1, -1,
628 -1, 78, -1, -1, 76, -1, 63, 63, -1, -1,
629 -1, 63, 61, -1, 63, 64, -1, -1, -1, 76,
630 76, -1, -1, -1, -1, -1, -1, -1, -1, -1,
631 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
632 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
633 -1, -1, -1, -1, -1, -1, -1, 3, -1, 5,
634 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
635 -1, -1, -1, 19, -1, -1, -1, -1, -1, -1,
636 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
637 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
638 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
639 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
640 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
641 -1, -1, -1, -1, -1, -1, -1, -1};
642
643
644template <typename T> class QXmlStreamSimpleStack {
645 T *data;
646 int tos, cap;
647public:
648 inline QXmlStreamSimpleStack():data(nullptr), tos(-1), cap(0){}
649 inline ~QXmlStreamSimpleStack(){ if (data) free(data); }
650
651 inline void reserve(int extraCapacity) {
652 if (tos + extraCapacity + 1 > cap) {
653 cap = qMax(tos + extraCapacity + 1, cap << 1 );
654 void *ptr = realloc(static_cast<void *>(data), cap * sizeof(T));
655 data = reinterpret_cast<T *>(ptr);
656 Q_CHECK_PTR(data);
657 }
658 }
659
660 inline T &push() { reserve(1); return data[++tos]; }
661 inline T &rawPush() { return data[++tos]; }
662 inline const T &top() const { return data[tos]; }
663 inline T &top() { return data[tos]; }
664 inline T &pop() { return data[tos--]; }
665 inline T &operator[](int index) { return data[index]; }
666 inline const T &at(int index) const { return data[index]; }
667 inline int size() const { return tos + 1; }
668 inline void resize(int s) { tos = s - 1; }
669 inline bool isEmpty() const { return tos < 0; }
670 inline void clear() { tos = -1; }
671};
672
673
674class QXmlStream
675{
676 Q_DECLARE_TR_FUNCTIONS(QXmlStream)
677};
678
679class QXmlStreamPrivateTagStack {
680public:
681 struct NamespaceDeclaration
682 {
683 QStringRef prefix;
684 QStringRef namespaceUri;
685 };
686
687 struct Tag
688 {
689 QStringRef name;
690 QStringRef qualifiedName;
691 NamespaceDeclaration namespaceDeclaration;
692 int tagStackStringStorageSize;
693 int namespaceDeclarationsSize;
694 };
695
696
697 QXmlStreamPrivateTagStack();
698 QXmlStreamSimpleStack<NamespaceDeclaration> namespaceDeclarations;
699 QString tagStackStringStorage;
700 int tagStackStringStorageSize;
701 int initialTagStackStringStorageSize;
702 bool tagsDone;
703
704 inline QStringRef addToStringStorage(const QStringRef &s) {
705 return addToStringStorage(qToStringViewIgnoringNull(s));
706 }
707 inline QStringRef addToStringStorage(const QString &s) {
708 return addToStringStorage(qToStringViewIgnoringNull(s));
709 }
710 QStringRef addToStringStorage(QStringView s)
711 {
712 int pos = tagStackStringStorageSize;
713 int sz = s.size();
714 if (pos != tagStackStringStorage.size())
715 tagStackStringStorage.resize(pos);
716 tagStackStringStorage.append(s.data(), sz);
717 tagStackStringStorageSize += sz;
718 return QStringRef(&tagStackStringStorage, pos, sz);
719 }
720
721 QXmlStreamSimpleStack<Tag> tagStack;
722
723
724 inline Tag &tagStack_pop() {
725 Tag& tag = tagStack.pop();
726 tagStackStringStorageSize = tag.tagStackStringStorageSize;
727 namespaceDeclarations.resize(tag.namespaceDeclarationsSize);
728 tagsDone = tagStack.isEmpty();
729 return tag;
730 }
731 inline Tag &tagStack_push() {
732 Tag &tag = tagStack.push();
733 tag.tagStackStringStorageSize = tagStackStringStorageSize;
734 tag.namespaceDeclarationsSize = namespaceDeclarations.size();
735 return tag;
736 }
737};
738
739
740class QXmlStreamEntityResolver;
741#ifndef QT_NO_XMLSTREAMREADER
742class QXmlStreamReaderPrivate : public QXmlStreamReader_Table, public QXmlStreamPrivateTagStack{
743 QXmlStreamReader *q_ptr;
744 Q_DECLARE_PUBLIC(QXmlStreamReader)
745public:
746 QXmlStreamReaderPrivate(QXmlStreamReader *q);
747 ~QXmlStreamReaderPrivate();
748 void init();
749
750 QByteArray rawReadBuffer;
751 QByteArray dataBuffer;
752 uchar firstByte;
753 qint64 nbytesread;
754 QString readBuffer;
755 int readBufferPos;
756 QXmlStreamSimpleStack<uint> putStack;
757 struct Entity {
758 Entity() = default;
759 Entity(const QString &name, const QString &value)
760 : name(name), value(value), external(false), unparsed(false), literal(false),
761 hasBeenParsed(false), isCurrentlyReferenced(false){}
762 static inline Entity createLiteral(QLatin1String name, QLatin1String value)
763 { Entity result(name, value); result.literal = result.hasBeenParsed = true; return result; }
764 QString name, value;
765 uint external : 1;
766 uint unparsed : 1;
767 uint literal : 1;
768 uint hasBeenParsed : 1;
769 uint isCurrentlyReferenced : 1;
770 };
771 // these hash tables use a QStringView as a key to avoid creating QStrings
772 // just for lookup. The keys are usually views into Entity::name and thus
773 // are guaranteed to have the same lifetime as the referenced data:
774 QHash<QStringView, Entity> entityHash;
775 QHash<QStringView, Entity> parameterEntityHash;
776 QXmlStreamSimpleStack<Entity *>entityReferenceStack;
777 inline bool referenceEntity(Entity &entity) {
778 if (entity.isCurrentlyReferenced) {
779 raiseWellFormedError(QXmlStream::tr("Recursive entity detected."));
780 return false;
781 }
782 entity.isCurrentlyReferenced = true;
783 entityReferenceStack.push() = &entity;
784 injectToken(ENTITY_DONE);
785 return true;
786 }
787
788
789 QIODevice *device;
790 bool deleteDevice;
791#if QT_CONFIG(textcodec)
792 QTextCodec *codec;
793 QTextDecoder *decoder;
794#endif
795 bool atEnd;
796
797 /*!
798 \sa setType()
799 */
800 QXmlStreamReader::TokenType type;
801 QXmlStreamReader::Error error;
802 QString errorString;
803 QString unresolvedEntity;
804
805 qint64 lineNumber, lastLineStart, characterOffset;
806
807
808 void write(const QString &);
809 void write(const char *);
810
811
812 QXmlStreamAttributes attributes;
813 QStringRef namespaceForPrefix(const QStringRef &prefix);
814 void resolveTag();
815 void resolvePublicNamespaces();
816 void resolveDtd();
817 uint resolveCharRef(int symbolIndex);
818 bool checkStartDocument();
819 void startDocument();
820 void parseError();
821 void checkPublicLiteral(const QStringRef &publicId);
822
823 bool scanDtd;
824 QStringRef lastAttributeValue;
825 bool lastAttributeIsCData;
826 struct DtdAttribute {
827 QStringRef tagName;
828 QStringRef attributeQualifiedName;
829 QStringRef attributePrefix;
830 QStringRef attributeName;
831 QStringRef defaultValue;
832 bool isCDATA;
833 bool isNamespaceAttribute;
834 };
835 QXmlStreamSimpleStack<DtdAttribute> dtdAttributes;
836 struct NotationDeclaration {
837 QStringRef name;
838 QStringRef publicId;
839 QStringRef systemId;
840 };
841 QXmlStreamSimpleStack<NotationDeclaration> notationDeclarations;
842 QXmlStreamNotationDeclarations publicNotationDeclarations;
843 QXmlStreamNamespaceDeclarations publicNamespaceDeclarations;
844
845 struct EntityDeclaration {
846 QStringRef name;
847 QStringRef notationName;
848 QStringRef publicId;
849 QStringRef systemId;
850 QStringRef value;
851 bool parameter;
852 bool external;
853 inline void clear() {
854 name.clear();
855 notationName.clear();
856 publicId.clear();
857 systemId.clear();
858 value.clear();
859 parameter = external = false;
860 }
861 };
862 QXmlStreamSimpleStack<EntityDeclaration> entityDeclarations;
863 QXmlStreamEntityDeclarations publicEntityDeclarations;
864
865 QStringRef text;
866
867 QStringRef prefix, namespaceUri, qualifiedName, name;
868 QStringRef processingInstructionTarget, processingInstructionData;
869 QStringRef dtdName, dtdPublicId, dtdSystemId;
870 QStringRef documentVersion, documentEncoding;
871 uint isEmptyElement : 1;
872 uint isWhitespace : 1;
873 uint isCDATA : 1;
874 uint standalone : 1;
875 uint hasCheckedStartDocument : 1;
876 uint normalizeLiterals : 1;
877 uint hasSeenTag : 1;
878 uint inParseEntity : 1;
879 uint referenceToUnparsedEntityDetected : 1;
880 uint referenceToParameterEntityDetected : 1;
881 uint hasExternalDtdSubset : 1;
882 uint lockEncoding : 1;
883 uint namespaceProcessing : 1;
884
885 int resumeReduction;
886 void resume(int rule);
887
888 inline bool entitiesMustBeDeclared() const {
889 return (!inParseEntity
890 && (standalone
891 || (!referenceToUnparsedEntityDetected
892 && !referenceToParameterEntityDetected // Errata 13 as of 2006-04-25
893 && !hasExternalDtdSubset)));
894 }
895
896 // qlalr parser
897 int tos;
898 int stack_size;
899 struct Value {
900 int pos;
901 int len;
902 int prefix;
903 ushort c;
904 };
905
906 Value *sym_stack;
907 int *state_stack;
908 inline void reallocateStack();
909 inline Value &sym(int index) const
910 { return sym_stack[tos + index - 1]; }
911 QString textBuffer;
912 inline void clearTextBuffer() {
913 if (!scanDtd) {
914 textBuffer.resize(0);
915 textBuffer.reserve(256);
916 }
917 }
918 struct Attribute {
919 Value key;
920 Value value;
921 };
922 QXmlStreamSimpleStack<Attribute> attributeStack;
923
924 inline QStringRef symString(int index) {
925 const Value &symbol = sym(index);
926 return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix);
927 }
928 QStringView symView(int index) const
929 {
930 const Value &symbol = sym(index);
931 return QStringView(textBuffer.data() + symbol.pos, symbol.len).mid(symbol.prefix);
932 }
933 inline QStringRef symName(int index) {
934 const Value &symbol = sym(index);
935 return QStringRef(&textBuffer, symbol.pos, symbol.len);
936 }
937 inline QStringRef symString(int index, int offset) {
938 const Value &symbol = sym(index);
939 return QStringRef(&textBuffer, symbol.pos + symbol.prefix + offset, symbol.len - symbol.prefix - offset);
940 }
941 inline QStringRef symPrefix(int index) {
942 const Value &symbol = sym(index);
943 if (symbol.prefix)
944 return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1);
945 return QStringRef();
946 }
947 inline QStringRef symString(const Value &symbol) {
948 return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix);
949 }
950 inline QStringRef symName(const Value &symbol) {
951 return QStringRef(&textBuffer, symbol.pos, symbol.len);
952 }
953 inline QStringRef symPrefix(const Value &symbol) {
954 if (symbol.prefix)
955 return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1);
956 return QStringRef();
957 }
958
959 inline void clearSym() { Value &val = sym(1); val.pos = textBuffer.size(); val.len = 0; }
960
961
962 short token;
963 uint token_char;
964
965 uint filterCarriageReturn();
966 inline uint getChar();
967 inline uint peekChar();
968 inline void putChar(uint c) { putStack.push() = c; }
969 inline void putChar(QChar c) { putStack.push() = c.unicode(); }
970 void putString(const QString &s, int from = 0);
971 void putStringLiteral(const QString &s);
972 void putReplacement(const QString &s);
973 void putReplacementInAttributeValue(const QString &s);
974 uint getChar_helper();
975
976 bool scanUntil(const char *str, short tokenToInject = -1);
977 bool scanString(const char *str, short tokenToInject, bool requireSpace = true);
978 inline void injectToken(ushort tokenToInject) {
979 putChar(int(tokenToInject) << 16);
980 }
981
982 QString resolveUndeclaredEntity(const QString &name);
983 void parseEntity(const QString &value);
984 QXmlStreamReaderPrivate *entityParser;
985
986 bool scanAfterLangleBang();
987 bool scanPublicOrSystem();
988 bool scanNData();
989 bool scanAfterDefaultDecl();
990 bool scanAttType();
991
992
993 // scan optimization functions. Not strictly necessary but LALR is
994 // not very well suited for scanning fast
995 int fastScanLiteralContent();
996 int fastScanSpace();
997 int fastScanContentCharList();
998 int fastScanName(int *prefix = nullptr);
999 inline int fastScanNMTOKEN();
1000
1001
1002 bool parse();
1003 inline void consumeRule(int);
1004
1005 void raiseError(QXmlStreamReader::Error error, const QString& message = QString());
1006 void raiseWellFormedError(const QString &message);
1007
1008 QXmlStreamEntityResolver *entityResolver;
1009
1010private:
1011 /*! \internal
1012 Never assign to variable type directly. Instead use this function.
1013
1014 This prevents errors from being ignored.
1015 */
1016 inline void setType(const QXmlStreamReader::TokenType t)
1017 {
1018 if(type != QXmlStreamReader::Invalid)
1019 type = t;
1020 }
1021};
1022
1023bool QXmlStreamReaderPrivate::parse()
1024{
1025 // cleanup currently reported token
1026
1027 switch (type) {
1028 case QXmlStreamReader::StartElement:
1029 name.clear();
1030 prefix.clear();
1031 qualifiedName.clear();
1032 namespaceUri.clear();
1033 publicNamespaceDeclarations.clear();
1034 attributes.clear();
1035 if (isEmptyElement) {
1036 setType(QXmlStreamReader::EndElement);
1037 Tag &tag = tagStack_pop();
1038 namespaceUri = tag.namespaceDeclaration.namespaceUri;
1039 name = tag.name;
1040 qualifiedName = tag.qualifiedName;
1041 isEmptyElement = false;
1042 return true;
1043 }
1044 clearTextBuffer();
1045 break;
1046 case QXmlStreamReader::EndElement:
1047 name.clear();
1048 prefix.clear();
1049 qualifiedName.clear();
1050 namespaceUri.clear();
1051 clearTextBuffer();
1052 break;
1053 case QXmlStreamReader::DTD:
1054 publicNotationDeclarations.clear();
1055 publicEntityDeclarations.clear();
1056 dtdName.clear();
1057 dtdPublicId.clear();
1058 dtdSystemId.clear();
1059 Q_FALLTHROUGH();
1060 case QXmlStreamReader::Comment:
1061 case QXmlStreamReader::Characters:
1062 isCDATA = false;
1063 isWhitespace = true;
1064 text.clear();
1065 clearTextBuffer();
1066 break;
1067 case QXmlStreamReader::EntityReference:
1068 text.clear();
1069 name.clear();
1070 clearTextBuffer();
1071 break;
1072 case QXmlStreamReader::ProcessingInstruction:
1073 processingInstructionTarget.clear();
1074 processingInstructionData.clear();
1075 clearTextBuffer();
1076 break;
1077 case QXmlStreamReader::NoToken:
1078 case QXmlStreamReader::Invalid:
1079 break;
1080 case QXmlStreamReader::StartDocument:
1081 lockEncoding = true;
1082 documentVersion.clear();
1083 documentEncoding.clear();
1084#if QT_CONFIG(textcodec)
1085 if (decoder && decoder->hasFailure()) {
1086 raiseWellFormedError(QXmlStream::tr("Encountered incorrectly encoded content."));
1087 readBuffer.clear();
1088 return false;
1089 }
1090#endif
1091 Q_FALLTHROUGH();
1092 default:
1093 clearTextBuffer();
1094 ;
1095 }
1096
1097 setType(QXmlStreamReader::NoToken);
1098
1099
1100 // the main parse loop
1101 int act, r;
1102
1103 if (resumeReduction) {
1104 act = state_stack[tos-1];
1105 r = resumeReduction;
1106 resumeReduction = 0;
1107 goto ResumeReduction;
1108 }
1109
1110 act = state_stack[tos];
1111
1112 forever {
1113 if (token == -1 && - TERMINAL_COUNT != action_index[act]) {
1114 uint cu = getChar();
1115 token = NOTOKEN;
1116 token_char = cu == ~0U ? cu : ushort(cu);
1117 if ((cu != ~0U) && (cu & 0xff0000)) {
1118 token = cu >> 16;
1119 } else switch (token_char) {
1120 case 0xfffe:
1121 case 0xffff:
1122 token = ERROR;
1123 break;
1124 case '\r':
1125 token = SPACE;
1126 if (cu == '\r') {
1127 if ((token_char = filterCarriageReturn())) {
1128 ++lineNumber;
1129 lastLineStart = characterOffset + readBufferPos;
1130 break;
1131 }
1132 } else {
1133 break;
1134 }
1135 Q_FALLTHROUGH();
1136 case ~0U: {
1137 token = EOF_SYMBOL;
1138 if (!tagsDone && !inParseEntity) {
1139 int a = t_action(act, token);
1140 if (a < 0) {
1141 raiseError(QXmlStreamReader::PrematureEndOfDocumentError);
1142 return false;
1143 }
1144 }
1145
1146 } break;
1147 case '\n':
1148 ++lineNumber;
1149 lastLineStart = characterOffset + readBufferPos;
1150 Q_FALLTHROUGH();
1151 case ' ':
1152 case '\t':
1153 token = SPACE;
1154 break;
1155 case '&':
1156 token = AMPERSAND;
1157 break;
1158 case '#':
1159 token = HASH;
1160 break;
1161 case '\'':
1162 token = QUOTE;
1163 break;
1164 case '\"':
1165 token = DBLQUOTE;
1166 break;
1167 case '<':
1168 token = LANGLE;
1169 break;
1170 case '>':
1171 token = RANGLE;
1172 break;
1173 case '[':
1174 token = LBRACK;
1175 break;
1176 case ']':
1177 token = RBRACK;
1178 break;
1179 case '(':
1180 token = LPAREN;
1181 break;
1182 case ')':
1183 token = RPAREN;
1184 break;
1185 case '|':
1186 token = PIPE;
1187 break;
1188 case '=':
1189 token = EQ;
1190 break;
1191 case '%':
1192 token = PERCENT;
1193 break;
1194 case '/':
1195 token = SLASH;
1196 break;
1197 case ':':
1198 token = COLON;
1199 break;
1200 case ';':
1201 token = SEMICOLON;
1202 break;
1203 case ',':
1204 token = COMMA;
1205 break;
1206 case '-':
1207 token = DASH;
1208 break;
1209 case '+':
1210 token = PLUS;
1211 break;
1212 case '*':
1213 token = STAR;
1214 break;
1215 case '.':
1216 token = DOT;
1217 break;
1218 case '?':
1219 token = QUESTIONMARK;
1220 break;
1221 case '!':
1222 token = BANG;
1223 break;
1224 case '0':
1225 case '1':
1226 case '2':
1227 case '3':
1228 case '4':
1229 case '5':
1230 case '6':
1231 case '7':
1232 case '8':
1233 case '9':
1234 token = DIGIT;
1235 break;
1236 default:
1237 if (cu < 0x20)
1238 token = NOTOKEN;
1239 else
1240 token = LETTER;
1241 break;
1242 }
1243 }
1244
1245 act = t_action (act, token);
1246 if (act == ACCEPT_STATE) {
1247 // reset the parser in case someone resumes (process instructions can follow a valid document)
1248 tos = 0;
1249 state_stack[tos++] = 0;
1250 state_stack[tos] = 0;
1251 return true;
1252 } else if (act > 0) {
1253 if (++tos >= stack_size-1)
1254 reallocateStack();
1255
1256 Value &val = sym_stack[tos];
1257 val.c = token_char;
1258 val.pos = textBuffer.size();
1259 val.prefix = 0;
1260 val.len = 1;
1261 if (token_char)
1262 textBuffer += QChar(token_char);
1263
1264 state_stack[tos] = act;
1265 token = -1;
1266
1267
1268 } else if (act < 0) {
1269 r = - act - 1;
1270
1271#if defined (QLALR_DEBUG)
1272 int ridx = rule_index[r];
1273 printf ("%3d) %s ::=", r + 1, spell[rule_info[ridx]]);
1274 ++ridx;
1275 for (int i = ridx; i < ridx + rhs[r]; ++i) {
1276 int symbol = rule_info[i];
1277 if (const char *name = spell[symbol])
1278 printf (" %s", name);
1279 else
1280 printf (" #%d", symbol);
1281 }
1282 printf ("\n");
1283#endif
1284
1285 tos -= rhs[r];
1286 act = state_stack[tos++];
1287 ResumeReduction:
1288 switch (r) {
1289
1290 case 0:
1291 setType(QXmlStreamReader::EndDocument);
1292 break;
1293
1294 case 1:
1295 if (type != QXmlStreamReader::Invalid) {
1296 if (hasSeenTag || inParseEntity) {
1297 setType(QXmlStreamReader::EndDocument);
1298 } else {
1299 raiseError(QXmlStreamReader::NotWellFormedError, QXmlStream::tr("Start tag expected."));
1300 // reset the parser
1301 tos = 0;
1302 state_stack[tos++] = 0;
1303 state_stack[tos] = 0;
1304 return false;
1305 }
1306 }
1307 break;
1308
1309 case 10:
1310 entityReferenceStack.pop()->isCurrentlyReferenced = false;
1311 clearSym();
1312 break;
1313
1314 case 11:
1315 if (!scanString(spell[VERSION], VERSION, false) && atEnd) {
1316 resume(11);
1317 return false;
1318 }
1319 break;
1320
1321 case 12:
1322 setType(QXmlStreamReader::StartDocument);
1323 documentVersion = symString(6);
1324 startDocument();
1325 break;
1326
1327 case 13:
1328 hasExternalDtdSubset = true;
1329 dtdSystemId = symString(2);
1330 break;
1331
1332 case 14:
1333 checkPublicLiteral(symString(2));
1334 dtdPublicId = symString(2);
1335 dtdSystemId = symString(4);
1336 hasExternalDtdSubset = true;
1337 break;
1338
1339 case 16:
1340 if (!scanPublicOrSystem() && atEnd) {
1341 resume(16);
1342 return false;
1343 }
1344 dtdName = symString(3);
1345 break;
1346
1347 case 17:
1348 case 18:
1349 dtdName = symString(3);
1350 Q_FALLTHROUGH();
1351
1352 case 19:
1353 case 20:
1354 setType(QXmlStreamReader::DTD);
1355 text = &textBuffer;
1356 break;
1357
1358 case 21:
1359 scanDtd = true;
1360 break;
1361
1362 case 22:
1363 scanDtd = false;
1364 break;
1365
1366 case 37:
1367 if (!scanString(spell[EMPTY], EMPTY, false)
1368 && !scanString(spell[ANY], ANY, false)
1369 && atEnd) {
1370 resume(37);
1371 return false;
1372 }
1373 break;
1374
1375 case 43:
1376 if (!scanString(spell[PCDATA], PCDATA, false) && atEnd) {
1377 resume(43);
1378 return false;
1379 }
1380 break;
1381
1382 case 68: {
1383 lastAttributeIsCData = true;
1384 } break;
1385
1386 case 78:
1387 if (!scanAfterDefaultDecl() && atEnd) {
1388 resume(78);
1389 return false;
1390 }
1391 break;
1392
1393 case 83:
1394 sym(1) = sym(2);
1395 lastAttributeValue.clear();
1396 lastAttributeIsCData = false;
1397 if (!scanAttType() && atEnd) {
1398 resume(83);
1399 return false;
1400 }
1401 break;
1402
1403 case 84: {
1404 DtdAttribute &dtdAttribute = dtdAttributes.push();
1405 dtdAttribute.tagName.clear();
1406 dtdAttribute.isCDATA = lastAttributeIsCData;
1407 dtdAttribute.attributePrefix = addToStringStorage(symPrefix(1));
1408 dtdAttribute.attributeName = addToStringStorage(symString(1));
1409 dtdAttribute.attributeQualifiedName = addToStringStorage(symName(1));
1410 dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == QLatin1String("xmlns")
1411 || (dtdAttribute.attributePrefix.isEmpty()
1412 && dtdAttribute.attributeName == QLatin1String("xmlns")));
1413 if (lastAttributeValue.isNull()) {
1414 dtdAttribute.defaultValue.clear();
1415 } else {
1416 if (dtdAttribute.isCDATA)
1417 dtdAttribute.defaultValue = addToStringStorage(lastAttributeValue);
1418 else
1419 dtdAttribute.defaultValue = addToStringStorage(lastAttributeValue.toString().simplified());
1420
1421 }
1422 } break;
1423
1424 case 88: {
1425 if (referenceToUnparsedEntityDetected && !standalone)
1426 break;
1427 int n = dtdAttributes.size();
1428 QStringRef tagName = addToStringStorage(symName(3));
1429 while (n--) {
1430 DtdAttribute &dtdAttribute = dtdAttributes[n];
1431 if (!dtdAttribute.tagName.isNull())
1432 break;
1433 dtdAttribute.tagName = tagName;
1434 for (int i = 0; i < n; ++i) {
1435 if ((dtdAttributes[i].tagName.isNull() || dtdAttributes[i].tagName == tagName)
1436 && dtdAttributes[i].attributeQualifiedName == dtdAttribute.attributeQualifiedName) {
1437 dtdAttribute.attributeQualifiedName.clear(); // redefined, delete it
1438 break;
1439 }
1440 }
1441 }
1442 } break;
1443
1444 case 89: {
1445 if (!scanPublicOrSystem() && atEnd) {
1446 resume(89);
1447 return false;
1448 }
1449 EntityDeclaration &entityDeclaration = entityDeclarations.push();
1450 entityDeclaration.clear();
1451 entityDeclaration.name = symString(3);
1452 } break;
1453
1454 case 90: {
1455 if (!scanPublicOrSystem() && atEnd) {
1456 resume(90);
1457 return false;
1458 }
1459 EntityDeclaration &entityDeclaration = entityDeclarations.push();
1460 entityDeclaration.clear();
1461 entityDeclaration.name = symString(5);
1462 entityDeclaration.parameter = true;
1463 } break;
1464
1465 case 91: {
1466 if (!scanNData() && atEnd) {
1467 resume(91);
1468 return false;
1469 }
1470 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1471 entityDeclaration.systemId = symString(3);
1472 entityDeclaration.external = true;
1473 } break;
1474
1475 case 92: {
1476 if (!scanNData() && atEnd) {
1477 resume(92);
1478 return false;
1479 }
1480 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1481 checkPublicLiteral((entityDeclaration.publicId = symString(3)));
1482 entityDeclaration.systemId = symString(5);
1483 entityDeclaration.external = true;
1484 } break;
1485
1486 case 93: {
1487 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1488 entityDeclaration.notationName = symString(3);
1489 if (entityDeclaration.parameter)
1490 raiseWellFormedError(QXmlStream::tr("NDATA in parameter entity declaration."));
1491 }
1492 Q_FALLTHROUGH();
1493
1494 case 94:
1495 case 95: {
1496 if (referenceToUnparsedEntityDetected && !standalone) {
1497 entityDeclarations.pop();
1498 break;
1499 }
1500 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1501 if (!entityDeclaration.external)
1502 entityDeclaration.value = symString(2);
1503 auto &hash = entityDeclaration.parameter ? parameterEntityHash : entityHash;
1504 if (!hash.contains(qToStringViewIgnoringNull(entityDeclaration.name))) {
1505 Entity entity(entityDeclaration.name.toString(),
1506 entityDeclaration.value.toString());
1507 entity.unparsed = (!entityDeclaration.notationName.isNull());
1508 entity.external = entityDeclaration.external;
1509 hash.insert(qToStringViewIgnoringNull(entity.name), entity);
1510 }
1511 } break;
1512
1513 case 96: {
1514 setType(QXmlStreamReader::ProcessingInstruction);
1515 int pos = sym(4).pos + sym(4).len;
1516 processingInstructionTarget = symString(3);
1517 if (scanUntil("?>")) {
1518 processingInstructionData = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 2);
1519 if (!processingInstructionTarget.compare(QLatin1String("xml"), Qt::CaseInsensitive)) {
1520 raiseWellFormedError(QXmlStream::tr("XML declaration not at start of document."));
1521 }
1522 else if (!QXmlUtils::isNCName(processingInstructionTarget))
1523 raiseWellFormedError(QXmlStream::tr("%1 is an invalid processing instruction name.")
1524 .arg(processingInstructionTarget));
1525 } else if (type != QXmlStreamReader::Invalid){
1526 resume(96);
1527 return false;
1528 }
1529 } break;
1530
1531 case 97:
1532 setType(QXmlStreamReader::ProcessingInstruction);
1533 processingInstructionTarget = symString(3);
1534 if (!processingInstructionTarget.compare(QLatin1String("xml"), Qt::CaseInsensitive))
1535 raiseWellFormedError(QXmlStream::tr("Invalid processing instruction name."));
1536 break;
1537
1538 case 98:
1539 if (!scanAfterLangleBang() && atEnd) {
1540 resume(98);
1541 return false;
1542 }
1543 break;
1544
1545 case 99:
1546 if (!scanUntil("--")) {
1547 resume(99);
1548 return false;
1549 }
1550 break;
1551
1552 case 100: {
1553 setType(QXmlStreamReader::Comment);
1554 int pos = sym(1).pos + 4;
1555 text = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
1556 } break;
1557
1558 case 101: {
1559 setType(QXmlStreamReader::Characters);
1560 isCDATA = true;
1561 isWhitespace = false;
1562 int pos = sym(2).pos;
1563 if (scanUntil("]]>", -1)) {
1564 text = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
1565 } else {
1566 resume(101);
1567 return false;
1568 }
1569 } break;
1570
1571 case 102: {
1572 if (!scanPublicOrSystem() && atEnd) {
1573 resume(102);
1574 return false;
1575 }
1576 NotationDeclaration &notationDeclaration = notationDeclarations.push();
1577 notationDeclaration.name = symString(3);
1578 } break;
1579
1580 case 103: {
1581 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1582 notationDeclaration.systemId = symString(3);
1583 notationDeclaration.publicId.clear();
1584 } break;
1585
1586 case 104: {
1587 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1588 notationDeclaration.systemId.clear();
1589 checkPublicLiteral((notationDeclaration.publicId = symString(3)));
1590 } break;
1591
1592 case 105: {
1593 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1594 checkPublicLiteral((notationDeclaration.publicId = symString(3)));
1595 notationDeclaration.systemId = symString(5);
1596 } break;
1597
1598 case 129:
1599 isWhitespace = false;
1600 Q_FALLTHROUGH();
1601
1602 case 130:
1603 sym(1).len += fastScanContentCharList();
1604 if (atEnd && !inParseEntity) {
1605 resume(130);
1606 return false;
1607 }
1608 break;
1609
1610 case 139:
1611 if (!textBuffer.isEmpty()) {
1612 setType(QXmlStreamReader::Characters);
1613 text = &textBuffer;
1614 }
1615 break;
1616
1617 case 140:
1618 case 141:
1619 clearSym();
1620 break;
1621
1622 case 142:
1623 case 143:
1624 sym(1) = sym(2);
1625 break;
1626
1627 case 144:
1628 case 145:
1629 case 146:
1630 case 147:
1631 sym(1).len += sym(2).len;
1632 break;
1633
1634 case 173:
1635 if (normalizeLiterals)
1636 textBuffer.data()[textBuffer.size()-1] = QLatin1Char(' ');
1637 break;
1638
1639 case 174:
1640 sym(1).len += fastScanLiteralContent();
1641 if (atEnd) {
1642 resume(174);
1643 return false;
1644 }
1645 break;
1646
1647 case 175: {
1648 if (!QXmlUtils::isPublicID(symString(1))) {
1649 raiseWellFormedError(QXmlStream::tr("%1 is an invalid PUBLIC identifier.").arg(symString(1)));
1650 resume(175);
1651 return false;
1652 }
1653 } break;
1654
1655 case 176:
1656 case 177:
1657 clearSym();
1658 break;
1659
1660 case 178:
1661 case 179:
1662 sym(1) = sym(2);
1663 break;
1664
1665 case 180:
1666 case 181:
1667 case 182:
1668 case 183:
1669 sym(1).len += sym(2).len;
1670 break;
1671
1672 case 213:
1673 case 214:
1674 clearSym();
1675 break;
1676
1677 case 215:
1678 case 216:
1679 sym(1) = sym(2);
1680 lastAttributeValue = symString(1);
1681 break;
1682
1683 case 217:
1684 case 218:
1685 case 219:
1686 case 220:
1687 sym(1).len += sym(2).len;
1688 break;
1689
1690 case 229: {
1691 QStringRef prefix = symPrefix(1);
1692 if (prefix.isEmpty() && symString(1) == QLatin1String("xmlns") && namespaceProcessing) {
1693 NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
1694 namespaceDeclaration.prefix.clear();
1695
1696 const QStringRef ns(symString(5));
1697 if(ns == QLatin1String("http://www.w3.org/2000/xmlns/") ||
1698 ns == QLatin1String("http://www.w3.org/XML/1998/namespace"))
1699 raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
1700 else
1701 namespaceDeclaration.namespaceUri = addToStringStorage(ns);
1702 } else {
1703 Attribute &attribute = attributeStack.push();
1704 attribute.key = sym(1);
1705 attribute.value = sym(5);
1706
1707 QStringRef attributeQualifiedName = symName(1);
1708 bool normalize = false;
1709 for (int a = 0; a < dtdAttributes.size(); ++a) {
1710 DtdAttribute &dtdAttribute = dtdAttributes[a];
1711 if (!dtdAttribute.isCDATA
1712 && dtdAttribute.tagName == qualifiedName
1713 && dtdAttribute.attributeQualifiedName == attributeQualifiedName
1714 ) {
1715 normalize = true;
1716 break;
1717 }
1718 }
1719 if (normalize) {
1720 // normalize attribute value (simplify and trim)
1721 int pos = textBuffer.size();
1722 int n = 0;
1723 bool wasSpace = true;
1724 for (int i = 0; i < attribute.value.len; ++i) {
1725 QChar c = textBuffer.at(attribute.value.pos + i);
1726 if (c.unicode() == ' ') {
1727 if (wasSpace)
1728 continue;
1729 wasSpace = true;
1730 } else {
1731 wasSpace = false;
1732 }
1733 textBuffer += textBuffer.at(attribute.value.pos + i);
1734 ++n;
1735 }
1736 if (wasSpace)
1737 while (n && textBuffer.at(pos + n - 1).unicode() == ' ')
1738 --n;
1739 attribute.value.pos = pos;
1740 attribute.value.len = n;
1741 }
1742 if (prefix == QLatin1String("xmlns") && namespaceProcessing) {
1743 NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
1744 QStringRef namespacePrefix = symString(attribute.key);
1745 QStringRef namespaceUri = symString(attribute.value);
1746 attributeStack.pop();
1747 if (((namespacePrefix == QLatin1String("xml"))
1748 ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace")))
1749 || namespaceUri == QLatin1String("http://www.w3.org/2000/xmlns/")
1750 || namespaceUri.isEmpty()
1751 || namespacePrefix == QLatin1String("xmlns"))
1752 raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
1753
1754 namespaceDeclaration.prefix = addToStringStorage(namespacePrefix);
1755 namespaceDeclaration.namespaceUri = addToStringStorage(namespaceUri);
1756 }
1757 }
1758 } break;
1759
1760 case 235: {
1761 normalizeLiterals = true;
1762 Tag &tag = tagStack_push();
1763 prefix = tag.namespaceDeclaration.prefix = addToStringStorage(symPrefix(2));
1764 name = tag.name = addToStringStorage(symString(2));
1765 qualifiedName = tag.qualifiedName = addToStringStorage(symName(2));
1766 if ((!prefix.isEmpty() && !QXmlUtils::isNCName(prefix)) || !QXmlUtils::isNCName(name))
1767 raiseWellFormedError(QXmlStream::tr("Invalid XML name."));
1768 } break;
1769
1770 case 236:
1771 isEmptyElement = true;
1772 Q_FALLTHROUGH();
1773
1774 case 237:
1775 setType(QXmlStreamReader::StartElement);
1776 resolveTag();
1777 if (tagStack.size() == 1 && hasSeenTag && !inParseEntity)
1778 raiseWellFormedError(QXmlStream::tr("Extra content at end of document."));
1779 hasSeenTag = true;
1780 break;
1781
1782 case 238: {
1783 setType(QXmlStreamReader::EndElement);
1784 Tag &tag = tagStack_pop();
1785
1786 namespaceUri = tag.namespaceDeclaration.namespaceUri;
1787 name = tag.name;
1788 qualifiedName = tag.qualifiedName;
1789 if (qualifiedName != symName(3))
1790 raiseWellFormedError(QXmlStream::tr("Opening and ending tag mismatch."));
1791 } break;
1792
1793 case 239:
1794 if (entitiesMustBeDeclared()) {
1795 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(unresolvedEntity));
1796 break;
1797 }
1798 setType(QXmlStreamReader::EntityReference);
1799 name = &unresolvedEntity;
1800 break;
1801
1802 case 240: {
1803 sym(1).len += sym(2).len + 1;
1804 QStringView reference = symView(2);
1805 if (entityHash.contains(reference)) {
1806 Entity &entity = entityHash[reference];
1807 if (entity.unparsed) {
1808 raiseWellFormedError(QXmlStream::tr("Reference to unparsed entity '%1'.").arg(reference));
1809 } else {
1810 if (!entity.hasBeenParsed) {
1811 parseEntity(entity.value);
1812 entity.hasBeenParsed = true;
1813 }
1814 if (entity.literal)
1815 putStringLiteral(entity.value);
1816 else if (referenceEntity(entity))
1817 putReplacement(entity.value);
1818 textBuffer.chop(2 + sym(2).len);
1819 clearSym();
1820 }
1821 break;
1822 }
1823
1824 if (entityResolver) {
1825 QString replacementText = resolveUndeclaredEntity(reference.toString());
1826 if (!replacementText.isNull()) {
1827 putReplacement(replacementText);
1828 textBuffer.chop(2 + sym(2).len);
1829 clearSym();
1830 break;
1831 }
1832 }
1833
1834 injectToken(UNRESOLVED_ENTITY);
1835 unresolvedEntity = symString(2).toString();
1836 textBuffer.chop(2 + sym(2).len);
1837 clearSym();
1838
1839 } break;
1840
1841 case 241: {
1842 sym(1).len += sym(2).len + 1;
1843 QStringView reference = symView(2);
1844 if (parameterEntityHash.contains(reference)) {
1845 referenceToParameterEntityDetected = true;
1846 Entity &entity = parameterEntityHash[reference];
1847 if (entity.unparsed || entity.external) {
1848 referenceToUnparsedEntityDetected = true;
1849 } else {
1850 if (referenceEntity(entity))
1851 putString(entity.value);
1852 textBuffer.chop(2 + sym(2).len);
1853 clearSym();
1854 }
1855 } else if (entitiesMustBeDeclared()) {
1856 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(symString(2)));
1857 }
1858 } break;
1859
1860 case 242:
1861 sym(1).len += sym(2).len + 1;
1862 break;
1863
1864 case 243: {
1865 sym(1).len += sym(2).len + 1;
1866 QStringView reference = symView(2);
1867 if (entityHash.contains(reference)) {
1868 Entity &entity = entityHash[reference];
1869 if (entity.unparsed || entity.value.isNull()) {
1870 raiseWellFormedError(QXmlStream::tr("Reference to external entity '%1' in attribute value.").arg(reference));
1871 break;
1872 }
1873 if (!entity.hasBeenParsed) {
1874 parseEntity(entity.value);
1875 entity.hasBeenParsed = true;
1876 }
1877 if (entity.literal)
1878 putStringLiteral(entity.value);
1879 else if (referenceEntity(entity))
1880 putReplacementInAttributeValue(entity.value);
1881 textBuffer.chop(2 + sym(2).len);
1882 clearSym();
1883 break;
1884 }
1885
1886 if (entityResolver) {
1887 QString replacementText = resolveUndeclaredEntity(reference.toString());
1888 if (!replacementText.isNull()) {
1889 putReplacement(replacementText);
1890 textBuffer.chop(2 + sym(2).len);
1891 clearSym();
1892 break;
1893 }
1894 }
1895 if (entitiesMustBeDeclared()) {
1896 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(reference));
1897 }
1898 } break;
1899
1900 case 244: {
1901 if (uint s = resolveCharRef(3)) {
1902 if (s >= 0xffff)
1903 putStringLiteral(QString::fromUcs4(&s, 1));
1904 else
1905 putChar((LETTER << 16) | s);
1906
1907 textBuffer.chop(3 + sym(3).len);
1908 clearSym();
1909 } else {
1910 raiseWellFormedError(QXmlStream::tr("Invalid character reference."));
1911 }
1912 } break;
1913
1914 case 247:
1915 case 248:
1916 sym(1).len += sym(2).len;
1917 break;
1918
1919 case 259:
1920 sym(1).len += fastScanSpace();
1921 if (atEnd) {
1922 resume(259);
1923 return false;
1924 }
1925 break;
1926
1927 case 262: {
1928 sym(1).len += fastScanName(&sym(1).prefix);
1929 if (atEnd) {
1930 resume(262);
1931 return false;
1932 }
1933 } break;
1934
1935 case 263:
1936 sym(1).len += fastScanName();
1937 if (atEnd) {
1938 resume(263);
1939 return false;
1940 }
1941 break;
1942
1943 case 264:
1944 case 265:
1945 case 266:
1946 case 267:
1947 case 268:
1948 sym(1).len += fastScanNMTOKEN();
1949 if (atEnd) {
1950 resume(268);
1951 return false;
1952 }
1953
1954 break;
1955
1956 default:
1957 ;
1958 } // switch
1959 act = state_stack[tos] = nt_action (act, lhs[r] - TERMINAL_COUNT);
1960 if (type != QXmlStreamReader::NoToken)
1961 return true;
1962 } else {
1963 parseError();
1964 break;
1965 }
1966 }
1967 return false;
1968}
1969#endif //QT_NO_XMLSTREAMREADER.xml
1970
1971
1972#endif // QXMLSTREAM_P_H
1973
1974