Coverage Report

Created: 2025-08-29 06:27

/src/CMake/Utilities/cmexpat/lib/xmlrole.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
12
   Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14
   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15
   Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
16
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2021      Donghee Na <donghee.na@python.org>
19
   Licensed under the MIT license:
20
21
   Permission is  hereby granted,  free of charge,  to any  person obtaining
22
   a  copy  of  this  software   and  associated  documentation  files  (the
23
   "Software"),  to  deal in  the  Software  without restriction,  including
24
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
25
   distribute, sublicense, and/or sell copies of the Software, and to permit
26
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
27
   following conditions:
28
29
   The above copyright  notice and this permission notice  shall be included
30
   in all copies or substantial portions of the Software.
31
32
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
33
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
34
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
35
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
37
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38
   USE OR OTHER DEALINGS IN THE SOFTWARE.
39
*/
40
41
#include "expat_config.h"
42
43
#include <stddef.h>
44
45
#ifdef _WIN32
46
#  include "winconfig.h"
47
#endif
48
49
#include "expat_external.h"
50
#include "internal.h"
51
#include "xmlrole.h"
52
#include "ascii.h"
53
54
/* Doesn't check:
55
56
 that ,| are not mixed in a model group
57
 content of literals
58
59
*/
60
61
static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
62
static const char KW_ATTLIST[]
63
    = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
64
static const char KW_CDATA[]
65
    = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
66
static const char KW_DOCTYPE[]
67
    = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
68
static const char KW_ELEMENT[]
69
    = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
70
static const char KW_EMPTY[]
71
    = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
72
static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
73
                                   ASCII_I, ASCII_E, ASCII_S, '\0'};
74
static const char KW_ENTITY[]
75
    = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
76
static const char KW_FIXED[]
77
    = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
78
static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
79
static const char KW_IDREF[]
80
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
81
static const char KW_IDREFS[]
82
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83
#ifdef XML_DTD
84
static const char KW_IGNORE[]
85
    = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86
#endif
87
static const char KW_IMPLIED[]
88
    = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89
#ifdef XML_DTD
90
static const char KW_INCLUDE[]
91
    = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92
#endif
93
static const char KW_NDATA[]
94
    = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
95
static const char KW_NMTOKEN[]
96
    = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
97
static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
98
                                   ASCII_E, ASCII_N, ASCII_S, '\0'};
99
static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
100
                                   ASCII_I, ASCII_O, ASCII_N, '\0'};
101
static const char KW_PCDATA[]
102
    = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
103
static const char KW_PUBLIC[]
104
    = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
105
static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
106
                                   ASCII_R, ASCII_E, ASCII_D, '\0'};
107
static const char KW_SYSTEM[]
108
    = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
109
110
#ifndef MIN_BYTES_PER_CHAR
111
#  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
112
#endif
113
114
#ifdef XML_DTD
115
#  define setTopLevel(state)                                                   \
116
    ((state)->handler                                                          \
117
     = ((state)->documentEntity ? internalSubset : externalSubset1))
118
#else /* not XML_DTD */
119
48.6k
#  define setTopLevel(state) ((state)->handler = internalSubset)
120
#endif /* not XML_DTD */
121
122
typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
123
                                   const char *ptr, const char *end,
124
                                   const ENCODING *enc);
125
126
static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
127
    doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
128
    entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
129
    notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
130
    attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
131
    attlist9, element0, element1, element2, element3, element4, element5,
132
    element6, element7,
133
#ifdef XML_DTD
134
    externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
135
#endif /* XML_DTD */
136
    declClose, error;
137
138
static int FASTCALL common(PROLOG_STATE *state, int tok);
139
140
static int PTRCALL
141
prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
142
5.60k
        const ENCODING *enc) {
143
5.60k
  switch (tok) {
144
106
  case XML_TOK_PROLOG_S:
145
106
    state->handler = prolog1;
146
106
    return XML_ROLE_NONE;
147
799
  case XML_TOK_XML_DECL:
148
799
    state->handler = prolog1;
149
799
    return XML_ROLE_XML_DECL;
150
98
  case XML_TOK_PI:
151
98
    state->handler = prolog1;
152
98
    return XML_ROLE_PI;
153
42
  case XML_TOK_COMMENT:
154
42
    state->handler = prolog1;
155
42
    return XML_ROLE_COMMENT;
156
183
  case XML_TOK_BOM:
157
183
    return XML_ROLE_NONE;
158
2.03k
  case XML_TOK_DECL_OPEN:
159
2.03k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160
2.03k
                              KW_DOCTYPE))
161
12
      break;
162
2.02k
    state->handler = doctype0;
163
2.02k
    return XML_ROLE_DOCTYPE_NONE;
164
2.20k
  case XML_TOK_INSTANCE_START:
165
2.20k
    state->handler = error;
166
2.20k
    return XML_ROLE_INSTANCE_START;
167
5.60k
  }
168
151
  return common(state, tok);
169
5.60k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
4.33k
        const ENCODING *enc) {
174
4.33k
  switch (tok) {
175
904
  case XML_TOK_PROLOG_S:
176
904
    return XML_ROLE_NONE;
177
2.16k
  case XML_TOK_PI:
178
2.16k
    return XML_ROLE_PI;
179
590
  case XML_TOK_COMMENT:
180
590
    return XML_ROLE_COMMENT;
181
0
  case XML_TOK_BOM:
182
    /* This case can never arise.  To reach this role function, the
183
     * parse must have passed through prolog0 and therefore have had
184
     * some form of input, even if only a space.  At that point, a
185
     * byte order mark is no longer a valid character (though
186
     * technically it should be interpreted as a non-breaking space),
187
     * so will be rejected by the tokenizing stages.
188
     */
189
0
    return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
190
301
  case XML_TOK_DECL_OPEN:
191
301
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
301
                              KW_DOCTYPE))
