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 
61 class QXmlStreamReader_Table
62 {
63 public:
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 
nt_action(int state,int nt)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 
t_action(int state,int token)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 
164 const 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 
172 const 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 
201 const 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 
230 const 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 
275 const 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 
286 const 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 
375 const 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 
509 const 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 
644 template <typename T> class QXmlStreamSimpleStack {
645     T *data;
646     int tos, cap;
647 public:
QXmlStreamSimpleStack()648     inline QXmlStreamSimpleStack():data(nullptr), tos(-1), cap(0){}
~QXmlStreamSimpleStack()649     inline ~QXmlStreamSimpleStack(){ if (data) free(data); }
650 
reserve(int extraCapacity)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 
push()660     inline T &push() { reserve(1); return data[++tos]; }
rawPush()661     inline T &rawPush() { return data[++tos]; }
top()662     inline const T &top() const { return data[tos]; }
top()663     inline T &top() { return data[tos]; }
pop()664     inline T &pop() { return data[tos--]; }
665     inline T &operator[](int index) { return data[index]; }
at(int index)666     inline const T &at(int index) const { return data[index]; }
size()667     inline int size() const { return tos + 1; }
resize(int s)668     inline void resize(int s) { tos = s - 1; }
isEmpty()669     inline bool isEmpty() const { return tos < 0; }
clear()670     inline void clear() { tos = -1; }
671 };
672 
673 
674 class QXmlStream
675 {
676     Q_DECLARE_TR_FUNCTIONS(QXmlStream)
677 };
678 
679 class QXmlStreamPrivateTagStack {
680 public:
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 
addToStringStorage(const QStringRef & s)704     inline QStringRef addToStringStorage(const QStringRef &s) {
705         return addToStringStorage(qToStringViewIgnoringNull(s));
706     }
addToStringStorage(const QString & s)707     inline QStringRef addToStringStorage(const QString &s) {
708         return addToStringStorage(qToStringViewIgnoringNull(s));
709     }
addToStringStorage(QStringView s)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 
tagStack_pop()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     }
tagStack_push()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 
740 class QXmlStreamEntityResolver;
741 #ifndef QT_NO_XMLSTREAMREADER
742 class QXmlStreamReaderPrivate : public QXmlStreamReader_Table, public QXmlStreamPrivateTagStack{
743     QXmlStreamReader *q_ptr;
744     Q_DECLARE_PUBLIC(QXmlStreamReader)
745 public:
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;
EntityEntity759         Entity(const QString &name, const QString &value)
760           :  name(name), value(value), external(false), unparsed(false), literal(false),
761              hasBeenParsed(false), isCurrentlyReferenced(false){}
createLiteralEntity762         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;
referenceEntity(Entity & entity)779     inline bool referenceEntity(Entity &entity) {
780         if (entity.isCurrentlyReferenced) {
781             raiseWellFormedError(QXmlStream::tr("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(QXmlStream::tr("Entity expands to more characters than the entity expansion limit."));
790             return false;
791         }
792         entity.isCurrentlyReferenced = true;
793         entityReferenceStack.push() = &entity;
794         injectToken(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;
clearEntityDeclaration863         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 
entitiesMustBeDeclared()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();
sym(int index)919     inline Value &sym(int index) const
920     { return sym_stack[tos + index - 1]; }
921     QString textBuffer;
clearTextBuffer()922     inline void clearTextBuffer() {
923         if (!scanDtd) {
924             textBuffer.resize(0);
925             textBuffer.reserve(256);
926         }
927     }
928     struct Attribute {
929         Value key;
930         Value value;
931     };
932     QXmlStreamSimpleStack<Attribute> attributeStack;
933 
symString(int index)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     }
symView(int index)938     QStringView symView(int index) const
939     {
940         const Value &symbol = sym(index);
941         return QStringView(textBuffer.data() + symbol.pos, symbol.len).mid(symbol.prefix);
942     }
symName(int index)943     inline QStringRef symName(int index) {
944         const Value &symbol = sym(index);
945         return QStringRef(&textBuffer, symbol.pos, symbol.len);
946     }
symString(int index,int offset)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     }
symPrefix(int index)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     }
symString(const Value & symbol)957     inline QStringRef symString(const Value &symbol) {
958         return QStringRef(&textBuffer, symbol.pos + symbol.prefix, symbol.len - symbol.prefix);
959     }
symName(const Value & symbol)960     inline QStringRef symName(const Value &symbol) {
961         return QStringRef(&textBuffer, symbol.pos, symbol.len);
962     }
symPrefix(const Value & symbol)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 
clearSym()969     inline void clearSym() { Value &val = sym(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();
putChar(uint c)978     inline void putChar(uint c) { putStack.push() = c; }
putChar(QChar 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);
injectToken(ushort tokenToInject)988     inline void injectToken(ushort tokenToInject) {
989         putChar(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 
1020 private:
1021     /*! \internal
1022        Never assign to variable type directly. Instead use this function.
1023 
1024        This prevents errors from being ignored.
1025      */
setType(const QXmlStreamReader::TokenType t)1026     inline void setType(const QXmlStreamReader::TokenType t)
1027     {
1028         if(type != QXmlStreamReader::Invalid)
1029             type = t;
1030     }
1031 };
1032 
parse()1033 bool 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(QXmlStream::tr("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(act, token);
1150                     if (a < 0) {
1151                         raiseError(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 (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(QXmlStreamReader::NotWellFormedError, QXmlStream::tr("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(spell[VERSION], VERSION, false) && atEnd) {
1328                 resume(11);
1329                 return false;
1330             }
1331         break;
1332 
1333         case 12:
1334             setType(QXmlStreamReader::StartDocument);
1335             documentVersion = symString(6);
1336             startDocument();
1337         break;
1338 
1339         case 13:
1340             hasExternalDtdSubset = true;
1341             dtdSystemId = symString(2);
1342         break;
1343 
1344         case 14:
1345             checkPublicLiteral(symString(2));
1346             dtdPublicId = symString(2);
1347             dtdSystemId = symString(4);
1348             hasExternalDtdSubset = true;
1349         break;
1350 
1351         case 16:
1352             if (!scanPublicOrSystem() && atEnd) {
1353                 resume(16);
1354                 return false;
1355             }
1356             dtdName = symString(3);
1357         break;
1358 
1359         case 17:
1360         case 18:
1361             dtdName = symString(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(spell[EMPTY], EMPTY, false)
1380                 && !scanString(spell[ANY], ANY, false)
1381                 && atEnd) {
1382                 resume(37);
1383                 return false;
1384             }
1385         break;
1386 
1387         case 43:
1388             if (!scanString(spell[PCDATA], PCDATA, false) && atEnd) {
1389                 resume(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(78);
1401                 return false;
1402             }
1403         break;
1404 
1405         case 83:
1406                 sym(1) = sym(2);
1407                 lastAttributeValue.clear();
1408                 lastAttributeIsCData = false;
1409                 if (!scanAttType() && atEnd) {
1410                     resume(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(symPrefix(1));
1420             dtdAttribute.attributeName = addToStringStorage(symString(1));
1421             dtdAttribute.attributeQualifiedName = addToStringStorage(symName(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(lastAttributeValue);
1430                 else
1431                     dtdAttribute.defaultValue = addToStringStorage(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(symName(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(89);
1459                 return false;
1460             }
1461             EntityDeclaration &entityDeclaration = entityDeclarations.push();
1462             entityDeclaration.clear();
1463             entityDeclaration.name = symString(3);
1464         } break;
1465 
1466         case 90: {
1467             if (!scanPublicOrSystem() && atEnd) {
1468                 resume(90);
1469                 return false;
1470             }
1471             EntityDeclaration &entityDeclaration = entityDeclarations.push();
1472             entityDeclaration.clear();
1473             entityDeclaration.name = symString(5);
1474             entityDeclaration.parameter = true;
1475         } break;
1476 
1477         case 91: {
1478             if (!scanNData() && atEnd) {
1479                 resume(91);
1480                 return false;
1481             }
1482             EntityDeclaration &entityDeclaration = entityDeclarations.top();
1483             entityDeclaration.systemId = symString(3);
1484             entityDeclaration.external = true;
1485         } break;
1486 
1487         case 92: {
1488             if (!scanNData() && atEnd) {
1489                 resume(92);
1490                 return false;
1491             }
1492             EntityDeclaration &entityDeclaration = entityDeclarations.top();
1493             checkPublicLiteral((entityDeclaration.publicId = symString(3)));
1494             entityDeclaration.systemId = symString(5);
1495             entityDeclaration.external = true;
1496         } break;
1497 
1498         case 93: {
1499             EntityDeclaration &entityDeclaration = entityDeclarations.top();
1500             entityDeclaration.notationName = symString(3);
1501             if (entityDeclaration.parameter)
1502                 raiseWellFormedError(QXmlStream::tr("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(2);
1515             auto &hash = entityDeclaration.parameter ? parameterEntityHash : entityHash;
1516             if (!hash.contains(qToStringViewIgnoringNull(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(qToStringViewIgnoringNull(entity.name), entity);
1522             }
1523         } break;
1524 
1525         case 96: {
1526             setType(QXmlStreamReader::ProcessingInstruction);
1527             int pos = sym(4).pos + sym(4).len;
1528             processingInstructionTarget = symString(3);
1529             if (scanUntil("?>")) {
1530                 processingInstructionData = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 2);
1531                 if (!processingInstructionTarget.compare(QLatin1String("xml"), Qt::CaseInsensitive)) {
1532                     raiseWellFormedError(QXmlStream::tr("XML declaration not at start of document."));
1533                 }
1534                 else if (!QXmlUtils::isNCName(processingInstructionTarget))
1535                     raiseWellFormedError(QXmlStream::tr("%1 is an invalid processing instruction name.")
1536                                          .arg(processingInstructionTarget));
1537             } else if (type != QXmlStreamReader::Invalid){
1538                 resume(96);
1539                 return false;
1540             }
1541         } break;
1542 
1543         case 97:
1544             setType(QXmlStreamReader::ProcessingInstruction);
1545             processingInstructionTarget = symString(3);
1546             if (!processingInstructionTarget.compare(QLatin1String("xml"), Qt::CaseInsensitive))
1547                 raiseWellFormedError(QXmlStream::tr("Invalid processing instruction name."));
1548         break;
1549 
1550         case 98:
1551             if (!scanAfterLangleBang() && atEnd) {
1552                 resume(98);
1553                 return false;
1554             }
1555         break;
1556 
1557         case 99:
1558             if (!scanUntil("--")) {
1559                 resume(99);
1560                 return false;
1561             }
1562         break;
1563 
1564         case 100: {
1565             setType(QXmlStreamReader::Comment);
1566             int pos = sym(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(2).pos;
1575             if (scanUntil("]]>", -1)) {
1576                 text = QStringRef(&textBuffer, pos, textBuffer.size() - pos - 3);
1577             } else {
1578                 resume(101);
1579                 return false;
1580             }
1581         } break;
1582 
1583         case 102: {
1584             if (!scanPublicOrSystem() && atEnd) {
1585                 resume(102);
1586                 return false;
1587             }
1588             NotationDeclaration &notationDeclaration = notationDeclarations.push();
1589             notationDeclaration.name = symString(3);
1590         } break;
1591 
1592         case 103: {
1593             NotationDeclaration &notationDeclaration = notationDeclarations.top();
1594             notationDeclaration.systemId = symString(3);
1595             notationDeclaration.publicId.clear();
1596         } break;
1597 
1598         case 104: {
1599             NotationDeclaration &notationDeclaration = notationDeclarations.top();
1600             notationDeclaration.systemId.clear();
1601             checkPublicLiteral((notationDeclaration.publicId = symString(3)));
1602         } break;
1603 
1604         case 105: {
1605             NotationDeclaration &notationDeclaration = notationDeclarations.top();
1606             checkPublicLiteral((notationDeclaration.publicId = symString(3)));
1607             notationDeclaration.systemId = symString(5);
1608         } break;
1609 
1610         case 129:
1611             isWhitespace = false;
1612             Q_FALLTHROUGH();
1613 
1614         case 130:
1615             sym(1).len += fastScanContentCharList();
1616             if (atEnd && !inParseEntity) {
1617                 resume(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(1) = sym(2);
1637         break;
1638 
1639         case 144:
1640         case 145:
1641         case 146:
1642         case 147:
1643             sym(1).len += sym(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(1).len += fastScanLiteralContent();
1653             if (atEnd) {
1654                 resume(174);
1655                 return false;
1656             }
1657         break;
1658 
1659         case 175: {
1660             if (!QXmlUtils::isPublicID(symString(1))) {
1661                 raiseWellFormedError(QXmlStream::tr("%1 is an invalid PUBLIC identifier.").arg(symString(1)));
1662                 resume(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(1) = sym(2);
1675         break;
1676 
1677         case 180:
1678         case 181:
1679         case 182:
1680         case 183:
1681             sym(1).len += sym(2).len;
1682         break;
1683 
1684         case 213:
1685         case 214:
1686             clearSym();
1687         break;
1688 
1689         case 215:
1690         case 216:
1691             sym(1) = sym(2);
1692             lastAttributeValue = symString(1);
1693         break;
1694 
1695         case 217:
1696         case 218:
1697         case 219:
1698         case 220:
1699             sym(1).len += sym(2).len;
1700         break;
1701 
1702         case 229: {
1703             QStringRef prefix = symPrefix(1);
1704             if (prefix.isEmpty() && symString(1) == QLatin1String("xmlns") && namespaceProcessing) {
1705                 NamespaceDeclaration &namespaceDeclaration = namespaceDeclarations.push();
1706                 namespaceDeclaration.prefix.clear();
1707 
1708                 const QStringRef ns(symString(5));
1709                 if(ns == QLatin1String("http://www.w3.org/2000/xmlns/") ||
1710                    ns == QLatin1String("http://www.w3.org/XML/1998/namespace"))
1711                     raiseWellFormedError(QXmlStream::tr("Illegal namespace declaration."));
1712                 else
1713                     namespaceDeclaration.namespaceUri = addToStringStorage(ns);
1714             } else {
1715                 Attribute &attribute = attributeStack.push();
1716                 attribute.key = sym(1);
1717                 attribute.value = sym(5);
1718 
1719                 QStringRef attributeQualifiedName = symName(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(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(attribute.value.pos + i);
1746                         ++n;
1747                     }
1748                     if (wasSpace)
1749                         while (n && textBuffer.at(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(attribute.key);
1757                     QStringRef namespaceUri = symString(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(QXmlStream::tr("Illegal namespace declaration."));
1765 
1766                     namespaceDeclaration.prefix = addToStringStorage(namespacePrefix);
1767                     namespaceDeclaration.namespaceUri = addToStringStorage(namespaceUri);
1768                 }
1769             }
1770         } break;
1771 
1772         case 235: {
1773             normalizeLiterals = true;
1774             Tag &tag = tagStack_push();
1775             prefix = tag.namespaceDeclaration.prefix  = addToStringStorage(symPrefix(2));
1776             name = tag.name = addToStringStorage(symString(2));
1777             qualifiedName = tag.qualifiedName = addToStringStorage(symName(2));
1778             if ((!prefix.isEmpty() && !QXmlUtils::isNCName(prefix)) || !QXmlUtils::isNCName(name))
1779                 raiseWellFormedError(QXmlStream::tr("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(QXmlStream::tr("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(3))
1802                 raiseWellFormedError(QXmlStream::tr("Opening and ending tag mismatch."));
1803         } break;
1804 
1805         case 239:
1806             if (entitiesMustBeDeclared()) {
1807                 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(unresolvedEntity));
1808                 break;
1809             }
1810             setType(QXmlStreamReader::EntityReference);
1811             name = &unresolvedEntity;
1812         break;
1813 
1814         case 240: {
1815             sym(1).len += sym(2).len + 1;
1816             QStringView reference = symView(2);
1817             if (entityHash.contains(reference)) {
1818                 Entity &entity = entityHash[reference];
1819                 if (entity.unparsed) {
1820                     raiseWellFormedError(QXmlStream::tr("Reference to unparsed entity '%1'.").arg(reference));
1821                 } else {
1822                     if (!entity.hasBeenParsed) {
1823                         parseEntity(entity.value);
1824                         entity.hasBeenParsed = true;
1825                     }
1826                     if (entity.literal)
1827                         putStringLiteral(entity.value);
1828                     else if (referenceEntity(entity))
1829                         putReplacement(entity.value);
1830                     textBuffer.chop(2 + sym(2).len);
1831                     clearSym();
1832                 }
1833                 break;
1834             }
1835 
1836             if (entityResolver) {
1837                 QString replacementText = resolveUndeclaredEntity(reference.toString());
1838                 if (!replacementText.isNull()) {
1839                     putReplacement(replacementText);
1840                     textBuffer.chop(2 + sym(2).len);
1841                     clearSym();
1842                     break;
1843                 }
1844             }
1845 
1846             injectToken(UNRESOLVED_ENTITY);
1847             unresolvedEntity = symString(2).toString();
1848             textBuffer.chop(2 + sym(2).len);
1849             clearSym();
1850 
1851         } break;
1852 
1853         case 241: {
1854             sym(1).len += sym(2).len + 1;
1855             QStringView reference = symView(2);
1856             if (parameterEntityHash.contains(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(entity.value);
1864                     textBuffer.chop(2 + sym(2).len);
1865                     clearSym();
1866                 }
1867             } else if (entitiesMustBeDeclared()) {
1868                 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(symString(2)));
1869             }
1870         } break;
1871 
1872         case 242:
1873             sym(1).len += sym(2).len + 1;
1874         break;
1875 
1876         case 243: {
1877             sym(1).len += sym(2).len + 1;
1878             QStringView reference = symView(2);
1879             if (entityHash.contains(reference)) {
1880                 Entity &entity = entityHash[reference];
1881                 if (entity.unparsed || entity.value.isNull()) {
1882                     raiseWellFormedError(QXmlStream::tr("Reference to external entity '%1' in attribute value.").arg(reference));
1883                     break;
1884                 }
1885                 if (!entity.hasBeenParsed) {
1886                     parseEntity(entity.value);
1887                     entity.hasBeenParsed = true;
1888                 }
1889                 if (entity.literal)
1890                     putStringLiteral(entity.value);
1891                 else if (referenceEntity(entity))
1892                     putReplacementInAttributeValue(entity.value);
1893                 textBuffer.chop(2 + sym(2).len);
1894                 clearSym();
1895                 break;
1896             }
1897 
1898             if (entityResolver) {
1899                 QString replacementText = resolveUndeclaredEntity(reference.toString());
1900                 if (!replacementText.isNull()) {
1901                     putReplacement(replacementText);
1902                     textBuffer.chop(2 + sym(2).len);
1903                     clearSym();
1904                     break;
1905                 }
1906             }
1907             if (entitiesMustBeDeclared()) {
1908                 raiseWellFormedError(QXmlStream::tr("Entity '%1' not declared.").arg(reference));
1909             }
1910         } break;
1911 
1912         case 244: {
1913             if (uint s = resolveCharRef(3)) {
1914                 if (s >= 0xffff)
1915                     putStringLiteral(QString::fromUcs4(&s, 1));
1916                 else
1917                     putChar((LETTER << 16) | s);
1918 
1919                 textBuffer.chop(3 + sym(3).len);
1920                 clearSym();
1921             } else {
1922                 raiseWellFormedError(QXmlStream::tr("Invalid character reference."));
1923             }
1924         } break;
1925 
1926         case 247:
1927         case 248:
1928             sym(1).len += sym(2).len;
1929         break;
1930 
1931         case 259:
1932             sym(1).len += fastScanSpace();
1933             if (atEnd) {
1934                 resume(259);
1935                 return false;
1936             }
1937         break;
1938 
1939         case 262: {
1940             sym(1).len += fastScanName(&sym(1).prefix);
1941             if (atEnd) {
1942                 resume(262);
1943                 return false;
1944             }
1945         } break;
1946 
1947         case 263:
1948             sym(1).len += fastScanName();
1949             if (atEnd) {
1950                 resume(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(1).len += fastScanNMTOKEN();
1961             if (atEnd) {
1962                 resume(268);
1963                 return false;
1964             }
1965 
1966         break;
1967 
1968     default:
1969         ;
1970     } // switch
1971             act = state_stack[tos] = nt_action (act, 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