Coverage Report

Created: 2026-07-14 07:09

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