193
3
      break;
194
298
    state->handler = doctype0;
195
298
    return XML_ROLE_DOCTYPE_NONE;
196
368
  case XML_TOK_INSTANCE_START:
197
368
    state->handler = error;
198
368
    return XML_ROLE_INSTANCE_START;
199
4.33k
  }
200
9
  return common(state, tok);
201
4.33k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
4.64k
        const ENCODING *enc) {
206
4.64k
  UNUSED_P(ptr);
207
4.64k
  UNUSED_P(end);
208
4.64k
  UNUSED_P(enc);
209
4.64k
  switch (tok) {
210
1.50k
  case XML_TOK_PROLOG_S:
211
1.50k
    return XML_ROLE_NONE;
212
1.81k
  case XML_TOK_PI:
213
1.81k
    return XML_ROLE_PI;
214
359
  case XML_TOK_COMMENT:
215
359
    return XML_ROLE_COMMENT;
216
970
  case XML_TOK_INSTANCE_START:
217
970
    state->handler = error;
218
970
    return XML_ROLE_INSTANCE_START;
219
4.64k
  }
220
6
  return common(state, tok);
221
4.64k
}
222
223
static int PTRCALL
224
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225
4.63k
         const ENCODING *enc) {
226
4.63k
  UNUSED_P(ptr);
227
4.63k
  UNUSED_P(end);
228
4.63k
  UNUSED_P(enc);
229
4.63k
  switch (tok) {
230
2.31k
  case XML_TOK_PROLOG_S:
231
2.31k
    return XML_ROLE_DOCTYPE_NONE;
232
2.31k
  case XML_TOK_NAME:
233
2.31k
  case XML_TOK_PREFIXED_NAME:
234
2.31k
    state->handler = doctype1;
235
2.31k
    return XML_ROLE_DOCTYPE_NAME;
236
4.63k
  }
237
3
  return common(state, tok);
238
4.63k
}
239
240
static int PTRCALL
241
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242
2.91k
         const ENCODING *enc) {
243
2.91k
  switch (tok) {
244
601
  case XML_TOK_PROLOG_S:
245
601
    return XML_ROLE_DOCTYPE_NONE;
246
1.68k
  case XML_TOK_OPEN_BRACKET:
247
1.68k
    state->handler = internalSubset;
248
1.68k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
30
  case XML_TOK_DECL_CLOSE:
250
30
    state->handler = prolog2;
251
30
    return XML_ROLE_DOCTYPE_CLOSE;
252
596
  case XML_TOK_NAME:
253
596
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
18
      state->handler = doctype3;
255
18
      return XML_ROLE_DOCTYPE_NONE;
256
18
    }
257
578
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
572
      state->handler = doctype2;
259
572
      return XML_ROLE_DOCTYPE_NONE;
260
572
    }
261
6
    break;
262
2.91k
  }
263
9
  return common(state, tok);
264
2.91k
}
265
266
static int PTRCALL
267
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268
1.14k
         const ENCODING *enc) {
269
1.14k
  UNUSED_P(ptr);
270
1.14k
  UNUSED_P(end);
271
1.14k
  UNUSED_P(enc);
272
1.14k
  switch (tok) {
273
571
  case XML_TOK_PROLOG_S:
274
571
    return XML_ROLE_DOCTYPE_NONE;
275
566
  case XML_TOK_LITERAL:
276
566
    state->handler = doctype3;
277
566
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
278
1.14k
  }
279
3
  return common(state, tok);
280
1.14k
}
281
282
static int PTRCALL
283
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284
968
         const ENCODING *enc) {
285
968
  UNUSED_P(ptr);
286
968
  UNUSED_P(end);
287
968
  UNUSED_P(enc);
288
968
  switch (tok) {
289
486
  case XML_TOK_PROLOG_S:
290
486
    return XML_ROLE_DOCTYPE_NONE;
291
472
  case XML_TOK_LITERAL:
292
472
    state->handler = doctype4;
293
472
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
968
  }
295
10
  return common(state, tok);
296
968
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
486
         const ENCODING *enc) {
301
486
  UNUSED_P(ptr);
302
486
  UNUSED_P(end);
303
486
  UNUSED_P(enc);
304
486
  switch (tok) {
305
19
  case XML_TOK_PROLOG_S:
306
19
    return XML_ROLE_DOCTYPE_NONE;
307
296
  case XML_TOK_OPEN_BRACKET:
308
296
    state->handler = internalSubset;
309
296
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
168
  case XML_TOK_DECL_CLOSE:
311
168
    state->handler = prolog2;
312
168
    return XML_ROLE_DOCTYPE_CLOSE;
313
486
  }
314
3
  return common(state, tok);
315
486
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
847
         const ENCODING *enc) {
320
847
  UNUSED_P(ptr);
321
847
  UNUSED_P(end);
322
847
  UNUSED_P(enc);
323
847
  switch (tok) {
324
37
  case XML_TOK_PROLOG_S:
325
37
    return XML_ROLE_DOCTYPE_NONE;
326
809
  case XML_TOK_DECL_CLOSE:
327
809
    state->handler = prolog2;
328
809
    return XML_ROLE_DOCTYPE_CLOSE;
329
847
  }
330
1
  return common(state, tok);
331
847
}
332
333
static int PTRCALL
334
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335
59.3k
               const ENCODING *enc) {
336
59.3k
  switch (tok) {
337
5.12k
  case XML_TOK_PROLOG_S:
338
5.12k
    return XML_ROLE_NONE;
339
49.6k
  case XML_TOK_DECL_OPEN:
340
49.6k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
49.6k
                            KW_ENTITY)) {
342
15.0k
      state->handler = entity0;
343
15.0k
      return XML_ROLE_ENTITY_NONE;
344
15.0k
    }
