Coverage Report

Created: 2026-01-10 06:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmlrole.c
Line
Count
Source
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
58.4k
#  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
6.79k
        const ENCODING *enc) {
143
6.79k
  switch (tok) {
144
122
  case XML_TOK_PROLOG_S:
145
122
    state->handler = prolog1;
146
122
    return XML_ROLE_NONE;
147
995
  case XML_TOK_XML_DECL:
148
995
    state->handler = prolog1;
149
995
    return XML_ROLE_XML_DECL;
150
159
  case XML_TOK_PI:
151
159
    state->handler = prolog1;
152
159
    return XML_ROLE_PI;
153
48
  case XML_TOK_COMMENT:
154
48
    state->handler = prolog1;
155
48
    return XML_ROLE_COMMENT;
156
217
  case XML_TOK_BOM:
157
217
    return XML_ROLE_NONE;
158
2.39k
  case XML_TOK_DECL_OPEN:
159
2.39k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160
2.39k
                              KW_DOCTYPE))
161
14
      break;
162
2.37k
    state->handler = doctype0;
163
2.37k
    return XML_ROLE_DOCTYPE_NONE;
164
2.70k
  case XML_TOK_INSTANCE_START:
165
2.70k
    state->handler = error;
166
2.70k
    return XML_ROLE_INSTANCE_START;
167
6.79k
  }
168
177
  return common(state, tok);
169
6.79k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
7.18k
        const ENCODING *enc) {
174
7.18k
  switch (tok) {
175
2.13k
  case XML_TOK_PROLOG_S:
176
2.13k
    return XML_ROLE_NONE;
177
3.41k
  case XML_TOK_PI:
178
3.41k
    return XML_ROLE_PI;
179
730
  case XML_TOK_COMMENT:
180
730
    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
394
  case XML_TOK_DECL_OPEN:
191
394
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
394
                              KW_DOCTYPE))
193
4
      break;
194
390
    state->handler = doctype0;
195
390
    return XML_ROLE_DOCTYPE_NONE;
196
507
  case XML_TOK_INSTANCE_START:
197
507
    state->handler = error;
198
507
    return XML_ROLE_INSTANCE_START;
199
7.18k
  }
200
11
  return common(state, tok);
201
7.18k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
6.25k
        const ENCODING *enc) {
206
6.25k
  UNUSED_P(ptr);
207
6.25k
  UNUSED_P(end);
208
6.25k
  UNUSED_P(enc);
209
6.25k
  switch (tok) {
210
1.70k
  case XML_TOK_PROLOG_S:
211
1.70k
    return XML_ROLE_NONE;
212
2.46k
  case XML_TOK_PI:
213
2.46k
    return XML_ROLE_PI;
214
593
  case XML_TOK_COMMENT:
215
593
    return XML_ROLE_COMMENT;
216
1.47k
  case XML_TOK_INSTANCE_START:
217
1.47k
    state->handler = error;
218
1.47k
    return XML_ROLE_INSTANCE_START;
219
6.25k
  }
220
8
  return common(state, tok);
221
6.25k
}
222
223
static int PTRCALL
224
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225
5.52k
         const ENCODING *enc) {
226
5.52k
  UNUSED_P(ptr);
227
5.52k
  UNUSED_P(end);
228
5.52k
  UNUSED_P(enc);
229
5.52k
  switch (tok) {
230
2.76k
  case XML_TOK_PROLOG_S:
231
2.76k
    return XML_ROLE_DOCTYPE_NONE;
232
2.75k
  case XML_TOK_NAME:
233
2.75k
  case XML_TOK_PREFIXED_NAME:
234
2.75k
    state->handler = doctype1;
235
2.75k
    return XML_ROLE_DOCTYPE_NAME;
236
5.52k
  }
237
5
  return common(state, tok);
238
5.52k
}
239
240
static int PTRCALL
241
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242
3.52k
         const ENCODING *enc) {
243
3.52k
  switch (tok) {
244
777
  case XML_TOK_PROLOG_S:
245
777
    return XML_ROLE_DOCTYPE_NONE;
246
1.94k
  case XML_TOK_OPEN_BRACKET:
247
1.94k
    state->handler = internalSubset;
248
1.94k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
35
  case XML_TOK_DECL_CLOSE:
250
35
    state->handler = prolog2;
251
35
    return XML_ROLE_DOCTYPE_CLOSE;
252
767
  case XML_TOK_NAME:
253
767
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
15
      state->handler = doctype3;
255
15
      return XML_ROLE_DOCTYPE_NONE;
256
15
    }
257
752
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
747
      state->handler = doctype2;
259
747
      return XML_ROLE_DOCTYPE_NONE;
260
747
    }
