Coverage Report

Created: 2025-12-05 06:47

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