345
34.6k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
34.6k
                            KW_ATTLIST)) {
347
31.2k
      state->handler = attlist0;
348
31.2k
      return XML_ROLE_ATTLIST_NONE;
349
31.2k
    }
350
3.40k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
3.40k
                            KW_ELEMENT)) {
352
2.36k
      state->handler = element0;
353
2.36k
      return XML_ROLE_ELEMENT_NONE;
354
2.36k
    }
355
1.04k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.04k
                            KW_NOTATION)) {
357
1.03k
      state->handler = notation0;
358
1.03k
      return XML_ROLE_NOTATION_NONE;
359
1.03k
    }
360
10
    break;
361
1.36k
  case XML_TOK_PI:
362
1.36k
    return XML_ROLE_PI;
363
344
  case XML_TOK_COMMENT:
364
344
    return XML_ROLE_COMMENT;
365
1.95k
  case XML_TOK_PARAM_ENTITY_REF:
366
1.95k
    return XML_ROLE_PARAM_ENTITY_REF;
367
814
  case XML_TOK_CLOSE_BRACKET:
368
814
    state->handler = doctype5;
369
814
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
59.3k
  }
373
35
  return common(state, tok);
374
59.3k
}
375
376
#ifdef XML_DTD
377
378
static int PTRCALL
379
externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
380
                const ENCODING *enc) {
381
  state->handler = externalSubset1;
382
  if (tok == XML_TOK_XML_DECL)
383
    return XML_ROLE_TEXT_DECL;
384
  return externalSubset1(state, tok, ptr, end, enc);
385
}
386
387
static int PTRCALL
388
externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
389
                const ENCODING *enc) {
390
  switch (tok) {
391
  case XML_TOK_COND_SECT_OPEN:
392
    state->handler = condSect0;
393
    return XML_ROLE_NONE;
394
  case XML_TOK_COND_SECT_CLOSE:
395
    if (state->includeLevel == 0)
396
      break;
397
    state->includeLevel -= 1;
398
    return XML_ROLE_NONE;
399
  case XML_TOK_PROLOG_S:
400
    return XML_ROLE_NONE;
401
  case XML_TOK_CLOSE_BRACKET:
402
    break;
403
  case XML_TOK_NONE:
404
    if (state->includeLevel)
405
      break;
406
    return XML_ROLE_NONE;
407
  default:
408
    return internalSubset(state, tok, ptr, end, enc);
409
  }
410
  return common(state, tok);
411
}
412
413
#endif /* XML_DTD */
414
415
static int PTRCALL
416
entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
417
30.1k
        const ENCODING *enc) {
418
30.1k
  UNUSED_P(ptr);
419
30.1k
  UNUSED_P(end);
420
30.1k
  UNUSED_P(enc);
421
30.1k
  switch (tok) {
422
15.0k
  case XML_TOK_PROLOG_S:
423
15.0k
    return XML_ROLE_ENTITY_NONE;
424
3.07k
  case XML_TOK_PERCENT:
425
3.07k
    state->handler = entity1;
426
3.07k
    return XML_ROLE_ENTITY_NONE;
427
11.9k
  case XML_TOK_NAME:
428
11.9k
    state->handler = entity2;
429
11.9k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
30.1k
  }
431
3
  return common(state, tok);
432
30.1k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
6.14k
        const ENCODING *enc) {
437
6.14k
  UNUSED_P(ptr);
438
6.14k
  UNUSED_P(end);
439
6.14k
  UNUSED_P(enc);
440
6.14k
  switch (tok) {
441
3.07k
  case XML_TOK_PROLOG_S:
442
3.07k
    return XML_ROLE_ENTITY_NONE;
443
3.05k
  case XML_TOK_NAME:
444
3.05k
    state->handler = entity7;
445
3.05k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
6.14k
  }
447
10
  return common(state, tok);
448
6.14k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
23.8k
        const ENCODING *enc) {
453
23.8k
  switch (tok) {
454
11.9k
  case XML_TOK_PROLOG_S:
455
11.9k
    return XML_ROLE_ENTITY_NONE;
456
2.37k
  case XML_TOK_NAME:
457
2.37k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
833
      state->handler = entity4;
459
833
      return XML_ROLE_ENTITY_NONE;
460
833
    }
461
1.54k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
1.54k
      state->handler = entity3;
463
1.54k
      return XML_ROLE_ENTITY_NONE;
464
1.54k
    }
465
6
    break;
466
9.55k
  case XML_TOK_LITERAL:
467
9.55k
    state->handler = declClose;
468
9.55k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
9.55k
    return XML_ROLE_ENTITY_VALUE;
470
23.8k
  }
471
9
  return common(state, tok);