261
5
    break;
262
3.52k
  }
263
9
  return common(state, tok);
264
3.52k
}
265
266
static int PTRCALL
267
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268
1.48k
         const ENCODING *enc) {
269
1.48k
  UNUSED_P(ptr);
270
1.48k
  UNUSED_P(end);
271
1.48k
  UNUSED_P(enc);
272
1.48k
  switch (tok) {
273
746
  case XML_TOK_PROLOG_S:
274
746
    return XML_ROLE_DOCTYPE_NONE;
275
740
  case XML_TOK_LITERAL:
276
740
    state->handler = doctype3;
277
740
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
278
1.48k
  }
279
3
  return common(state, tok);
280
1.48k
}
281
282
static int PTRCALL
283
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284
1.34k
         const ENCODING *enc) {
285
1.34k
  UNUSED_P(ptr);
286
1.34k
  UNUSED_P(end);
287
1.34k
  UNUSED_P(enc);
288
1.34k
  switch (tok) {
289
676
  case XML_TOK_PROLOG_S:
290
676
    return XML_ROLE_DOCTYPE_NONE;
291
653
  case XML_TOK_LITERAL:
292
653
    state->handler = doctype4;
293
653
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
1.34k
  }
295
15
  return common(state, tok);
296
1.34k
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
674
         const ENCODING *enc) {
301
674
  UNUSED_P(ptr);
302
674
  UNUSED_P(end);
303
674
  UNUSED_P(enc);
304
674
  switch (tok) {
305
26
  case XML_TOK_PROLOG_S:
306
26
    return XML_ROLE_DOCTYPE_NONE;
307
307
  case XML_TOK_OPEN_BRACKET:
308
307
    state->handler = internalSubset;
309
307
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
337
  case XML_TOK_DECL_CLOSE:
311
337
    state->handler = prolog2;
312
337
    return XML_ROLE_DOCTYPE_CLOSE;
313
674
  }
314
4
  return common(state, tok);
315
674
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
1.20k
         const ENCODING *enc) {
320
1.20k
  UNUSED_P(ptr);
321
1.20k
  UNUSED_P(end);
322
1.20k
  UNUSED_P(enc);
323
1.20k
  switch (tok) {
324
54
  case XML_TOK_PROLOG_S:
325
54
    return XML_ROLE_DOCTYPE_NONE;
326
1.14k
  case XML_TOK_DECL_CLOSE:
327
1.14k
    state->handler = prolog2;
328
1.14k
    return XML_ROLE_DOCTYPE_CLOSE;
329
1.20k
  }
330
4
  return common(state, tok);
331
1.20k
}
332
333
static int PTRCALL
334
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335
157k
               const ENCODING *enc) {
336
157k
  switch (tok) {
337
16.0k
  case XML_TOK_PROLOG_S:
338
16.0k
    return XML_ROLE_NONE;
339
59.4k
  case XML_TOK_DECL_OPEN:
340
59.4k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
59.4k
                            KW_ENTITY)) {
342
13.4k
      state->handler = entity0;
343
13.4k
      return XML_ROLE_ENTITY_NONE;
344
13.4k
    }
345
45.9k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
45.9k
                            KW_ATTLIST)) {
347
41.4k
      state->handler = attlist0;
348
41.4k
      return XML_ROLE_ATTLIST_NONE;
349
41.4k
    }
350
4.48k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.48k
                            KW_ELEMENT)) {
352
3.53k
      state->handler = element0;
353
3.53k
      return XML_ROLE_ELEMENT_NONE;
354
3.53k
    }
355
956
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
956
                            KW_NOTATION)) {
357
939
      state->handler = notation0;
358
939
      return XML_ROLE_NOTATION_NONE;
359
939
    }
360
17
    break;
361
245
  case XML_TOK_PI:
362
245
    return XML_ROLE_PI;
363
302
  case XML_TOK_COMMENT:
364
302
    return XML_ROLE_COMMENT;
365
80.1k
  case XML_TOK_PARAM_ENTITY_REF:
366
80.1k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.15k
  case XML_TOK_CLOSE_BRACKET:
368
1.15k
    state->handler = doctype5;
369
1.15k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
157k
  }
373
40
  return common(state, tok);
374
157k
}
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
26.9k
        const ENCODING *enc) {
418
26.9k
  UNUSED_P(ptr);
419
26.9k
  UNUSED_P(end);
420
26.9k
  UNUSED_P(enc);
421
26.9k
  switch (tok) {
422
13.4k
  case XML_TOK_PROLOG_S:
423
13.4k
    return XML_ROLE_ENTITY_NONE;
424
1.60k
  case XML_TOK_PERCENT:
425
1.60k
    state->handler = entity1;
426
1.60k
    return XML_ROLE_ENTITY_NONE;
427
11.8k
  case XML_TOK_NAME:
428
11.8k
    state->handler = entity2;
429
11.8k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
26.9k
  }
431
2
  return common(state, tok);
432
26.9k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
3.20k
        const ENCODING *enc) {
437
3.20k
  UNUSED_P(ptr);
438
3.20k
  UNUSED_P(end);
439
3.20k
  UNUSED_P(enc);
440
3.20k
  switch (tok) {
441
1.60k
  case XML_TOK_PROLOG_S:
442
1.60k
    return XML_ROLE_ENTITY_NONE;
443
1.59k
  case XML_TOK_NAME:
444
1.59k
    state->handler = entity7;
445
1.59k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
3.20k
  }
447
9
  return common(state, tok);
448
3.20k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
23.6k
        const ENCODING *enc) {
453
23.6k
  switch (tok) {
454
11.8k
  case XML_TOK_PROLOG_S:
455
11.8k
    return XML_ROLE_ENTITY_NONE;
456
1.85k
  case XML_TOK_NAME:
457
1.85k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
889
      state->handler = entity4;
459
889
      return XML_ROLE_ENTITY_NONE;
460
889
    }
461
967
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
965
      state->handler = entity3;
463
965
      return XML_ROLE_ENTITY_NONE;
464
965
    }
465
2
    break;
466
9.96k
  case XML_TOK_LITERAL:
467
9.96k
    state->handler = declClose;
468
9.96k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
9.96k
    return XML_ROLE_ENTITY_VALUE;
470
23.6k
  }
471
5
  return common(state, tok);
472
23.6k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
1.92k
        const ENCODING *enc) {
477
1.92k
  UNUSED_P(ptr);
478
1.92k
  UNUSED_P(end);
479
1.92k
  UNUSED_P(enc);
480
1.92k
  switch (tok) {
481
966
  case XML_TOK_PROLOG_S:
482
966
    return XML_ROLE_ENTITY_NONE;
483
960
  case XML_TOK_LITERAL:
484
960
    state->handler = entity4;
485
960
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
1.92k
  }
487
1
  return common(state, tok);
488
1.92k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
3.61k
        const ENCODING *enc) {
493
3.61k
  UNUSED_P(ptr);
494
3.61k
  UNUSED_P(end);
495
3.61k
  UNUSED_P(enc);
496
3.61k
  switch (tok) {
497
1.81k
  case XML_TOK_PROLOG_S:
498
1.81k
    return XML_ROLE_ENTITY_NONE;
499
1.79k
  case XML_TOK_LITERAL:
500
1.79k
    state->handler = entity5;
501
1.79k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
3.61k
  }
503
4
  return common(state, tok);
504
3.61k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
2.42k
        const ENCODING *enc) {
509
2.42k
  switch (tok) {
510
638
  case XML_TOK_PROLOG_S:
511
638
    return XML_ROLE_ENTITY_NONE;
512
1.19k
  case XML_TOK_DECL_CLOSE:
513
1.19k
    setTopLevel(state);
514
1.19k
    return XML_ROLE_ENTITY_COMPLETE;
515
588
  case XML_TOK_NAME:
516
588
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
586
      state->handler = entity6;
518
586
      return XML_ROLE_ENTITY_NONE;
519
586
    }
520
2
    break;
521
2.42k
  }
522
4
  return common(state, tok);
