Coverage Report

Created: 2026-02-09 06:05

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