472
23.8k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
3.07k
        const ENCODING *enc) {
477
3.07k
  UNUSED_P(ptr);
478
3.07k
  UNUSED_P(end);
479
3.07k
  UNUSED_P(enc);
480
3.07k
  switch (tok) {
481
1.54k
  case XML_TOK_PROLOG_S:
482
1.54k
    return XML_ROLE_ENTITY_NONE;
483
1.53k
  case XML_TOK_LITERAL:
484
1.53k
    state->handler = entity4;
485
1.53k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
3.07k
  }
487
1
  return common(state, tok);
488
3.07k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
4.64k
        const ENCODING *enc) {
493
4.64k
  UNUSED_P(ptr);
494
4.64k
  UNUSED_P(end);
495
4.64k
  UNUSED_P(enc);
496
4.64k
  switch (tok) {
497
2.32k
  case XML_TOK_PROLOG_S:
498
2.32k
    return XML_ROLE_ENTITY_NONE;
499
2.31k
  case XML_TOK_LITERAL:
500
2.31k
    state->handler = entity5;
501
2.31k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
4.64k
  }
503
4
  return common(state, tok);
504
4.64k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
2.85k
        const ENCODING *enc) {
509
2.85k
  switch (tok) {
510
555
  case XML_TOK_PROLOG_S:
511
555
    return XML_ROLE_ENTITY_NONE;
512
1.91k
  case XML_TOK_DECL_CLOSE:
513
1.91k
    setTopLevel(state);
514
1.91k
    return XML_ROLE_ENTITY_COMPLETE;
515
383
  case XML_TOK_NAME:
516
383
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
382
      state->handler = entity6;
518
382
      return XML_ROLE_ENTITY_NONE;
519
382
    }
520
1
    break;
521
2.85k
  }
522
2
  return common(state, tok);
523
2.85k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
754
        const ENCODING *enc) {
528
754
  UNUSED_P(ptr);
529
754
  UNUSED_P(end);
530
754
  UNUSED_P(enc);
531
754
  switch (tok) {
532
378
  case XML_TOK_PROLOG_S:
533
378
    return XML_ROLE_ENTITY_NONE;
534
375
  case XML_TOK_NAME:
535
375
    state->handler = declClose;
536
375
    state->role_none = XML_ROLE_ENTITY_NONE;
537
375
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
754
  }
539
1
  return common(state, tok);
540
754
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
6.10k
        const ENCODING *enc) {
545
6.10k
  switch (tok) {
546
3.05k
  case XML_TOK_PROLOG_S:
547
3.05k
    return XML_ROLE_ENTITY_NONE;
548
2.25k
  case XML_TOK_NAME:
549
2.25k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
310
      state->handler = entity9;
551
310
      return XML_ROLE_ENTITY_NONE;
552
310
    }
553
1.94k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
1.94k
      state->handler = entity8;
555
1.94k
      return XML_ROLE_ENTITY_NONE;
556
1.94k
    }
557
1
    break;
558
785
  case XML_TOK_LITERAL:
559
785
    state->handler = declClose;
560
785
    state->role_none = XML_ROLE_ENTITY_NONE;
561
785
    return XML_ROLE_ENTITY_VALUE;
562
6.10k
  }
563
3
  return common(state, tok);
564
6.10k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
3.88k
        const ENCODING *enc) {
569
3.88k
  UNUSED_P(ptr);
570
3.88k
  UNUSED_P(end);
571
3.88k
  UNUSED_P(enc);
572
3.88k
  switch (tok) {
573
1.94k
  case XML_TOK_PROLOG_S:
574
1.94k
    return XML_ROLE_ENTITY_NONE;
575
1.93k
  case XML_TOK_LITERAL:
576
1.93k
    state->handler = entity9;
577
1.93k
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
3.88k
  }
579
2
  return common(state, tok);
580
3.88k
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
4.45k
        const ENCODING *enc) {
585
4.45k
  UNUSED_P(ptr);
586
4.45k
  UNUSED_P(end);
587
4.45k
  UNUSED_P(enc);
588
4.45k
  switch (tok) {
589
2.23k
  case XML_TOK_PROLOG_S:
590
2.23k
    return XML_ROLE_ENTITY_NONE;
591
2.22k
  case XML_TOK_LITERAL:
592
2.22k
    state->handler = entity10;
593
2.22k
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
4.45k
  }
595
2
  return common(state, tok);
596
4.45k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
2.55k
         const ENCODING *enc) {
601
2.55k
  UNUSED_P(ptr);
602
2.55k
  UNUSED_P(end);
603
2.55k
  UNUSED_P(enc);
604
2.55k
  switch (tok) {
605
340
  case XML_TOK_PROLOG_S:
606
340
    return XML_ROLE_ENTITY_NONE;
607
2.21k
  case XML_TOK_DECL_CLOSE:
608
2.21k
    setTopLevel(state);
609
2.21k
    return XML_ROLE_ENTITY_COMPLETE;
610
2.55k
  }
611
1
  return common(state, tok);
612
2.55k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.05k
          const ENCODING *enc) {
617
2.05k
  UNUSED_P(ptr);
618
2.05k
  UNUSED_P(end);
619
2.05k
  UNUSED_P(enc);
620
2.05k
  switch (tok) {
621
1.03k
  case XML_TOK_PROLOG_S:
622
1.03k
    return XML_ROLE_NOTATION_NONE;
623
1.02k
  case XML_TOK_NAME:
624
1.02k
    state->handler = notation1;
625
1.02k
    return XML_ROLE_NOTATION_NAME;
626
2.05k
  }
627
1
  return common(state, tok);
628
2.05k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.02k
          const ENCODING *enc) {
633
2.02k
  switch (tok) {
634
1.01k
  case XML_TOK_PROLOG_S:
635
1.01k
    return XML_ROLE_NOTATION_NONE;
636
1.00k
  case XML_TOK_NAME:
637
1.00k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
316
      state->handler = notation3;
639
316
      return XML_ROLE_NOTATION_NONE;
640
316
    }
641
693
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
689
      state->handler = notation2;
643
689
      return XML_ROLE_NOTATION_NONE;
644
689
    }