523
2.42k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
1.16k
        const ENCODING *enc) {
528
1.16k
  UNUSED_P(ptr);
529
1.16k
  UNUSED_P(end);
530
1.16k
  UNUSED_P(enc);
531
1.16k
  switch (tok) {
532
583
  case XML_TOK_PROLOG_S:
533
583
    return XML_ROLE_ENTITY_NONE;
534
580
  case XML_TOK_NAME:
535
580
    state->handler = declClose;
536
580
    state->role_none = XML_ROLE_ENTITY_NONE;
537
580
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
1.16k
  }
539
1
  return common(state, tok);
540
1.16k
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
3.17k
        const ENCODING *enc) {
545
3.17k
  switch (tok) {
546
1.59k
  case XML_TOK_PROLOG_S:
547
1.59k
    return XML_ROLE_ENTITY_NONE;
548
925
  case XML_TOK_NAME:
549
925
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
372
      state->handler = entity9;
551
372
      return XML_ROLE_ENTITY_NONE;
552
372
    }
553
553
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
552
      state->handler = entity8;
555
552
      return XML_ROLE_ENTITY_NONE;
556
552
    }
557
1
    break;
558
658
  case XML_TOK_LITERAL:
559
658
    state->handler = declClose;
560
658
    state->role_none = XML_ROLE_ENTITY_NONE;
561
658
    return XML_ROLE_ENTITY_VALUE;
562
3.17k
  }
563
4
  return common(state, tok);
564
3.17k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
1.09k
        const ENCODING *enc) {
569
1.09k
  UNUSED_P(ptr);
570
1.09k
  UNUSED_P(end);
571
1.09k
  UNUSED_P(enc);
572
1.09k
  switch (tok) {
573
549
  case XML_TOK_PROLOG_S:
574
549
    return XML_ROLE_ENTITY_NONE;
575
540
  case XML_TOK_LITERAL:
576
540
    state->handler = entity9;
577
540
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
1.09k
  }
579
1
  return common(state, tok);
580
1.09k
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
1.80k
        const ENCODING *enc) {
585
1.80k
  UNUSED_P(ptr);
586
1.80k
  UNUSED_P(end);
587
1.80k
  UNUSED_P(enc);
588
1.80k
  switch (tok) {
589
903
  case XML_TOK_PROLOG_S:
590
903
    return XML_ROLE_ENTITY_NONE;
591
897
  case XML_TOK_LITERAL:
592
897
    state->handler = entity10;
593
897
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
1.80k
  }
595
2
  return common(state, tok);
596
1.80k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
1.18k
         const ENCODING *enc) {
601
1.18k
  UNUSED_P(ptr);
602
1.18k
  UNUSED_P(end);
603
1.18k
  UNUSED_P(enc);
604
1.18k
  switch (tok) {
605
294
  case XML_TOK_PROLOG_S:
606
294
    return XML_ROLE_ENTITY_NONE;
607
887
  case XML_TOK_DECL_CLOSE:
608
887
    setTopLevel(state);
609
887
    return XML_ROLE_ENTITY_COMPLETE;
610
1.18k
  }
611
2
  return common(state, tok);
612
1.18k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
1.86k
          const ENCODING *enc) {
617
1.86k
  UNUSED_P(ptr);
618
1.86k
  UNUSED_P(end);
619
1.86k
  UNUSED_P(enc);
620
1.86k
  switch (tok) {
621
943
  case XML_TOK_PROLOG_S:
622
943
    return XML_ROLE_NOTATION_NONE;
623
922
  case XML_TOK_NAME:
624
922
    state->handler = notation1;
625
922
    return XML_ROLE_NOTATION_NAME;
626
1.86k
  }
627
1
  return common(state, tok);
628
1.86k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
1.83k
          const ENCODING *enc) {
633
1.83k
  switch (tok) {
634
921
  case XML_TOK_PROLOG_S:
635
921
    return XML_ROLE_NOTATION_NONE;
636
912
  case XML_TOK_NAME:
637
912
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
356
      state->handler = notation3;
639
356
      return XML_ROLE_NOTATION_NONE;
640
356
    }
641
556
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
552
      state->handler = notation2;
643
552
      return XML_ROLE_NOTATION_NONE;
644
552
    }
645
4
    break;
646
1.83k
  }
647
5
  return common(state, tok);
