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(a: tos + extraCapacity + 1, b: cap << 1 );
654 void *ptr = realloc(ptr: static_cast<void *>(data), size: cap * sizeof(T));
655 data = reinterpret_cast<T *>(ptr);
656 Q_CHECK_PTR(data);
657 }
658 }
659
660 inline T &push() { reserve(extraCapacity: 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(s: qToStringViewIgnoringNull(s));
706 }
707 inline QStringRef addToStringStorage(const QString &s) {
708 return addToStringStorage(s: 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(size: pos);
716 tagStackStringStorage.append(uc: s.data(), len: 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(s: 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 int entityExpansionLimit = 4096;
778 int entityLength = 0;
779 inline bool referenceEntity(Entity &entity) {
780 if (entity.isCurrentlyReferenced) {
781 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Self-referencing entity detected."));
782 return false;
783 }
784 // entityLength represents the amount of additional characters the
785 // entity expands into (can be negative for e.g. &amp;). It's used to
786 // avoid DoS attacks through recursive entity expansions
787 entityLength += entity.value.size() - entity.name.size() - 2;
788 if (entityLength > entityExpansionLimit) {
789 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Entity expands to more characters than the entity expansion limit."));
790 return false;
791 }
792 entity.isCurrentlyReferenced = true;
793 entityReferenceStack.push() = &entity;
794 injectToken(tokenToInject: ENTITY_DONE);
795 return true;
796 }
797
798
799 QIODevice *device;
800 bool deleteDevice;
801#if QT_CONFIG(textcodec)
802 QTextCodec *codec;
803 QTextDecoder *decoder;
804#endif
805 bool atEnd;
806
807 /*!
808 \sa setType()
809 */
810 QXmlStreamReader::TokenType type;
811 QXmlStreamReader::Error error;
812 QString errorString;
813 QString unresolvedEntity;
814
815 qint64 lineNumber, lastLineStart, characterOffset;
816
817
818 void write(const QString &);
819 void write(const char *);
820
821
822 QXmlStreamAttributes attributes;
823 QStringRef namespaceForPrefix(const QStringRef &prefix);
824 void resolveTag();
825 void resolvePublicNamespaces();
826 void resolveDtd();
827 uint resolveCharRef(int symbolIndex);
828 bool checkStartDocument();
829 void startDocument();
830 void parseError();
831 void checkPublicLiteral(const QStringRef &publicId);
832
833 bool scanDtd;
834 QStringRef lastAttributeValue;
835 bool lastAttributeIsCData;
836 struct DtdAttribute {
837 QStringRef tagName;
838 QStringRef attributeQualifiedName;
839 QStringRef attributePrefix;
840 QStringRef attributeName;
841 QStringRef defaultValue;
842 bool isCDATA;
843 bool isNamespaceAttribute;
844 };
845 QXmlStreamSimpleStack<DtdAttribute> dtdAttributes;
846 struct NotationDeclaration {
847 QStringRef name;
848 QStringRef publicId;
849 QStringRef systemId;
850 };
851 QXmlStreamSimpleStack<NotationDeclaration> notationDeclarations;
852 QXmlStreamNotationDeclarations publicNotationDeclarations;
853 QXmlStreamNamespaceDeclarations publicNamespaceDeclarations;
854
855 struct EntityDeclaration {
856 QStringRef name;
857 QStringRef notationName;
858 QStringRef publicId;
859 QStringRef systemId;
860 QStringRef value;
861 bool parameter;
862 bool external;
863 inline void clear() {
864 name.clear();
865 notationName.clear();
866 publicId.clear();
867 systemId.clear();
868 value.clear();
869 parameter = external = false;
870 }
871 };
872 QXmlStreamSimpleStack<EntityDeclaration> entityDeclarations;
873 QXmlStreamEntityDeclarations publicEntityDeclarations;
874
875 QStringRef text;
876
877 QStringRef prefix, namespaceUri, qualifiedName, name;
878 QStringRef processingInstructionTarget, processingInstructionData;
879 QStringRef dtdName, dtdPublicId, dtdSystemId;
880 QStringRef documentVersion, documentEncoding;
881 uint isEmptyElement : 1;
882 uint isWhitespace : 1;
883 uint isCDATA : 1;
884 uint standalone : 1;
885 uint hasCheckedStartDocument : 1;
886 uint normalizeLiterals : 1;
887 uint hasSeenTag : 1;
888 uint inParseEntity : 1;
889 uint referenceToUnparsedEntityDetected : 1;
890 uint referenceToParameterEntityDetected : 1;
891 uint hasExternalDtdSubset : 1;
892 uint lockEncoding : 1;
893 uint namespaceProcessing : 1;
894
895 int resumeReduction;
896 void resume(int rule);
897
898 inline bool entitiesMustBeDeclared() const {
899 return (!inParseEntity
900 && (standalone
901 || (!referenceToUnparsedEntityDetected
902 && !referenceToParameterEntityDetected // Errata 13 as of 2006-04-25
903 && !hasExternalDtdSubset)));
904 }
905
906 // qlalr parser
907 int tos;
908 int stack_size;
909 struct Value {
910 int pos;
911 int len;
912 int prefix;
913 ushort c;
914 };
915
916 Value *sym_stack;
917 int *state_stack;
918 inline void reallocateStack();
919 inline Value &sym(int index) const
920 { return sym_stack[tos + index - 1]; }
921 QString textBuffer;
922 inline void clearTextBuffer() {
923 if (!scanDtd) {
924 textBuffer.resize(size: 0);
925 textBuffer.reserve(asize: 256);
926 }
927 }
928 struct Attribute {
929 Value key;
930 Value value;
931 };
932 QXmlStreamSimpleStack<Attribute> attributeStack;
933
934 inline QStringRef symString(int index) {
935 const Value &symbol = sym(index);
936 return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix);
937 }
938 QStringView symView(int index) const
939 {
940 const Value &symbol = sym(index);
941 return QStringView(textBuffer.data() + symbol.pos, symbol.len).mid(pos: symbol.prefix);
942 }
943 inline QStringRef symName(int index) {
944 const Value &symbol = sym(index);
945 return QStringRef(&textBuffer, symbol.pos, symbol.len);
946 }
947 inline QStringRef symString(int index, int offset) {
948 const Value &symbol = sym(index);
949 return QStringRef(&textBuffer, symbol.pos + symbol.prefix + offset, symbol.len - symbol.prefix - offset);
950 }
951 inline QStringRef symPrefix(int index) {
952 const Value &symbol = sym(index);
953 if (symbol.prefix)
954 return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1);
955 return QStringRef();
956 }
957 inline QStringRef symString(const Value &symbol) {
958 return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix);
959 }
960 inline QStringRef symName(const Value &symbol) {
961 return QStringRef(&textBuffer, symbol.pos, symbol.len);
962 }
963 inline QStringRef symPrefix(const Value &symbol) {
964 if (symbol.prefix)
965 return QStringRef(&textBuffer, symbol.pos, symbol.prefix - 1);
966 return QStringRef();
967 }
968
969 inline void clearSym() { Value &val = sym(index: 1); val.pos = textBuffer.size(); val.len = 0; }
970
971
972 short token;
973 uint token_char;
974
975 uint filterCarriageReturn();
976 inline uint getChar();
977 inline uint peekChar();
978 inline void putChar(uint c) { putStack.push() = c; }
979 inline void putChar(QChar c) { putStack.push() = c.unicode(); }
980 void putString(const QString &s, int from = 0);
981 void putStringLiteral(const QString &s);
982 void putReplacement(const QString &s);
983 void putReplacementInAttributeValue(const QString &s);
984 uint getChar_helper();
985
986 bool scanUntil(const char *str, short tokenToInject = -1);
987 bool scanString(const char *str, short tokenToInject, bool requireSpace = true);
988 inline void injectToken(ushort tokenToInject) {
989 putChar(c: int(tokenToInject) << 16);
990 }
991
992 QString resolveUndeclaredEntity(const QString &name);
993 void parseEntity(const QString &value);
994 std::unique_ptr<QXmlStreamReaderPrivate> entityParser;
995
996 bool scanAfterLangleBang();
997 bool scanPublicOrSystem();
998 bool scanNData();
999 bool scanAfterDefaultDecl();
1000 bool scanAttType();
1001
1002
1003 // scan optimization functions. Not strictly necessary but LALR is
1004 // not very well suited for scanning fast
1005 int fastScanLiteralContent();
1006 int fastScanSpace();
1007 int fastScanContentCharList();
1008 int fastScanName(int *prefix = nullptr);
1009 inline int fastScanNMTOKEN();
1010
1011
1012 bool parse();
1013 inline void consumeRule(int);
1014
1015 void raiseError(QXmlStreamReader::Error error, const QString& message = QString());
1016 void raiseWellFormedError(const QString &message);
1017
1018 QXmlStreamEntityResolver *entityResolver;
1019
1020private:
1021 /*! \internal
1022 Never assign to variable type directly. Instead use this function.
1023
1024 This prevents errors from being ignored.
1025 */
1026 inline void setType(const QXmlStreamReader::TokenType t)
1027 {
1028 if(type != QXmlStreamReader::Invalid)
1029 type = t;
1030 }
1031};
1032
1033bool QXmlStreamReaderPrivate::parse()
1034{
1035 // cleanup currently reported token
1036
1037 switch (type) {
1038 case QXmlStreamReader::StartElement:
1039 name.clear();
1040 prefix.clear();
1041 qualifiedName.clear();
1042 namespaceUri.clear();
1043 publicNamespaceDeclarations.clear();
1044 attributes.clear();
1045 if (isEmptyElement) {
1046 setType(QXmlStreamReader::EndElement);
1047 Tag &tag = tagStack_pop();
1048 namespaceUri = tag.namespaceDeclaration.namespaceUri;
1049 name = tag.name;
1050 qualifiedName = tag.qualifiedName;
1051 isEmptyElement = false;
1052 return true;
1053 }
1054 clearTextBuffer();
1055 break;
1056 case QXmlStreamReader::EndElement:
1057 name.clear();
1058 prefix.clear();
1059 qualifiedName.clear();
1060 namespaceUri.clear();
1061 clearTextBuffer();
1062 break;
1063 case QXmlStreamReader::DTD:
1064 publicNotationDeclarations.clear();
1065 publicEntityDeclarations.clear();
1066 dtdName.clear();
1067 dtdPublicId.clear();
1068 dtdSystemId.clear();
1069 Q_FALLTHROUGH();
1070 case QXmlStreamReader::Comment:
1071 case QXmlStreamReader::Characters:
1072 isCDATA = false;
1073 isWhitespace = true;
1074 text.clear();
1075 clearTextBuffer();
1076 break;
1077 case QXmlStreamReader::EntityReference:
1078 text.clear();
1079 name.clear();
1080 clearTextBuffer();
1081 break;
1082 case QXmlStreamReader::ProcessingInstruction:
1083 processingInstructionTarget.clear();
1084 processingInstructionData.clear();
1085 clearTextBuffer();
1086 break;
1087 case QXmlStreamReader::NoToken:
1088 case QXmlStreamReader::Invalid:
1089 break;
1090 case QXmlStreamReader::StartDocument:
1091 lockEncoding = true;
1092 documentVersion.clear();
1093 documentEncoding.clear();
1094#if QT_CONFIG(textcodec)
1095 if (decoder && decoder->hasFailure()) {
1096 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Encountered incorrectly encoded content."));
1097 readBuffer.clear();
1098 return false;
1099 }
1100#endif
1101 Q_FALLTHROUGH();
1102 default:
1103 clearTextBuffer();
1104 ;
1105 }
1106
1107 setType(QXmlStreamReader::NoToken);
1108
1109
1110 // the main parse loop
1111 int act, r;
1112
1113 if (resumeReduction) {
1114 act = state_stack[tos-1];
1115 r = resumeReduction;
1116 resumeReduction = 0;
1117 goto ResumeReduction;
1118 }
1119
1120 act = state_stack[tos];
1121
1122 forever {
1123 if (token == -1 && - TERMINAL_COUNT != action_index[act]) {
1124 uint cu = getChar();
1125 token = NOTOKEN;
1126 token_char = cu == ~0U ? cu : ushort(cu);
1127 if ((cu != ~0U) && (cu & 0xff0000)) {
1128 token = cu >> 16;
1129 } else switch (token_char) {
1130 case 0xfffe:
1131 case 0xffff:
1132 token = ERROR;
1133 break;
1134 case '\r':
1135 token = SPACE;
1136 if (cu == '\r') {
1137 if ((token_char = filterCarriageReturn())) {
1138 ++lineNumber;
1139 lastLineStart = characterOffset + readBufferPos;
1140 break;
1141 }
1142 } else {
1143 break;
1144 }
1145 Q_FALLTHROUGH();
1146 case ~0U: {
1147 token = EOF_SYMBOL;
1148 if (!tagsDone && !inParseEntity) {
1149 int a = t_action(state: act, token);
1150 if (a < 0) {
1151 raiseError(error: QXmlStreamReader::PrematureEndOfDocumentError);
1152 return false;
1153 }
1154 }
1155
1156 } break;
1157 case '\n':
1158 ++lineNumber;
1159 lastLineStart = characterOffset + readBufferPos;
1160 Q_FALLTHROUGH();
1161 case ' ':
1162 case '\t':
1163 token = SPACE;
1164 break;
1165 case '&':
1166 token = AMPERSAND;
1167 break;
1168 case '#':
1169 token = HASH;
1170 break;
1171 case '\'':
1172 token = QUOTE;
1173 break;
1174 case '\"':
1175 token = DBLQUOTE;
1176 break;
1177 case '<':
1178 token = LANGLE;
1179 break;
1180 case '>':
1181 token = RANGLE;
1182 break;
1183 case '[':
1184 token = LBRACK;
1185 break;
1186 case ']':
1187 token = RBRACK;
1188 break;
1189 case '(':
1190 token = LPAREN;
1191 break;
1192 case ')':
1193 token = RPAREN;
1194 break;
1195 case '|':
1196 token = PIPE;
1197 break;
1198 case '=':
1199 token = EQ;
1200 break;
1201 case '%':
1202 token = PERCENT;
1203 break;
1204 case '/':
1205 token = SLASH;
1206 break;
1207 case ':':
1208 token = COLON;
1209 break;
1210 case ';':
1211 token = SEMICOLON;
1212 break;
1213 case ',':
1214 token = COMMA;
1215 break;
1216 case '-':
1217 token = DASH;
1218 break;
1219 case '+':
1220 token = PLUS;
1221 break;
1222 case '*':
1223 token = STAR;
1224 break;
1225 case '.':
1226 token = DOT;
1227 break;
1228 case '?':
1229 token = QUESTIONMARK;
1230 break;
1231 case '!':
1232 token = BANG;
1233 break;
1234 case '0':
1235 case '1':
1236 case '2':
1237 case '3':
1238 case '4':
1239 case '5':
1240 case '6':
1241 case '7':
1242 case '8':
1243 case '9':
1244 token = DIGIT;
1245 break;
1246 default:
1247 if (cu < 0x20)
1248 token = NOTOKEN;
1249 else
1250 token = LETTER;
1251 break;
1252 }
1253 }
1254
1255 act = t_action (state: act, token);
1256 if (act == ACCEPT_STATE) {
1257 // reset the parser in case someone resumes (process instructions can follow a valid document)
1258 tos = 0;
1259 state_stack[tos++] = 0;
1260 state_stack[tos] = 0;
1261 return true;
1262 } else if (act > 0) {
1263 if (++tos >= stack_size-1)
1264 reallocateStack();
1265
1266 Value &val = sym_stack[tos];
1267 val.c = token_char;
1268 val.pos = textBuffer.size();
1269 val.prefix = 0;
1270 val.len = 1;
1271 if (token_char)
1272 textBuffer += QChar(token_char);
1273
1274 state_stack[tos] = act;
1275 token = -1;
1276
1277
1278 } else if (act < 0) {
1279 r = - act - 1;
1280
1281#if defined (QLALR_DEBUG)
1282 int ridx = rule_index[r];
1283 printf ("%3d) %s ::=", r + 1, spell[rule_info[ridx]]);
1284 ++ridx;
1285 for (int i = ridx; i < ridx + rhs[r]; ++i) {
1286 int symbol = rule_info[i];
1287 if (const char *name = spell[symbol])
1288 printf (" %s", name);
1289 else
1290 printf (" #%d", symbol);
1291 }
1292 printf ("\n");
1293#endif
1294
1295 tos -= rhs[r];
1296 act = state_stack[tos++];
1297 ResumeReduction:
1298 switch (r) {
1299
1300 case 0:
1301 setType(QXmlStreamReader::EndDocument);
1302 break;
1303
1304 case 1:
1305 if (type != QXmlStreamReader::Invalid) {
1306 if (hasSeenTag || inParseEntity) {
1307 setType(QXmlStreamReader::EndDocument);
1308 } else {
1309 raiseError(error: QXmlStreamReader::NotWellFormedError, message: QXmlStream::tr(sourceText: "Start tag expected."));
1310 // reset the parser
1311 tos = 0;
1312 state_stack[tos++] = 0;
1313 state_stack[tos] = 0;
1314 return false;
1315 }
1316 }
1317 break;
1318
1319 case 10:
1320 entityReferenceStack.pop()->isCurrentlyReferenced = false;
1321 if (entityReferenceStack.isEmpty())
1322 entityLength = 0;
1323 clearSym();
1324 break;
1325
1326 case 11:
1327 if (!scanString(str: spell[VERSION], tokenToInject: VERSION, requireSpace: false) && atEnd) {
1328 resume(rule: 11);
1329 return false;
1330 }
1331 break;
1332
1333 case 12:
1334 setType(QXmlStreamReader::StartDocument);
1335 documentVersion = symString(index: 6);
1336 startDocument();
1337 break;
1338
1339 case 13:
1340 hasExternalDtdSubset = true;
1341 dtdSystemId = symString(index: 2);
1342 break;
1343
1344 case 14:
1345 checkPublicLiteral(publicId: symString(index: 2));
1346 dtdPublicId = symString(index: 2);
1347 dtdSystemId = symString(index: 4);
1348 hasExternalDtdSubset = true;
1349 break;
1350
1351 case 16:
1352 if (!scanPublicOrSystem() && atEnd) {
1353 resume(rule: 16);
1354 return false;
1355 }
1356 dtdName = symString(index: 3);
1357 break;
1358
1359 case 17:
1360 case 18:
1361 dtdName = symString(index: 3);
1362 Q_FALLTHROUGH();
1363
1364 case 19:
1365 case 20:
1366 setType(QXmlStreamReader::DTD);
1367 text = &textBuffer;
1368 break;
1369
1370 case 21:
1371 scanDtd = true;
1372 break;
1373
1374 case 22:
1375 scanDtd = false;
1376 break;
1377
1378 case 37:
1379 if (!scanString(str: spell[EMPTY], tokenToInject: EMPTY, requireSpace: false)
1380 && !scanString(str: spell[ANY], tokenToInject: ANY, requireSpace: false)
1381 && atEnd) {
1382 resume(rule: 37);
1383 return false;
1384 }
1385 break;
1386
1387 case 43:
1388 if (!scanString(str: spell[PCDATA], tokenToInject: PCDATA, requireSpace: false) && atEnd) {
1389 resume(rule: 43);
1390 return false;
1391 }
1392 break;
1393
1394 case 68: {
1395 lastAttributeIsCData = true;
1396 } break;
1397
1398 case 78:
1399 if (!scanAfterDefaultDecl() && atEnd) {
1400 resume(rule: 78);
1401 return false;
1402 }
1403 break;
1404
1405 case 83:
1406 sym(index: 1) = sym(index: 2);
1407 lastAttributeValue.clear();
1408 lastAttributeIsCData = false;
1409 if (!scanAttType() && atEnd) {
1410 resume(rule: 83);
1411 return false;
1412 }
1413 break;
1414
1415 case 84: {
1416 DtdAttribute &dtdAttribute = dtdAttributes.push();
1417 dtdAttribute.tagName.clear();
1418 dtdAttribute.isCDATA = lastAttributeIsCData;
1419 dtdAttribute.attributePrefix = addToStringStorage(s: symPrefix(index: 1));
1420 dtdAttribute.attributeName = addToStringStorage(s: symString(index: 1));
1421 dtdAttribute.attributeQualifiedName = addToStringStorage(s: symName(index: 1));
1422 dtdAttribute.isNamespaceAttribute = (dtdAttribute.attributePrefix == QLatin1String("xmlns")
1423 || (dtdAttribute.attributePrefix.isEmpty()
1424 && dtdAttribute.attributeName == QLatin1String("xmlns")));
1425 if (lastAttributeValue.isNull()) {
1426 dtdAttribute.defaultValue.clear();
1427 } else {
1428 if (dtdAttribute.isCDATA)
1429 dtdAttribute.defaultValue = addToStringStorage(s: lastAttributeValue);
1430 else
1431 dtdAttribute.defaultValue = addToStringStorage(s: lastAttributeValue.toString().simplified());
1432
1433 }
1434 } break;
1435
1436 case 88: {
1437 if (referenceToUnparsedEntityDetected && !standalone)
1438 break;
1439 int n = dtdAttributes.size();
1440 QStringRef tagName = addToStringStorage(s: symName(index: 3));
1441 while (n--) {
1442 DtdAttribute &dtdAttribute = dtdAttributes[n];
1443 if (!dtdAttribute.tagName.isNull())
1444 break;
1445 dtdAttribute.tagName = tagName;
1446 for (int i = 0; i < n; ++i) {
1447 if ((dtdAttributes[i].tagName.isNull() || dtdAttributes[i].tagName == tagName)
1448 && dtdAttributes[i].attributeQualifiedName == dtdAttribute.attributeQualifiedName) {
1449 dtdAttribute.attributeQualifiedName.clear(); // redefined, delete it
1450 break;
1451 }
1452 }
1453 }
1454 } break;
1455
1456 case 89: {
1457 if (!scanPublicOrSystem() && atEnd) {
1458 resume(rule: 89);
1459 return false;
1460 }
1461 EntityDeclaration &entityDeclaration = entityDeclarations.push();
1462 entityDeclaration.clear();
1463 entityDeclaration.name = symString(index: 3);
1464 } break;
1465
1466 case 90: {
1467 if (!scanPublicOrSystem() && atEnd) {
1468 resume(rule: 90);
1469 return false;
1470 }
1471 EntityDeclaration &entityDeclaration = entityDeclarations.push();
1472 entityDeclaration.clear();
1473 entityDeclaration.name = symString(index: 5);
1474 entityDeclaration.parameter = true;
1475 } break;
1476
1477 case 91: {
1478 if (!scanNData() && atEnd) {
1479 resume(rule: 91);
1480 return false;
1481 }
1482 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1483 entityDeclaration.systemId = symString(index: 3);
1484 entityDeclaration.external = true;
1485 } break;
1486
1487 case 92: {
1488 if (!scanNData() && atEnd) {
1489 resume(rule: 92);
1490 return false;
1491 }
1492 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1493 checkPublicLiteral(publicId: (entityDeclaration.publicId = symString(index: 3)));
1494 entityDeclaration.systemId = symString(index: 5);
1495 entityDeclaration.external = true;
1496 } break;
1497
1498 case 93: {
1499 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1500 entityDeclaration.notationName = symString(index: 3);
1501 if (entityDeclaration.parameter)
1502 raiseWellFormedError(message: QXmlStream::tr(sourceText: "NDATA in parameter entity declaration."));
1503 }
1504 Q_FALLTHROUGH();
1505
1506 case 94:
1507 case 95: {
1508 if (referenceToUnparsedEntityDetected && !standalone) {
1509 entityDeclarations.pop();
1510 break;
1511 }
1512 EntityDeclaration &entityDeclaration = entityDeclarations.top();
1513 if (!entityDeclaration.external)
1514 entityDeclaration.value = symString(index: 2);
1515 auto &hash = entityDeclaration.parameter ? parameterEntityHash : entityHash;
1516 if (!hash.contains(akey: qToStringViewIgnoringNull(s: entityDeclaration.name))) {
1517 Entity entity(entityDeclaration.name.toString(),
1518 entityDeclaration.value.toString());
1519 entity.unparsed = (!entityDeclaration.notationName.isNull());
1520 entity.external = entityDeclaration.external;
1521 hash.insert(akey: qToStringViewIgnoringNull(s: entity.name), avalue: entity);
1522 }
1523 } break;
1524
1525 case 96: {
1526 setType(QXmlStreamReader::ProcessingInstruction);
1527 int pos = sym(index: 4).pos + sym(index: 4).len;
1528 processingInstructionTarget = symString(index: 3);
1529 if (scanUntil(str: "?>")) {
1530 processingInstructionData = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 2);
1531 if (!processingInstructionTarget.compare(s: QLatin1String("xml"), cs: Qt::CaseInsensitive)) {
1532 raiseWellFormedError(message: QXmlStream::tr(sourceText: "XML declaration not at start of document."));
1533 }
1534 else if (!QXmlUtils::isNCName(ncName: processingInstructionTarget))
1535 raiseWellFormedError(message: QXmlStream::tr(sourceText: "%1 is an invalid processing instruction name.")
1536 .arg(a: processingInstructionTarget));
1537 } else if (type != QXmlStreamReader::Invalid){
1538 resume(rule: 96);
1539 return false;
1540 }
1541 } break;
1542
1543 case 97:
1544 setType(QXmlStreamReader::ProcessingInstruction);
1545 processingInstructionTarget = symString(index: 3);
1546 if (!processingInstructionTarget.compare(s: QLatin1String("xml"), cs: Qt::CaseInsensitive))
1547 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Invalid processing instruction name."));
1548 break;
1549
1550 case 98:
1551 if (!scanAfterLangleBang() && atEnd) {
1552 resume(rule: 98);
1553 return false;
1554 }
1555 break;
1556
1557 case 99:
1558 if (!scanUntil(str: "--")) {
1559 resume(rule: 99);
1560 return false;
1561 }
1562 break;
1563
1564 case 100: {
1565 setType(QXmlStreamReader::Comment);
1566 int pos = sym(index: 1).pos + 4;
1567 text = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
1568 } break;
1569
1570 case 101: {
1571 setType(QXmlStreamReader::Characters);
1572 isCDATA = true;
1573 isWhitespace = false;
1574 int pos = sym(index: 2).pos;
1575 if (scanUntil(str: "]]>", tokenToInject: -1)) {
1576 text = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
1577 } else {
1578 resume(rule: 101);
1579 return false;
1580 }
1581 } break;
1582
1583 case 102: {
1584 if (!scanPublicOrSystem() && atEnd) {
1585 resume(rule: 102);
1586 return false;
1587 }
1588 NotationDeclaration &notationDeclaration = notationDeclarations.push();
1589 notationDeclaration.name = symString(index: 3);
1590 } break;
1591
1592 case 103: {
1593 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1594 notationDeclaration.systemId = symString(index: 3);
1595 notationDeclaration.publicId.clear();
1596 } break;
1597
1598 case 104: {
1599 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1600 notationDeclaration.systemId.clear();
1601 checkPublicLiteral(publicId: (notationDeclaration.publicId = symString(index: 3)));
1602 } break;
1603
1604 case 105: {
1605 NotationDeclaration &notationDeclaration = notationDeclarations.top();
1606 checkPublicLiteral(publicId: (notationDeclaration.publicId = symString(index: 3)));
1607 notationDeclaration.systemId = symString(index: 5);
1608 } break;
1609
1610 case 129:
1611 isWhitespace = false;
1612 Q_FALLTHROUGH();
1613
1614 case 130:
1615 sym(index: 1).len += fastScanContentCharList();
1616 if (atEnd && !inParseEntity) {
1617 resume(rule: 130);
1618 return false;
1619 }
1620 break;
1621
1622 case 139:
1623 if (!textBuffer.isEmpty()) {
1624 setType(QXmlStreamReader::Characters);
1625 text = &textBuffer;
1626 }
1627 break;
1628
1629 case 140:
1630 case 141:
1631 clearSym();
1632 break;
1633
1634 case 142:
1635 case 143:
1636 sym(index: 1) = sym(index: 2);
1637 break;
1638
1639 case 144:
1640 case 145:
1641 case 146:
1642 case 147:
1643 sym(index: 1).len += sym(index: 2).len;
1644 break;
1645
1646 case 173:
1647 if (normalizeLiterals)
1648 textBuffer.data()[textBuffer.size()-1] = QLatin1Char(' ');
1649 break;
1650
1651 case 174:
1652 sym(index: 1).len += fastScanLiteralContent();
1653 if (atEnd) {
1654 resume(rule: 174);
1655 return false;
1656 }
1657 break;
1658
1659 case 175: {
1660 if (!QXmlUtils::isPublicID(candidate: symString(index: 1))) {
1661 raiseWellFormedError(message: QXmlStream::tr(sourceText: "%1 is an invalid PUBLIC identifier.").arg(a: symString(index: 1)));
1662 resume(rule: 175);
1663 return false;
1664 }
1665 } break;
1666
1667 case 176:
1668 case 177:
1669 clearSym();
1670 break;
1671
1672 case 178:
1673 case 179:
1674 sym(index: 1) = sym(index: 2);
1675 break;
1676
1677 case 180:
1678 case 181:
1679 case 182:
1680 case 183:
1681 sym(index: 1).len += sym(index: 2).len;
1682 break;
1683
1684 case 213:
1685 case 214:
1686 clearSym();
1687 break;
1688
1689 case 215:
1690 case 216:
1691 sym(index: 1) = sym(index: 2);
1692 lastAttributeValue = symString(index: 1);
1693 break;
1694
1695 case 217:
1696 case 218:
1697 case 219:
1698 case 220:
1699 sym(index: 1).len += sym(index: 2).len;
1700 break;
1701
1702 case 229: {
1703 QStringRef prefix = symPrefix(index: 1);
1704 if (prefix.isEmpty() && symString(index: 1) == QLatin1String("xmlns") && namespaceProcessing) {
1705 NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
1706 namespaceDeclaration.prefix.clear();
1707
1708 const QStringRef ns(symString(index: 5));
1709 if(ns == QLatin1String("http://www.w3.org/2000/xmlns/") ||
1710 ns == QLatin1String("http://www.w3.org/XML/1998/namespace"))
1711 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Illegal namespace declaration."));
1712 else
1713 namespaceDeclaration.namespaceUri = addToStringStorage(s: ns);
1714 } else {
1715 Attribute &attribute = attributeStack.push();
1716 attribute.key = sym(index: 1);
1717 attribute.value = sym(index: 5);
1718
1719 QStringRef attributeQualifiedName = symName(index: 1);
1720 bool normalize = false;
1721 for (int a = 0; a < dtdAttributes.size(); ++a) {
1722 DtdAttribute &dtdAttribute = dtdAttributes[a];
1723 if (!dtdAttribute.isCDATA
1724 && dtdAttribute.tagName == qualifiedName
1725 && dtdAttribute.attributeQualifiedName == attributeQualifiedName
1726 ) {
1727 normalize = true;
1728 break;
1729 }
1730 }
1731 if (normalize) {
1732 // normalize attribute value (simplify and trim)
1733 int pos = textBuffer.size();
1734 int n = 0;
1735 bool wasSpace = true;
1736 for (int i = 0; i < attribute.value.len; ++i) {
1737 QChar c = textBuffer.at(i: attribute.value.pos + i);
1738 if (c.unicode() == ' ') {
1739 if (wasSpace)
1740 continue;
1741 wasSpace = true;
1742 } else {
1743 wasSpace = false;
1744 }
1745 textBuffer += textBuffer.at(i: attribute.value.pos + i);
1746 ++n;
1747 }
1748 if (wasSpace)
1749 while (n && textBuffer.at(i: pos + n - 1).unicode() == ' ')
1750 --n;
1751 attribute.value.pos = pos;
1752 attribute.value.len = n;
1753 }
1754 if (prefix == QLatin1String("xmlns") && namespaceProcessing) {
1755 NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
1756 QStringRef namespacePrefix = symString(symbol: attribute.key);
1757 QStringRef namespaceUri = symString(symbol: attribute.value);
1758 attributeStack.pop();
1759 if (((namespacePrefix == QLatin1String("xml"))
1760 ^ (namespaceUri == QLatin1String("http://www.w3.org/XML/1998/namespace")))
1761 || namespaceUri == QLatin1String("http://www.w3.org/2000/xmlns/")
1762 || namespaceUri.isEmpty()
1763 || namespacePrefix == QLatin1String("xmlns"))
1764 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Illegal namespace declaration."));
1765
1766 namespaceDeclaration.prefix = addToStringStorage(s: namespacePrefix);
1767 namespaceDeclaration.namespaceUri = addToStringStorage(s: namespaceUri);
1768 }
1769 }
1770 } break;
1771
1772 case 235: {
1773 normalizeLiterals = true;
1774 Tag &tag = tagStack_push();
1775 prefix = tag.namespaceDeclaration.prefix = addToStringStorage(s: symPrefix(index: 2));
1776 name = tag.name = addToStringStorage(s: symString(index: 2));
1777 qualifiedName = tag.qualifiedName = addToStringStorage(s: symName(index: 2));
1778 if ((!prefix.isEmpty() && !QXmlUtils::isNCName(ncName: prefix)) || !QXmlUtils::isNCName(ncName: name))
1779 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Invalid XML name."));
1780 } break;
1781
1782 case 236:
1783 isEmptyElement = true;
1784 Q_FALLTHROUGH();
1785
1786 case 237:
1787 setType(QXmlStreamReader::StartElement);
1788 resolveTag();
1789 if (tagStack.size() == 1 && hasSeenTag && !inParseEntity)
1790 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Extra content at end of document."));
1791 hasSeenTag = true;
1792 break;
1793
1794 case 238: {
1795 setType(QXmlStreamReader::EndElement);
1796 Tag &tag = tagStack_pop();
1797
1798 namespaceUri = tag.namespaceDeclaration.namespaceUri;
1799 name = tag.name;
1800 qualifiedName = tag.qualifiedName;
1801 if (qualifiedName != symName(index: 3))
1802 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Opening and ending tag mismatch."));
1803 } break;
1804
1805 case 239:
1806 if (entitiesMustBeDeclared()) {
1807 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Entity '%1' not declared.").arg(a: unresolvedEntity));
1808 break;
1809 }
1810 setType(QXmlStreamReader::EntityReference);
1811 name = &unresolvedEntity;
1812 break;
1813
1814 case 240: {
1815 sym(index: 1).len += sym(index: 2).len + 1;
1816 QStringView reference = symView(index: 2);
1817 if (entityHash.contains(akey: reference)) {
1818 Entity &entity = entityHash[reference];
1819 if (entity.unparsed) {
1820 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Reference to unparsed entity '%1'.").arg(a: reference));
1821 } else {
1822 if (!entity.hasBeenParsed) {
1823 parseEntity(value: entity.value);
1824 entity.hasBeenParsed = true;
1825 }
1826 if (entity.literal)
1827 putStringLiteral(s: entity.value);
1828 else if (referenceEntity(entity))
1829 putReplacement(s: entity.value);
1830 textBuffer.chop(n: 2 + sym(index: 2).len);
1831 clearSym();
1832 }
1833 break;
1834 }
1835
1836 if (entityResolver) {
1837 QString replacementText = resolveUndeclaredEntity(name: reference.toString());
1838 if (!replacementText.isNull()) {
1839 putReplacement(s: replacementText);
1840 textBuffer.chop(n: 2 + sym(index: 2).len);
1841 clearSym();
1842 break;
1843 }
1844 }
1845
1846 injectToken(tokenToInject: UNRESOLVED_ENTITY);
1847 unresolvedEntity = symString(index: 2).toString();
1848 textBuffer.chop(n: 2 + sym(index: 2).len);
1849 clearSym();
1850
1851 } break;
1852
1853 case 241: {
1854 sym(index: 1).len += sym(index: 2).len + 1;
1855 QStringView reference = symView(index: 2);
1856 if (parameterEntityHash.contains(akey: reference)) {
1857 referenceToParameterEntityDetected = true;
1858 Entity &entity = parameterEntityHash[reference];
1859 if (entity.unparsed || entity.external) {
1860 referenceToUnparsedEntityDetected = true;
1861 } else {
1862 if (referenceEntity(entity))
1863 putString(s: entity.value);
1864 textBuffer.chop(n: 2 + sym(index: 2).len);
1865 clearSym();
1866 }
1867 } else if (entitiesMustBeDeclared()) {
1868 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Entity '%1' not declared.").arg(a: symString(index: 2)));
1869 }
1870 } break;
1871
1872 case 242:
1873 sym(index: 1).len += sym(index: 2).len + 1;
1874 break;
1875
1876 case 243: {
1877 sym(index: 1).len += sym(index: 2).len + 1;
1878 QStringView reference = symView(index: 2);
1879 if (entityHash.contains(akey: reference)) {
1880 Entity &entity = entityHash[reference];
1881 if (entity.unparsed || entity.value.isNull()) {
1882 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Reference to external entity '%1' in attribute value.").arg(a: reference));
1883 break;
1884 }
1885 if (!entity.hasBeenParsed) {
1886 parseEntity(value: entity.value);
1887 entity.hasBeenParsed = true;
1888 }
1889 if (entity.literal)
1890 putStringLiteral(s: entity.value);
1891 else if (referenceEntity(entity))
1892 putReplacementInAttributeValue(s: entity.value);
1893 textBuffer.chop(n: 2 + sym(index: 2).len);
1894 clearSym();
1895 break;
1896 }
1897
1898 if (entityResolver) {
1899 QString replacementText = resolveUndeclaredEntity(name: reference.toString());
1900 if (!replacementText.isNull()) {
1901 putReplacement(s: replacementText);
1902 textBuffer.chop(n: 2 + sym(index: 2).len);
1903 clearSym();
1904 break;
1905 }
1906 }
1907 if (entitiesMustBeDeclared()) {
1908 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Entity '%1' not declared.").arg(a: reference));
1909 }
1910 } break;
1911
1912 case 244: {
1913 if (uint s = resolveCharRef(symbolIndex: 3)) {
1914 if (s >= 0xffff)
1915 putStringLiteral(s: QString::fromUcs4(&s, size: 1));
1916 else
1917 putChar(c: (LETTER << 16) | s);
1918
1919 textBuffer.chop(n: 3 + sym(index: 3).len);
1920 clearSym();
1921 } else {
1922 raiseWellFormedError(message: QXmlStream::tr(sourceText: "Invalid character reference."));
1923 }
1924 } break;
1925
1926 case 247:
1927 case 248:
1928 sym(index: 1).len += sym(index: 2).len;
1929 break;
1930
1931 case 259:
1932 sym(index: 1).len += fastScanSpace();
1933 if (atEnd) {
1934 resume(rule: 259);
1935 return false;
1936 }
1937 break;
1938
1939 case 262: {
1940 sym(index: 1).len += fastScanName(prefix: &sym(index: 1).prefix);
1941 if (atEnd) {
1942 resume(rule: 262);
1943 return false;
1944 }
1945 } break;
1946
1947 case 263:
1948 sym(index: 1).len += fastScanName();
1949 if (atEnd) {
1950 resume(rule: 263);
1951 return false;
1952 }
1953 break;
1954
1955 case 264:
1956 case 265:
1957 case 266:
1958 case 267:
1959 case 268:
1960 sym(index: 1).len += fastScanNMTOKEN();
1961 if (atEnd) {
1962 resume(rule: 268);
1963 return false;
1964 }
1965
1966 break;
1967
1968 default:
1969 ;
1970 } // switch
1971 act = state_stack[tos] = nt_action (state: act, nt: lhs[r] - TERMINAL_COUNT);
1972 if (type != QXmlStreamReader::NoToken)
1973 return true;
1974 } else {
1975 parseError();
1976 break;
1977 }
1978 }
1979 return false;
1980}
1981#endif //QT_NO_XMLSTREAMREADER.xml
1982
1983
1984#endif // QXMLSTREAM_P_H
1985
1986

source code of qtbase/src/corelib/serialization/qxmlstream_p.h