645
4
    break;
646
2.02k
  }
647
5
  return common(state, tok);
648
2.02k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.36k
          const ENCODING *enc) {
653
1.36k
  UNUSED_P(ptr);
654
1.36k
  UNUSED_P(end);
655
1.36k
  UNUSED_P(enc);
656
1.36k
  switch (tok) {
657
688
  case XML_TOK_PROLOG_S:
658
688
    return XML_ROLE_NOTATION_NONE;
659
674
  case XML_TOK_LITERAL:
660
674
    state->handler = notation4;
661
674
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.36k
  }
663
3
  return common(state, tok);
664
1.36k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
630
          const ENCODING *enc) {
669
630
  UNUSED_P(ptr);
670
630
  UNUSED_P(end);
671
630
  UNUSED_P(enc);
672
630
  switch (tok) {
673
321
  case XML_TOK_PROLOG_S:
674
321
    return XML_ROLE_NOTATION_NONE;
675
308
  case XML_TOK_LITERAL:
676
308
    state->handler = declClose;
677
308
    state->role_none = XML_ROLE_NOTATION_NONE;
678
308
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
630
  }
680
1
  return common(state, tok);
681
630
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
995
          const ENCODING *enc) {
686
995
  UNUSED_P(ptr);
687
995
  UNUSED_P(end);
688
995
  UNUSED_P(enc);
689
995
  switch (tok) {
690
325
  case XML_TOK_PROLOG_S:
691
325
    return XML_ROLE_NOTATION_NONE;
692
60
  case XML_TOK_LITERAL:
693
60
    state->handler = declClose;
694
60
    state->role_none = XML_ROLE_NOTATION_NONE;
695
60
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
603
  case XML_TOK_DECL_CLOSE:
697
603
    setTopLevel(state);
698
603
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
995
  }
700
7
  return common(state, tok);
701
995
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
62.4k
         const ENCODING *enc) {
706
62.4k
  UNUSED_P(ptr);
707
62.4k
  UNUSED_P(end);
708
62.4k
  UNUSED_P(enc);
709
62.4k
  switch (tok) {
710
31.2k
  case XML_TOK_PROLOG_S:
711
31.2k
    return XML_ROLE_ATTLIST_NONE;
712
31.2k
  case XML_TOK_NAME:
713
31.2k
  case XML_TOK_PREFIXED_NAME:
714
31.2k
    state->handler = attlist1;
715
31.2k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
62.4k
  }
717
1
  return common(state, tok);
718
62.4k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
139k
         const ENCODING *enc) {
723
139k
  UNUSED_P(ptr);
724
139k
  UNUSED_P(end);
725
139k
  UNUSED_P(enc);
726
139k
  switch (tok) {
727
54.1k
  case XML_TOK_PROLOG_S:
728
54.1k
    return XML_ROLE_ATTLIST_NONE;
729
30.8k
  case XML_TOK_DECL_CLOSE:
730
30.8k
    setTopLevel(state);
731
30.8k
    return XML_ROLE_ATTLIST_NONE;
732
54.1k
  case XML_TOK_NAME:
733
54.1k
  case XML_TOK_PREFIXED_NAME:
734
54.1k
    state->handler = attlist2;
735
54.1k
    return XML_ROLE_ATTRIBUTE_NAME;
736
139k
  }
737
15
  return common(state, tok);
738
139k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
108k
         const ENCODING *enc) {
743
108k
  switch (tok) {
744
54.1k
  case XML_TOK_PROLOG_S:
745
54.1k
    return XML_ROLE_ATTLIST_NONE;
746
23.6k
  case XML_TOK_NAME: {
747
23.6k
    static const char *const types[] = {
748
23.6k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
23.6k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
23.6k
    };
751
23.6k
    int i;
752
53.6k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
53.1k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
23.1k
        state->handler = attlist8;
755
23.1k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
23.1k
      }
757
23.6k
  }
758
515
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
502
      state->handler = attlist5;
760
502
      return XML_ROLE_ATTLIST_NONE;
761
502
    }
762
13
    break;
763
30.4k
  case XML_TOK_OPEN_PAREN:
764
30.4k
    state->handler = attlist3;
765
30.4k
    return XML_ROLE_ATTLIST_NONE;
766
108k
  }
767
19
  return common(state, tok);