648
1.83k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.08k
          const ENCODING *enc) {
653
1.08k
  UNUSED_P(ptr);
654
1.08k
  UNUSED_P(end);
655
1.08k
  UNUSED_P(enc);
656
1.08k
  switch (tok) {
657
546
  case XML_TOK_PROLOG_S:
658
546
    return XML_ROLE_NOTATION_NONE;
659
537
  case XML_TOK_LITERAL:
660
537
    state->handler = notation4;
661
537
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.08k
  }
663
2
  return common(state, tok);
664
1.08k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
710
          const ENCODING *enc) {
669
710
  UNUSED_P(ptr);
670
710
  UNUSED_P(end);
671
710
  UNUSED_P(enc);
672
710
  switch (tok) {
673
363
  case XML_TOK_PROLOG_S:
674
363
    return XML_ROLE_NOTATION_NONE;
675
346
  case XML_TOK_LITERAL:
676
346
    state->handler = declClose;
677
346
    state->role_none = XML_ROLE_NOTATION_NONE;
678
346
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
710
  }
680
1
  return common(state, tok);
681
710
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
876
          const ENCODING *enc) {
686
876
  UNUSED_P(ptr);
687
876
  UNUSED_P(end);
688
876
  UNUSED_P(enc);
689
876
  switch (tok) {
690
345
  case XML_TOK_PROLOG_S:
691
345
    return XML_ROLE_NOTATION_NONE;
692
280
  case XML_TOK_LITERAL:
693
280
    state->handler = declClose;
694
280
    state->role_none = XML_ROLE_NOTATION_NONE;
695
280
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
248
  case XML_TOK_DECL_CLOSE:
697
248
    setTopLevel(state);
698
248
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
876
  }
700
3
  return common(state, tok);
701
876
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
82.9k
         const ENCODING *enc) {
706
82.9k
  UNUSED_P(ptr);
707
82.9k
  UNUSED_P(end);
708
82.9k
  UNUSED_P(enc);
709
82.9k
  switch (tok) {
710
41.4k
  case XML_TOK_PROLOG_S:
711
41.4k
    return XML_ROLE_ATTLIST_NONE;
712
41.4k
  case XML_TOK_NAME:
713
41.4k
  case XML_TOK_PREFIXED_NAME:
714
41.4k
    state->handler = attlist1;
715
41.4k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
82.9k
  }
717
1
  return common(state, tok);
718
82.9k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
356k
         const ENCODING *enc) {
723
356k
  UNUSED_P(ptr);
724
356k
  UNUSED_P(end);
725
356k
  UNUSED_P(enc);
726
356k
  switch (tok) {
727
157k
  case XML_TOK_PROLOG_S:
728
157k
    return XML_ROLE_ATTLIST_NONE;
729
41.1k
  case XML_TOK_DECL_CLOSE:
730
41.1k
    setTopLevel(state);
731
41.1k
    return XML_ROLE_ATTLIST_NONE;
732
157k
  case XML_TOK_NAME:
733
157k
  case XML_TOK_PREFIXED_NAME:
734
157k
    state->handler = attlist2;
735
157k
    return XML_ROLE_ATTRIBUTE_NAME;
736
356k
  }
737
10
  return common(state, tok);
738
356k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
315k
         const ENCODING *enc) {
743
315k
  switch (tok) {
744
157k
  case XML_TOK_PROLOG_S:
745
157k
    return XML_ROLE_ATTLIST_NONE;
746
44.1k
  case XML_TOK_NAME: {
747
44.1k
    static const char *const types[] = {
748
44.1k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
44.1k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
44.1k
    };
751
44.1k
    int i;
752
135k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
135k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
43.7k
        state->handler = attlist8;
755
43.7k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
43.7k
      }
757
44.1k
  }
758
358
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
347
      state->handler = attlist5;
760
347
      return XML_ROLE_ATTLIST_NONE;
761
347
    }
762
11
    break;
763
113k
  case XML_TOK_OPEN_PAREN:
764
113k
    state->handler = attlist3;
765
113k
    return XML_ROLE_ATTLIST_NONE;
766
315k
  }
767
14
  return common(state, tok);