768
108k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
161k
         const ENCODING *enc) {
773
161k
  UNUSED_P(ptr);
774
161k
  UNUSED_P(end);
775
161k
  UNUSED_P(enc);
776
161k
  switch (tok) {
777
2.31k
  case XML_TOK_PROLOG_S:
778
2.31k
    return XML_ROLE_ATTLIST_NONE;
779
122k
  case XML_TOK_NMTOKEN:
780
159k
  case XML_TOK_NAME:
781
159k
  case XML_TOK_PREFIXED_NAME:
782
159k
    state->handler = attlist4;
783
159k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
161k
  }
785
5
  return common(state, tok);
786
161k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
163k
         const ENCODING *enc) {
791
163k
  UNUSED_P(ptr);
792
163k
  UNUSED_P(end);
793
163k
  UNUSED_P(enc);
794
163k
  switch (tok) {
795
4.02k
  case XML_TOK_PROLOG_S:
796
4.02k
    return XML_ROLE_ATTLIST_NONE;
797
30.4k
  case XML_TOK_CLOSE_PAREN:
798
30.4k
    state->handler = attlist8;
799
30.4k
    return XML_ROLE_ATTLIST_NONE;
800
128k
  case XML_TOK_OR:
801
128k
    state->handler = attlist3;
802
128k
    return XML_ROLE_ATTLIST_NONE;
803
163k
  }
804
4
  return common(state, tok);
805
163k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
992
         const ENCODING *enc) {
810
992
  UNUSED_P(ptr);
811
992
  UNUSED_P(end);
812
992
  UNUSED_P(enc);
813
992
  switch (tok) {
814
503
  case XML_TOK_PROLOG_S:
815
503
    return XML_ROLE_ATTLIST_NONE;
816
488
  case XML_TOK_OPEN_PAREN:
817
488
    state->handler = attlist6;
818
488
    return XML_ROLE_ATTLIST_NONE;
819
992
  }
820
1
  return common(state, tok);
821
992
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
928
         const ENCODING *enc) {
826
928
  UNUSED_P(ptr);
827
928
  UNUSED_P(end);
828
928
  UNUSED_P(enc);
829
928
  switch (tok) {
830
109
  case XML_TOK_PROLOG_S:
831
109
    return XML_ROLE_ATTLIST_NONE;
832
818
  case XML_TOK_NAME:
833
818
    state->handler = attlist7;
834
818
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
928
  }
836
1
  return common(state, tok);
837
928
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.06k
         const ENCODING *enc) {
842
1.06k
  UNUSED_P(ptr);
843
1.06k
  UNUSED_P(end);
844
1.06k
  UNUSED_P(enc);
845
1.06k
  switch (tok) {
846
256
  case XML_TOK_PROLOG_S:
847
256
    return XML_ROLE_ATTLIST_NONE;
848
463
  case XML_TOK_CLOSE_PAREN:
849
463
    state->handler = attlist8;
850
463
    return XML_ROLE_ATTLIST_NONE;
851
343
  case XML_TOK_OR:
852
343
    state->handler = attlist6;
853
343
    return XML_ROLE_ATTLIST_NONE;
854
1.06k
  }
855
2
  return common(state, tok);
856
1.06k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
107k
         const ENCODING *enc) {
862
107k
  switch (tok) {
863
53.9k
  case XML_TOK_PROLOG_S:
864
53.9k
    return XML_ROLE_ATTLIST_NONE;
865
38.7k
  case XML_TOK_POUND_NAME:
866
38.7k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
38.7k
                            KW_IMPLIED)) {
868
38.5k
      state->handler = attlist1;
869
38.5k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
38.5k
    }
871
292
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
292
                            KW_REQUIRED)) {
873
19
      state->handler = attlist1;
874
19
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
19
    }
876
273
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
273
                            KW_FIXED)) {
878
264
      state->handler = attlist9;
879
264
      return XML_ROLE_ATTLIST_NONE;
880
264
    }
881
9
    break;
882
15.1k
  case XML_TOK_LITERAL:
883
15.1k
    state->handler = attlist1;
884
15.1k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
107k
  }
886
11
  return common(state, tok);
887
107k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
516
         const ENCODING *enc) {
892
516
  UNUSED_P(ptr);
893
516
  UNUSED_P(end);
894
516
  UNUSED_P(enc);
895
516
  switch (tok) {
896
260
  case XML_TOK_PROLOG_S:
897
260
    return XML_ROLE_ATTLIST_NONE;
898
251
  case XML_TOK_LITERAL:
899
251
    state->handler = attlist1;
900
251
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
516
  }
902
5
  return common(state, tok);
903
516
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
4.72k
         const ENCODING *enc) {
908
4.72k
  UNUSED_P(ptr);
909
4.72k
  UNUSED_P(end);
910
4.72k
  UNUSED_P(enc);
911
4.72k
  switch (tok) {
912
2.36k
  case XML_TOK_PROLOG_S:
913
2.36k
    return XML_ROLE_ELEMENT_NONE;
914
2.35k
  case XML_TOK_NAME:
915
2.35k
  case XML_TOK_PREFIXED_NAME:
916
2.35k
    state->handler = element1;
917
2.35k
    return XML_ROLE_ELEMENT_NAME;
918
4.72k
  }
919
5
  return common(state, tok);
920
4.72k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
4.69k
         const ENCODING *enc) {
925
4.69k
  switch (tok) {
926
2.35k
  case XML_TOK_PROLOG_S:
927
2.35k
    return XML_ROLE_ELEMENT_NONE;
928
143
  case XML_TOK_NAME:
929
143
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
70
      state->handler = declClose;
931
70
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
70
      return XML_ROLE_CONTENT_EMPTY;
933
70
    }
934
73
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
72
      state->handler = declClose;
936
72
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
72
      return XML_ROLE_CONTENT_ANY;
938
72
    }
939
1
    break;
940
2.19k
  case XML_TOK_OPEN_PAREN:
941
2.19k
    state->handler = element2;
942
2.19k
    state->level = 1;
943
2.19k
    return XML_ROLE_GROUP_OPEN;
944
4.69k
  }
945
4
  return common(state, tok);