768
315k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
170k
         const ENCODING *enc) {
773
170k
  UNUSED_P(ptr);
774
170k
  UNUSED_P(end);
775
170k
  UNUSED_P(enc);
776
170k
  switch (tok) {
777
11.6k
  case XML_TOK_PROLOG_S:
778
11.6k
    return XML_ROLE_ATTLIST_NONE;
779
34.7k
  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
170k
  }
785
3
  return common(state, tok);
786
170k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
164k
         const ENCODING *enc) {
791
164k
  UNUSED_P(ptr);
792
164k
  UNUSED_P(end);
793
164k
  UNUSED_P(enc);
794
164k
  switch (tok) {
795
5.36k
  case XML_TOK_PROLOG_S:
796
5.36k
    return XML_ROLE_ATTLIST_NONE;
797
113k
  case XML_TOK_CLOSE_PAREN:
798
113k
    state->handler = attlist8;
799
113k
    return XML_ROLE_ATTLIST_NONE;
800
45.4k
  case XML_TOK_OR:
801
45.4k
    state->handler = attlist3;
802
45.4k
    return XML_ROLE_ATTLIST_NONE;
803
164k
  }
804
7
  return common(state, tok);
805
164k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
682
         const ENCODING *enc) {
810
682
  UNUSED_P(ptr);
811
682
  UNUSED_P(end);
812
682
  UNUSED_P(enc);
813
682
  switch (tok) {
814
345
  case XML_TOK_PROLOG_S:
815
345
    return XML_ROLE_ATTLIST_NONE;
816
336
  case XML_TOK_OPEN_PAREN:
817
336
    state->handler = attlist6;
818
336
    return XML_ROLE_ATTLIST_NONE;
819
682
  }
820
1
  return common(state, tok);
821
682
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.15k
         const ENCODING *enc) {
826
1.15k
  UNUSED_P(ptr);
827
1.15k
  UNUSED_P(end);
828
1.15k
  UNUSED_P(enc);
829
1.15k
  switch (tok) {
830
270
  case XML_TOK_PROLOG_S:
831
270
    return XML_ROLE_ATTLIST_NONE;
832
880
  case XML_TOK_NAME:
833
880
    state->handler = attlist7;
834
880
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.15k
  }
836
4
  return common(state, tok);
837
1.15k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.18k
         const ENCODING *enc) {
842
1.18k
  UNUSED_P(ptr);
843
1.18k
  UNUSED_P(end);
844
1.18k
  UNUSED_P(enc);
845
1.18k
  switch (tok) {
846
310
  case XML_TOK_PROLOG_S:
847
310
    return XML_ROLE_ATTLIST_NONE;
848
309
  case XML_TOK_CLOSE_PAREN:
849
309
    state->handler = attlist8;
850
309
    return XML_ROLE_ATTLIST_NONE;
851
562
  case XML_TOK_OR:
852
562
    state->handler = attlist6;
853
562
    return XML_ROLE_ATTLIST_NONE;
854
1.18k
  }
855
2
  return common(state, tok);
856
1.18k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
315k
         const ENCODING *enc) {
862
315k
  switch (tok) {
863
157k
  case XML_TOK_PROLOG_S:
864
157k
    return XML_ROLE_ATTLIST_NONE;
865
120k
  case XML_TOK_POUND_NAME:
866
120k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
120k
                            KW_IMPLIED)) {
868
119k
      state->handler = attlist1;
869
119k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
119k
    }
871
304
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
304
                            KW_REQUIRED)) {
873
50
      state->handler = attlist1;
874
50
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
50
    }
876
254
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
254
                            KW_FIXED)) {
878
243
      state->handler = attlist9;
879
243
      return XML_ROLE_ATTLIST_NONE;
880
243
    }
881
11
    break;
882
37.3k
  case XML_TOK_LITERAL:
883
37.3k
    state->handler = attlist1;
884
37.3k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
315k
  }
886
13
  return common(state, tok);
887
315k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
475
         const ENCODING *enc) {
892
475
  UNUSED_P(ptr);
893
475
  UNUSED_P(end);
894
475
  UNUSED_P(enc);
895
475
  switch (tok) {
896
241
  case XML_TOK_PROLOG_S:
897
241
    return XML_ROLE_ATTLIST_NONE;
898
230
  case XML_TOK_LITERAL:
899
230
    state->handler = attlist1;
900
230
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
475
  }
902
4
  return common(state, tok);
903
475
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
7.05k
         const ENCODING *enc) {
908
7.05k
  UNUSED_P(ptr);
909
7.05k
  UNUSED_P(end);
910
7.05k
  UNUSED_P(enc);
911
7.05k
  switch (tok) {
912
3.52k
  case XML_TOK_PROLOG_S:
913
3.52k
    return XML_ROLE_ELEMENT_NONE;
914
3.51k
  case XML_TOK_NAME:
915
3.51k
  case XML_TOK_PREFIXED_NAME:
916
3.51k
    state->handler = element1;
917
3.51k
    return XML_ROLE_ELEMENT_NAME;
918
7.05k
  }
919
6
  return common(state, tok);
920
7.05k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
7.02k
         const ENCODING *enc) {
925
7.02k
  switch (tok) {
926
3.51k
  case XML_TOK_PROLOG_S:
927
3.51k
    return XML_ROLE_ELEMENT_NONE;
928
215
  case XML_TOK_NAME:
929
215
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
75
      state->handler = declClose;
931
75
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
75
      return XML_ROLE_CONTENT_EMPTY;
933
75
    }
934
140
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
138
      state->handler = declClose;
936
138
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
138
      return XML_ROLE_CONTENT_ANY;
938
138
    }