946
4.69k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
2.34k
         const ENCODING *enc) {
951
2.34k
  switch (tok) {
952
159
  case XML_TOK_PROLOG_S:
953
159
    return XML_ROLE_ELEMENT_NONE;
954
483
  case XML_TOK_POUND_NAME:
955
483
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
483
                            KW_PCDATA)) {
957
482
      state->handler = element3;
958
482
      return XML_ROLE_CONTENT_PCDATA;
959
482
    }
960
1
    break;
961
387
  case XML_TOK_OPEN_PAREN:
962
387
    state->level = 2;
963
387
    state->handler = element6;
964
387
    return XML_ROLE_GROUP_OPEN;
965
674
  case XML_TOK_NAME:
966
674
  case XML_TOK_PREFIXED_NAME:
967
674
    state->handler = element7;
968
674
    return XML_ROLE_CONTENT_ELEMENT;
969
298
  case XML_TOK_NAME_QUESTION:
970
298
    state->handler = element7;
971
298
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
156
  case XML_TOK_NAME_ASTERISK:
973
156
    state->handler = element7;
974
156
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
181
  case XML_TOK_NAME_PLUS:
976
181
    state->handler = element7;
977
181
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
2.34k
  }
979
6
  return common(state, tok);
980
2.34k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
550
         const ENCODING *enc) {
985
550
  UNUSED_P(ptr);
986
550
  UNUSED_P(end);
987
550
  UNUSED_P(enc);
988
550
  switch (tok) {
989
76
  case XML_TOK_PROLOG_S:
990
76
    return XML_ROLE_ELEMENT_NONE;
991
85
  case XML_TOK_CLOSE_PAREN:
992
85
    state->handler = declClose;
993
85
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
85
    return XML_ROLE_GROUP_CLOSE;
995
168
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
168
    state->handler = declClose;
997
168
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
168
    return XML_ROLE_GROUP_CLOSE_REP;
999
218
  case XML_TOK_OR:
1000
218
    state->handler = element4;
1001
218
    return XML_ROLE_ELEMENT_NONE;
1002
550
  }
1003
3
  return common(state, tok);
1004
550
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.28k
         const ENCODING *enc) {
1009
1.28k
  UNUSED_P(ptr);
1010
1.28k
  UNUSED_P(end);
1011
1.28k
  UNUSED_P(enc);
1012
1.28k
  switch (tok) {
1013
346
  case XML_TOK_PROLOG_S:
1014
346
    return XML_ROLE_ELEMENT_NONE;
1015
930
  case XML_TOK_NAME:
1016
930
  case XML_TOK_PREFIXED_NAME:
1017
930
    state->handler = element5;
1018
930
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.28k
  }
1020
10
  return common(state, tok);
1021
1.28k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
1.30k
         const ENCODING *enc) {
1026
1.30k
  UNUSED_P(ptr);
1027
1.30k
  UNUSED_P(end);
1028
1.30k
  UNUSED_P(enc);
1029
1.30k
  switch (tok) {
1030
391
  case XML_TOK_PROLOG_S:
1031
391
    return XML_ROLE_ELEMENT_NONE;
1032
176
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
176
    state->handler = declClose;
1034
176
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
176
    return XML_ROLE_GROUP_CLOSE_REP;
1036
739
  case XML_TOK_OR:
1037
739
    state->handler = element4;
1038
739
    return XML_ROLE_ELEMENT_NONE;
1039
1.30k
  }
1040
1
  return common(state, tok);
1041
1.30k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
1.66M
         const ENCODING *enc) {
1046
1.66M
  UNUSED_P(ptr);
1047
1.66M
  UNUSED_P(end);
1048
1.66M
  UNUSED_P(enc);
1049
1.66M
  switch (tok) {
1050
5.75k
  case XML_TOK_PROLOG_S:
1051
5.75k
    return XML_ROLE_ELEMENT_NONE;
1052
1.64M
  case XML_TOK_OPEN_PAREN:
1053
1.64M
    state->level += 1;
1054
1.64M
    return XML_ROLE_GROUP_OPEN;
1055
11.9k
  case XML_TOK_NAME:
1056
11.9k
  case XML_TOK_PREFIXED_NAME:
1057
11.9k
    state->handler = element7;
1058
11.9k
    return XML_ROLE_CONTENT_ELEMENT;
1059
257
  case XML_TOK_NAME_QUESTION:
1060
257
    state->handler = element7;
1061
257
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
379
  case XML_TOK_NAME_ASTERISK:
1063
379
    state->handler = element7;
1064
379
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
1.95k
  case XML_TOK_NAME_PLUS:
1066
1.95k
    state->handler = element7;
1067
1.95k
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
1.66M
  }
1069
8
  return common(state, tok);
1070
1.66M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
43.7k
         const ENCODING *enc) {
1075
43.7k
  UNUSED_P(ptr);
1076
43.7k
  UNUSED_P(end);
1077
43.7k
  UNUSED_P(enc);
1078
43.7k
  switch (tok) {
1079
4.19k
  case XML_TOK_PROLOG_S:
1080
4.19k
    return XML_ROLE_ELEMENT_NONE;
1081
15.6k
  case XML_TOK_CLOSE_PAREN:
1082
15.6k
    state->level -= 1;
1083
15.6k
    if (state->level == 0) {
1084
630
      state->handler = declClose;
1085
630
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
630
    }
1087
15.6k
    return XML_ROLE_GROUP_CLOSE;
1088
2.52k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
2.52k
    state->level -= 1;
1090
2.52k
    if (state->level == 0) {
1091
55
      state->handler = declClose;
1092
55
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
55
    }
1094
2.52k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
2.88k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
2.88k
    state->level -= 1;
1097
2.88k
    if (state->level == 0) {
1098
425
      state->handler = declClose;
1099
425
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
425
    }
1101
2.88k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
4.23k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
4.23k
    state->level -= 1;
1104
4.23k
    if (state->level == 0) {
1105
436
      state->handler = declClose;
1106
436
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
436
    }
1108
4.23k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
5.74k
  case XML_TOK_COMMA:
1110
5.74k
    state->handler = element6;
1111
5.74k
    return XML_ROLE_GROUP_SEQUENCE;
1112
8.49k
  case XML_TOK_OR:
1113
8.49k
    state->handler = element6;
1114
8.49k
    return XML_ROLE_GROUP_CHOICE;
1115
43.7k
  }
1116
5
  return common(state, tok);
1117
43.7k
}
1118
1119
#ifdef XML_DTD
1120
1121
static int PTRCALL
1122
condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1123
          const ENCODING *enc) {
1124
  switch (tok) {
1125
  case XML_TOK_PROLOG_S:
1126
    return XML_ROLE_NONE;
1127
  case XML_TOK_NAME:
1128
    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1129
      state->handler = condSect1;
1130
      return XML_ROLE_NONE;
1131
    }
1132
    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1133
      state->handler = condSect2;
1134
      return XML_ROLE_NONE;
1135
    }
1136
    break;
1137
  }
1138
  return common(state, tok);
1139
}
1140
1141
static int PTRCALL
1142
condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1143
          const ENCODING *enc) {
1144
  UNUSED_P(ptr);
1145
  UNUSED_P(end);
1146
  UNUSED_P(enc);
1147
  switch (tok) {
1148
  case XML_TOK_PROLOG_S:
1149
    return XML_ROLE_NONE;
1150
  case XML_TOK_OPEN_BRACKET:
1151
    state->handler = externalSubset1;
1152
    state->includeLevel += 1;
1153
    return XML_ROLE_NONE;
1154
  }
1155
  return common(state, tok);
1156
}
1157
1158
static int PTRCALL
1159
condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1160
          const ENCODING *enc) {
1161
  UNUSED_P(ptr);
1162
  UNUSED_P(end);
1163
  UNUSED_P(enc);
1164
  switch (tok) {
1165
  case XML_TOK_PROLOG_S:
1166
    return XML_ROLE_NONE;
1167
  case XML_TOK_OPEN_BRACKET:
1168
    state->handler = externalSubset1;
1169
    return XML_ROLE_IGNORE_SECT;
1170
  }
1171
  return common(state, tok);
1172
}
1173
1174
#endif /* XML_DTD */
1175
1176
static int PTRCALL
1177
declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1178
14.6k
          const ENCODING *enc) {
1179
14.6k
  UNUSED_P(ptr);
1180
14.6k
  UNUSED_P(end);
1181
14.6k
  UNUSED_P(enc);
1182
14.6k
  switch (tok) {
1183
1.52k
  case XML_TOK_PROLOG_S:
1184
1.52k
    return state->role_none;
1185
13.0k
  case XML_TOK_DECL_CLOSE:
1186
13.0k
    setTopLevel(state);
1187
13.0k
    return state->role_none;
1188
14.6k
  }
1189
26
  return common(state, tok);
1190
14.6k
}
1191
1192
/* This function will only be invoked if the internal logic of the
1193
 * parser has broken down.  It is used in two cases:
1194
 *
1195
 * 1: When the XML prolog has been finished.  At this point the
1196
 * processor (the parser level above these role handlers) should
1197
 * switch from prologProcessor to contentProcessor and reinitialise
1198
 * the handler function.
1199
 *
1200
 * 2: When an error has been detected (via common() below).  At this
1201
 * point again the processor should be switched to errorProcessor,
1202
 * which will never call a handler.
1203
 *
1204
 * The result of this is that error() can only be called if the
1205
 * processor switch failed to happen, which is an internal error and
1206
 * therefore we shouldn't be able to provoke it simply by using the
1207
 * library.  It is a necessary backstop, however, so we merely exclude
1208
 * it from the coverage statistics.
1209
 *
1210
 * LCOV_EXCL_START
1211
 */
1212
static int PTRCALL
1213
error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1214
0
      const ENCODING *enc) {
1215
0
  UNUSED_P(state);
1216
0
  UNUSED_P(tok);
1217
0
  UNUSED_P(ptr);
1218
0
  UNUSED_P(end);
1219
0
  UNUSED_P(enc);
1220
0
  return XML_ROLE_NONE;
1221
0
}
1222
/* LCOV_EXCL_STOP */
1223
1224
static int FASTCALL
1225
417
common(PROLOG_STATE *state, int tok) {
1226
#ifdef XML_DTD
1227
  if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1228
    return XML_ROLE_INNER_PARAM_ENTITY_REF;
1229
#else
1230
417
  UNUSED_P(tok);
1231
417
#endif
1232
417
  state->handler = error;
1233
417
  return XML_ROLE_ERROR;
1234
417
}
1235
1236
void
1237
6.00k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
6.00k
  state->handler = prolog0;
1239
#ifdef XML_DTD
1240
  state->documentEntity = 1;
1241
  state->includeLevel = 0;
1242
  state->inEntityValue = 0;
1243
#endif /* XML_DTD */
1244
6.00k
}
1245
1246
#ifdef XML_DTD
1247
1248
void
1249
XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
1250
  state->handler = externalSubset0;
1251
  state->documentEntity = 0;
1252
  state->includeLevel = 0;
1253
}
1254
1255
#endif /* XML_DTD */