939
2
    break;
940
3.29k
  case XML_TOK_OPEN_PAREN:
941
3.29k
    state->handler = element2;
942
3.29k
    state->level = 1;
943
3.29k
    return XML_ROLE_GROUP_OPEN;
944
7.02k
  }
945
3
  return common(state, tok);
946
7.02k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
3.52k
         const ENCODING *enc) {
951
3.52k
  switch (tok) {
952
242
  case XML_TOK_PROLOG_S:
953
242
    return XML_ROLE_ELEMENT_NONE;
954
1.78k
  case XML_TOK_POUND_NAME:
955
1.78k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
1.78k
                            KW_PCDATA)) {
957
1.78k
      state->handler = element3;
958
1.78k
      return XML_ROLE_CONTENT_PCDATA;
959
1.78k
    }
960
3
    break;
961
649
  case XML_TOK_OPEN_PAREN:
962
649
    state->level = 2;
963
649
    state->handler = element6;
964
649
    return XML_ROLE_GROUP_OPEN;
965
457
  case XML_TOK_NAME:
966
457
  case XML_TOK_PREFIXED_NAME:
967
457
    state->handler = element7;
968
457
    return XML_ROLE_CONTENT_ELEMENT;
969
46
  case XML_TOK_NAME_QUESTION:
970
46
    state->handler = element7;
971
46
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
291
  case XML_TOK_NAME_ASTERISK:
973
291
    state->handler = element7;
974
291
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
55
  case XML_TOK_NAME_PLUS:
976
55
    state->handler = element7;
977
55
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
3.52k
  }
979
4
  return common(state, tok);
980
3.52k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
2.52k
         const ENCODING *enc) {
985
2.52k
  UNUSED_P(ptr);
986
2.52k
  UNUSED_P(end);
987
2.52k
  UNUSED_P(enc);
988
2.52k
  switch (tok) {
989
747
  case XML_TOK_PROLOG_S:
990
747
    return XML_ROLE_ELEMENT_NONE;
991
385
  case XML_TOK_CLOSE_PAREN:
992
385
    state->handler = declClose;
993
385
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
385
    return XML_ROLE_GROUP_CLOSE;
995
512
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
512
    state->handler = declClose;
997
512
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
512
    return XML_ROLE_GROUP_CLOSE_REP;
999
874
  case XML_TOK_OR:
1000
874
    state->handler = element4;
1001
874
    return XML_ROLE_ELEMENT_NONE;
1002
2.52k
  }
1003
4
  return common(state, tok);
1004
2.52k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
2.22k
         const ENCODING *enc) {
1009
2.22k
  UNUSED_P(ptr);
1010
2.22k
  UNUSED_P(end);
1011
2.22k
  UNUSED_P(enc);
1012
2.22k
  switch (tok) {
1013
348
  case XML_TOK_PROLOG_S:
1014
348
    return XML_ROLE_ELEMENT_NONE;
1015
1.87k
  case XML_TOK_NAME:
1016
1.87k
  case XML_TOK_PREFIXED_NAME:
1017
1.87k
    state->handler = element5;
1018
1.87k
    return XML_ROLE_CONTENT_ELEMENT;
1019
2.22k
  }
1020
8
  return common(state, tok);
1021
2.22k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
2.55k
         const ENCODING *enc) {
1026
2.55k
  UNUSED_P(ptr);
1027
2.55k
  UNUSED_P(end);
1028
2.55k
  UNUSED_P(enc);
1029
2.55k
  switch (tok) {
1030
693
  case XML_TOK_PROLOG_S:
1031
693
    return XML_ROLE_ELEMENT_NONE;
1032
837
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
837
    state->handler = declClose;
1034
837
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
837
    return XML_ROLE_GROUP_CLOSE_REP;
1036
1.02k
  case XML_TOK_OR:
1037
1.02k
    state->handler = element4;
1038
1.02k
    return XML_ROLE_ELEMENT_NONE;
1039
2.55k
  }
1040
1
  return common(state, tok);
1041
2.55k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
2.27M
         const ENCODING *enc) {
1046
2.27M
  UNUSED_P(ptr);
1047
2.27M
  UNUSED_P(end);
1048
2.27M
  UNUSED_P(enc);
1049
2.27M
  switch (tok) {
1050
1.12k
  case XML_TOK_PROLOG_S:
1051
1.12k
    return XML_ROLE_ELEMENT_NONE;
1052
2.26M
  case XML_TOK_OPEN_PAREN:
1053
2.26M
    state->level += 1;
1054
2.26M
    return XML_ROLE_GROUP_OPEN;
1055
6.23k
  case XML_TOK_NAME:
1056
6.23k
  case XML_TOK_PREFIXED_NAME:
1057
6.23k
    state->handler = element7;
1058
6.23k
    return XML_ROLE_CONTENT_ELEMENT;
1059
629
  case XML_TOK_NAME_QUESTION:
1060
629
    state->handler = element7;
1061
629
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
873
  case XML_TOK_NAME_ASTERISK:
1063
873
    state->handler = element7;
1064
873
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
327
  case XML_TOK_NAME_PLUS:
1066
327
    state->handler = element7;
1067
327
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
2.27M
  }
1069
8
  return common(state, tok);
1070
2.27M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
21.5k
         const ENCODING *enc) {
1075
21.5k
  UNUSED_P(ptr);
1076
21.5k
  UNUSED_P(end);
1077
21.5k
  UNUSED_P(enc);
1078
21.5k
  switch (tok) {
1079
1.22k
  case XML_TOK_PROLOG_S:
1080
1.22k
    return XML_ROLE_ELEMENT_NONE;
1081
8.67k
  case XML_TOK_CLOSE_PAREN:
1082
8.67k
    state->level -= 1;
1083
8.67k
    if (state->level == 0) {
1084
814
      state->handler = declClose;
1085
814
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
814
    }
1087
8.67k
    return XML_ROLE_GROUP_CLOSE;
1088
1.67k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
1.67k
    state->level -= 1;
1090
1.67k
    if (state->level == 0) {
1091
127
      state->handler = declClose;
1092
127
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
127
    }
1094
1.67k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
525
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
525
    state->level -= 1;
1097
525
    if (state->level == 0) {
1098
59
      state->handler = declClose;
1099
59
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
59
    }
1101
525
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
2.00k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
2.00k
    state->level -= 1;
1104
2.00k
    if (state->level == 0) {
1105
352
      state->handler = declClose;
1106
352
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
352
    }
1108
2.00k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
1.40k
  case XML_TOK_COMMA:
1110
1.40k
    state->handler = element6;
1111
1.40k
    return XML_ROLE_GROUP_SEQUENCE;
1112
6.08k
  case XML_TOK_OR:
1113
6.08k
    state->handler = element6;
1114
6.08k
    return XML_ROLE_GROUP_CHOICE;
1115
21.5k
  }
1116
3
  return common(state, tok);
1117
21.5k
}
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
16.6k
          const ENCODING *enc) {
1179
16.6k
  UNUSED_P(ptr);
1180
16.6k
  UNUSED_P(end);
1181
16.6k
  UNUSED_P(enc);
1182
16.6k
  switch (tok) {
1183
1.66k
  case XML_TOK_PROLOG_S:
1184
1.66k
    return state->role_none;
1185
15.0k
  case XML_TOK_DECL_CLOSE:
1186
15.0k
    setTopLevel(state);
1187
15.0k
    return state->role_none;
1188
16.6k
  }
1189
23
  return common(state, tok);
1190
16.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
442
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
442
  UNUSED_P(tok);
1231
442
#endif
1232
442
  state->handler = error;
1233
442
  return XML_ROLE_ERROR;
1234
442
}
1235
1236
void
1237
7.27k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
7.27k
  state->handler = prolog0;
1239
#ifdef XML_DTD
1240
  state->documentEntity = 1;
1241
  state->includeLevel = 0;
1242
  state->inEntityValue = 0;
1243
#endif /* XML_DTD */
1244
7.27k
}
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 */