Coverage Report

Created: 2026-04-29 07:01

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
50.3k
#  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.52k
        const ENCODING *enc) {
143
8.52k
  switch (tok) {
144
157
  case XML_TOK_PROLOG_S:
145
157
    state->handler = prolog1;
146
157
    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
180
  case XML_TOK_PI:
151
180
    state->handler = prolog1;
152
180
    return XML_ROLE_PI;
153
73
  case XML_TOK_COMMENT:
154
73
    state->handler = prolog1;
155
73
    return XML_ROLE_COMMENT;
156
270
  case XML_TOK_BOM:
157
270
    return XML_ROLE_NONE;
158
2.85k
  case XML_TOK_DECL_OPEN:
159
2.85k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160
2.85k
                              KW_DOCTYPE))
161
15
      break;
162
2.83k
    state->handler = doctype0;
163
2.83k
    return XML_ROLE_DOCTYPE_NONE;
164
3.62k
  case XML_TOK_INSTANCE_START:
165
3.62k
    state->handler = error;
166
3.62k
    return XML_ROLE_INSTANCE_START;
167
8.52k
  }
168
262
  return common(state, tok);
169
8.52k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
6.11k
        const ENCODING *enc) {
174
6.11k
  switch (tok) {
175
822
  case XML_TOK_PROLOG_S:
176
822
    return XML_ROLE_NONE;
177
3.69k
  case XML_TOK_PI:
178
3.69k
    return XML_ROLE_PI;
179
590
  case XML_TOK_COMMENT:
180
590
    return XML_ROLE_COMMENT;
181
0
  case XML_TOK_BOM:
182
    /* This case can never arise.  To reach this role function, the
183
     * parse must have passed through prolog0 and therefore have had
184
     * some form of input, even if only a space.  At that point, a
185
     * byte order mark is no longer a valid character (though
186
     * technically it should be interpreted as a non-breaking space),
187
     * so will be rejected by the tokenizing stages.
188
     */
189
0
    return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
190
411
  case XML_TOK_DECL_OPEN:
191
411
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
411
                              KW_DOCTYPE))
193
2
      break;
194
409
    state->handler = doctype0;
195
409
    return XML_ROLE_DOCTYPE_NONE;
196
586
  case XML_TOK_INSTANCE_START:
197
586
    state->handler = error;
198
586
    return XML_ROLE_INSTANCE_START;
199
6.11k
  }
200
15
  return common(state, tok);
201
6.11k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
4.04k
        const ENCODING *enc) {
206
4.04k
  UNUSED_P(ptr);
207
4.04k
  UNUSED_P(end);
208
4.04k
  UNUSED_P(enc);
209
4.04k
  switch (tok) {
210
726
  case XML_TOK_PROLOG_S:
211
726
    return XML_ROLE_NONE;
212
1.67k
  case XML_TOK_PI:
213
1.67k
    return XML_ROLE_PI;
214
216
  case XML_TOK_COMMENT:
215
216
    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
4.04k
  }
220
12
  return common(state, tok);
221
4.04k
}
222
223
static int PTRCALL
224
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225
6.48k
         const ENCODING *enc) {
226
6.48k
  UNUSED_P(ptr);
227
6.48k
  UNUSED_P(end);
228
6.48k
  UNUSED_P(enc);
229
6.48k
  switch (tok) {
230
3.24k
  case XML_TOK_PROLOG_S:
231
3.24k
    return XML_ROLE_DOCTYPE_NONE;
232
3.23k
  case XML_TOK_NAME:
233
3.23k
  case XML_TOK_PREFIXED_NAME:
234
3.23k
    state->handler = doctype1;
235
3.23k
    return XML_ROLE_DOCTYPE_NAME;
236
6.48k
  }
237
4
  return common(state, tok);
238
6.48k
}
239
240
static int PTRCALL
241
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242
4.00k
         const ENCODING *enc) {
243
4.00k
  switch (tok) {
244
771
  case XML_TOK_PROLOG_S:
245
771
    return XML_ROLE_DOCTYPE_NONE;
246
2.43k
  case XML_TOK_OPEN_BRACKET:
247
2.43k
    state->handler = internalSubset;
248
2.43k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
36
  case XML_TOK_DECL_CLOSE:
250
36
    state->handler = prolog2;
251
36
    return XML_ROLE_DOCTYPE_CLOSE;
252
757
  case XML_TOK_NAME:
253
757
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
21
      state->handler = doctype3;
255
21
      return XML_ROLE_DOCTYPE_NONE;
256
21
    }
257
736
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
729
      state->handler = doctype2;
259
729
      return XML_ROLE_DOCTYPE_NONE;
260
729
    }
261
7
    break;
262
4.00k
  }
263
10
  return common(state, tok);
264
4.00k
}
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
729
  case XML_TOK_PROLOG_S:
274
729
    return XML_ROLE_DOCTYPE_NONE;
275
723
  case XML_TOK_LITERAL:
276
723
    state->handler = doctype3;
277
723
    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.21k
         const ENCODING *enc) {
285
1.21k
  UNUSED_P(ptr);
286
1.21k
  UNUSED_P(end);
287
1.21k
  UNUSED_P(enc);
288
1.21k
  switch (tok) {
289
605
  case XML_TOK_PROLOG_S:
290
605
    return XML_ROLE_DOCTYPE_NONE;
291
582
  case XML_TOK_LITERAL:
292
582
    state->handler = doctype4;
293
582
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
1.21k
  }
295
25
  return common(state, tok);
296
1.21k
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
604
         const ENCODING *enc) {
301
604
  UNUSED_P(ptr);
302
604
  UNUSED_P(end);
303
604
  UNUSED_P(enc);
304
604
  switch (tok) {
305
29
  case XML_TOK_PROLOG_S:
306
29
    return XML_ROLE_DOCTYPE_NONE;
307
239
  case XML_TOK_OPEN_BRACKET:
308
239
    state->handler = internalSubset;
309
239
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
332
  case XML_TOK_DECL_CLOSE:
311
332
    state->handler = prolog2;
312
332
    return XML_ROLE_DOCTYPE_CLOSE;
313
604
  }
314
4
  return common(state, tok);
315
604
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
1.16k
         const ENCODING *enc) {
320
1.16k
  UNUSED_P(ptr);
321
1.16k
  UNUSED_P(end);
322
1.16k
  UNUSED_P(enc);
323
1.16k
  switch (tok) {
324
63
  case XML_TOK_PROLOG_S:
325
63
    return XML_ROLE_DOCTYPE_NONE;
326
1.10k
  case XML_TOK_DECL_CLOSE:
327
1.10k
    state->handler = prolog2;
328
1.10k
    return XML_ROLE_DOCTYPE_CLOSE;
329
1.16k
  }
330
3
  return common(state, tok);
331
1.16k
}
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.3k
  case XML_TOK_PROLOG_S:
338
10.3k
    return XML_ROLE_NONE;
339
51.7k
  case XML_TOK_DECL_OPEN:
340
51.7k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
51.7k
                            KW_ENTITY)) {
342
9.77k
      state->handler = entity0;
343
9.77k
      return XML_ROLE_ENTITY_NONE;
344
9.77k
    }
345
41.9k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
41.9k
                            KW_ATTLIST)) {
347
37.1k
      state->handler = attlist0;
348
37.1k
      return XML_ROLE_ATTLIST_NONE;
349
37.1k
    }
350
4.78k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.78k
                            KW_ELEMENT)) {
352
3.51k
      state->handler = element0;
353
3.51k
      return XML_ROLE_ELEMENT_NONE;
354
3.51k
    }
355
1.27k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.27k
                            KW_NOTATION)) {
357
1.25k
      state->handler = notation0;
358
1.25k
      return XML_ROLE_NOTATION_NONE;
359
1.25k
    }
360
16
    break;
361
492
  case XML_TOK_PI:
362
492
    return XML_ROLE_PI;
363
195
  case XML_TOK_COMMENT:
364
195
    return XML_ROLE_COMMENT;
365
4.15k
  case XML_TOK_PARAM_ENTITY_REF:
366
4.15k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.11k
  case XML_TOK_CLOSE_BRACKET:
368
1.11k
    state->handler = doctype5;
369
1.11k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
68.0k
  }
373
47
  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
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.77k
  case XML_TOK_PROLOG_S:
423
9.77k
    return XML_ROLE_ENTITY_NONE;
424
1.75k
  case XML_TOK_PERCENT:
425
1.75k
    state->handler = entity1;
426
1.75k
    return XML_ROLE_ENTITY_NONE;
427
8.01k
  case XML_TOK_NAME:
428
8.01k
    state->handler = entity2;
429
8.01k
    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
3.49k
        const ENCODING *enc) {
437
3.49k
  UNUSED_P(ptr);
438
3.49k
  UNUSED_P(end);
439
3.49k
  UNUSED_P(enc);
440
3.49k
  switch (tok) {
441
1.75k
  case XML_TOK_PROLOG_S:
442
1.75k
    return XML_ROLE_ENTITY_NONE;
443
1.72k
  case XML_TOK_NAME:
444
1.72k
    state->handler = entity7;
445
1.72k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
3.49k
  }
447
8
  return common(state, tok);
448
3.49k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
15.9k
        const ENCODING *enc) {
453
15.9k
  switch (tok) {
454
7.99k
  case XML_TOK_PROLOG_S:
455
7.99k
    return XML_ROLE_ENTITY_NONE;
456
1.99k
  case XML_TOK_NAME:
457
1.99k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
975
      state->handler = entity4;
459
975
      return XML_ROLE_ENTITY_NONE;
460
975
    }
461
1.02k
    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
4
    break;
466
5.97k
  case XML_TOK_LITERAL:
467
5.97k
    state->handler = declClose;
468
5.97k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
5.97k
    return XML_ROLE_ENTITY_VALUE;
470
15.9k
  }
471
9
  return common(state, tok);
472
15.9k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
2.02k
        const ENCODING *enc) {
477
2.02k
  UNUSED_P(ptr);
478
2.02k
  UNUSED_P(end);
479
2.02k
  UNUSED_P(enc);
480
2.02k
  switch (tok) {
481
1.02k
  case XML_TOK_PROLOG_S:
482
1.02k
    return XML_ROLE_ENTITY_NONE;
483
1.00k
  case XML_TOK_LITERAL:
484
1.00k
    state->handler = entity4;
485
1.00k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
2.02k
  }
487
1
  return common(state, tok);
488
2.02k
}
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.93k
  case XML_TOK_PROLOG_S:
498
1.93k
    return XML_ROLE_ENTITY_NONE;
499
1.90k
  case XML_TOK_LITERAL:
500
1.90k
    state->handler = entity5;
501
1.90k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
3.84k
  }
503
8
  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.41k
        const ENCODING *enc) {
509
2.41k
  switch (tok) {
510
529
  case XML_TOK_PROLOG_S:
511
529
    return XML_ROLE_ENTITY_NONE;
512
1.42k
  case XML_TOK_DECL_CLOSE:
513
1.42k
    setTopLevel(state);
514
1.42k
    return XML_ROLE_ENTITY_COMPLETE;
515
460
  case XML_TOK_NAME:
516
460
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
458
      state->handler = entity6;
518
458
      return XML_ROLE_ENTITY_NONE;
519
458
    }
520
2
    break;
521
2.41k
  }
522
3
  return common(state, tok);
523
2.41k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
899
        const ENCODING *enc) {
528
899
  UNUSED_P(ptr);
529
899
  UNUSED_P(end);
530
899
  UNUSED_P(enc);
531
899
  switch (tok) {
532
452
  case XML_TOK_PROLOG_S:
533
452
    return XML_ROLE_ENTITY_NONE;
534
446
  case XML_TOK_NAME:
535
446
    state->handler = declClose;
536
446
    state->role_none = XML_ROLE_ENTITY_NONE;
537
446
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
899
  }
539
1
  return common(state, tok);
540
899
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
3.45k
        const ENCODING *enc) {
545
3.45k
  switch (tok) {
546
1.72k
  case XML_TOK_PROLOG_S:
547
1.72k
    return XML_ROLE_ENTITY_NONE;
548
1.06k
  case XML_TOK_NAME:
549
1.06k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
627
      state->handler = entity9;
551
627
      return XML_ROLE_ENTITY_NONE;
552
627
    }
553
438
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
437
      state->handler = entity8;
555
437
      return XML_ROLE_ENTITY_NONE;
556
437
    }
557
1
    break;
558
645
  case XML_TOK_LITERAL:
559
645
    state->handler = declClose;
560
645
    state->role_none = XML_ROLE_ENTITY_NONE;
561
645
    return XML_ROLE_ENTITY_VALUE;
562
3.45k
  }
563
12
  return common(state, tok);
564
3.45k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
860
        const ENCODING *enc) {
569
860
  UNUSED_P(ptr);
570
860
  UNUSED_P(end);
571
860
  UNUSED_P(enc);
572
860
  switch (tok) {
573
437
  case XML_TOK_PROLOG_S:
574
437
    return XML_ROLE_ENTITY_NONE;
575
422
  case XML_TOK_LITERAL:
576
422
    state->handler = entity9;
577
422
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
860
  }
579
1
  return common(state, tok);
580
860
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
2.06k
        const ENCODING *enc) {
585
2.06k
  UNUSED_P(ptr);
586
2.06k
  UNUSED_P(end);
587
2.06k
  UNUSED_P(enc);
588
2.06k
  switch (tok) {
589
1.04k
  case XML_TOK_PROLOG_S:
590
1.04k
    return XML_ROLE_ENTITY_NONE;
591
1.02k
  case XML_TOK_LITERAL:
592
1.02k
    state->handler = entity10;
593
1.02k
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
2.06k
  }
595
3
  return common(state, tok);
596
2.06k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
1.52k
         const ENCODING *enc) {
601
1.52k
  UNUSED_P(ptr);
602
1.52k
  UNUSED_P(end);
603
1.52k
  UNUSED_P(enc);
604
1.52k
  switch (tok) {
605
507
  case XML_TOK_PROLOG_S:
606
507
    return XML_ROLE_ENTITY_NONE;
607
1.01k
  case XML_TOK_DECL_CLOSE:
608
1.01k
    setTopLevel(state);
609
1.01k
    return XML_ROLE_ENTITY_COMPLETE;
610
1.52k
  }
611
2
  return common(state, tok);
612
1.52k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.49k
          const ENCODING *enc) {
617
2.49k
  UNUSED_P(ptr);
618
2.49k
  UNUSED_P(end);
619
2.49k
  UNUSED_P(enc);
620
2.49k
  switch (tok) {
621
1.26k
  case XML_TOK_PROLOG_S:
622
1.26k
    return XML_ROLE_NOTATION_NONE;
623
1.23k
  case XML_TOK_NAME:
624
1.23k
    state->handler = notation1;
625
1.23k
    return XML_ROLE_NOTATION_NAME;
626
2.49k
  }
627
2
  return common(state, tok);
628
2.49k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.46k
          const ENCODING *enc) {
633
2.46k
  switch (tok) {
634
1.23k
  case XML_TOK_PROLOG_S:
635
1.23k
    return XML_ROLE_NOTATION_NONE;
636
1.22k
  case XML_TOK_NAME:
637
1.22k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
530
      state->handler = notation3;
639
530
      return XML_ROLE_NOTATION_NONE;
640
530
    }
641
694
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
688
      state->handler = notation2;
643
688
      return XML_ROLE_NOTATION_NONE;
644
688
    }
645
6
    break;
646
2.46k
  }
647
7
  return common(state, tok);
648
2.46k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.35k
          const ENCODING *enc) {
653
1.35k
  UNUSED_P(ptr);
654
1.35k
  UNUSED_P(end);
655
1.35k
  UNUSED_P(enc);
656
1.35k
  switch (tok) {
657
685
  case XML_TOK_PROLOG_S:
658
685
    return XML_ROLE_NOTATION_NONE;
659
672
  case XML_TOK_LITERAL:
660
672
    state->handler = notation4;
661
672
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.35k
  }
663
2
  return common(state, tok);
664
1.35k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
1.05k
          const ENCODING *enc) {
669
1.05k
  UNUSED_P(ptr);
670
1.05k
  UNUSED_P(end);
671
1.05k
  UNUSED_P(enc);
672
1.05k
  switch (tok) {
673
539
  case XML_TOK_PROLOG_S:
674
539
    return XML_ROLE_NOTATION_NONE;
675
517
  case XML_TOK_LITERAL:
676
517
    state->handler = declClose;
677
517
    state->role_none = XML_ROLE_NOTATION_NONE;
678
517
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
1.05k
  }
680
1
  return common(state, tok);
681
1.05k
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
1.14k
          const ENCODING *enc) {
686
1.14k
  UNUSED_P(ptr);
687
1.14k
  UNUSED_P(end);
688
1.14k
  UNUSED_P(enc);
689
1.14k
  switch (tok) {
690
478
  case XML_TOK_PROLOG_S:
691
478
    return XML_ROLE_NOTATION_NONE;
692
195
  case XML_TOK_LITERAL:
693
195
    state->handler = declClose;
694
195
    state->role_none = XML_ROLE_NOTATION_NONE;
695
195
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
464
  case XML_TOK_DECL_CLOSE:
697
464
    setTopLevel(state);
698
464
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
1.14k
  }
700
4
  return common(state, tok);
701
1.14k
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
74.3k
         const ENCODING *enc) {
706
74.3k
  UNUSED_P(ptr);
707
74.3k
  UNUSED_P(end);
708
74.3k
  UNUSED_P(enc);
709
74.3k
  switch (tok) {
710
37.1k
  case XML_TOK_PROLOG_S:
711
37.1k
    return XML_ROLE_ATTLIST_NONE;
712
37.1k
  case XML_TOK_NAME:
713
37.1k
  case XML_TOK_PREFIXED_NAME:
714
37.1k
    state->handler = attlist1;
715
37.1k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
74.3k
  }
717
4
  return common(state, tok);
718
74.3k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
613k
         const ENCODING *enc) {
723
613k
  UNUSED_P(ptr);
724
613k
  UNUSED_P(end);
725
613k
  UNUSED_P(enc);
726
613k
  switch (tok) {
727
288k
  case XML_TOK_PROLOG_S:
728
288k
    return XML_ROLE_ATTLIST_NONE;
729
36.6k
  case XML_TOK_DECL_CLOSE:
730
36.6k
    setTopLevel(state);
731
36.6k
    return XML_ROLE_ATTLIST_NONE;
732
288k
  case XML_TOK_NAME:
733
288k
  case XML_TOK_PREFIXED_NAME:
734
288k
    state->handler = attlist2;
735
288k
    return XML_ROLE_ATTRIBUTE_NAME;
736
613k
  }
737
23
  return common(state, tok);
738
613k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
576k
         const ENCODING *enc) {
743
576k
  switch (tok) {
744
288k
  case XML_TOK_PROLOG_S:
745
288k
    return XML_ROLE_ATTLIST_NONE;
746
45.1k
  case XML_TOK_NAME: {
747
45.1k
    static const char *const types[] = {
748
45.1k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
45.1k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
45.1k
    };
751
45.1k
    int i;
752
128k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
127k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
44.7k
        state->handler = attlist8;
755
44.7k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
44.7k
      }
757
45.1k
  }
758
421
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
408
      state->handler = attlist5;
760
408
      return XML_ROLE_ATTLIST_NONE;
761
408
    }
762
13
    break;
763
243k
  case XML_TOK_OPEN_PAREN:
764
243k
    state->handler = attlist3;
765
243k
    return XML_ROLE_ATTLIST_NONE;
766
576k
  }
767
18
  return common(state, tok);
768
576k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
245k
         const ENCODING *enc) {
773
245k
  UNUSED_P(ptr);
774
245k
  UNUSED_P(end);
775
245k
  UNUSED_P(enc);
776
245k
  switch (tok) {
777
490
  case XML_TOK_PROLOG_S:
778
490
    return XML_ROLE_ATTLIST_NONE;
779
3.84k
  case XML_TOK_NMTOKEN:
780
245k
  case XML_TOK_NAME:
781
245k
  case XML_TOK_PREFIXED_NAME:
782
245k
    state->handler = attlist4;
783
245k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
245k
  }
785
1
  return common(state, tok);
786
245k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
245k
         const ENCODING *enc) {
791
245k
  UNUSED_P(ptr);
792
245k
  UNUSED_P(end);
793
245k
  UNUSED_P(enc);
794
245k
  switch (tok) {
795
330
  case XML_TOK_PROLOG_S:
796
330
    return XML_ROLE_ATTLIST_NONE;
797
243k
  case XML_TOK_CLOSE_PAREN:
798
243k
    state->handler = attlist8;
799
243k
    return XML_ROLE_ATTLIST_NONE;
800
2.01k
  case XML_TOK_OR:
801
2.01k
    state->handler = attlist3;
802
2.01k
    return XML_ROLE_ATTLIST_NONE;
803
245k
  }
804
8
  return common(state, tok);
805
245k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
803
         const ENCODING *enc) {
810
803
  UNUSED_P(ptr);
811
803
  UNUSED_P(end);
812
803
  UNUSED_P(enc);
813
803
  switch (tok) {
814
408
  case XML_TOK_PROLOG_S:
815
408
    return XML_ROLE_ATTLIST_NONE;
816
394
  case XML_TOK_OPEN_PAREN:
817
394
    state->handler = attlist6;
818
394
    return XML_ROLE_ATTLIST_NONE;
819
803
  }
820
1
  return common(state, tok);
821
803
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.68k
         const ENCODING *enc) {
826
1.68k
  UNUSED_P(ptr);
827
1.68k
  UNUSED_P(end);
828
1.68k
  UNUSED_P(enc);
829
1.68k
  switch (tok) {
830
430
  case XML_TOK_PROLOG_S:
831
430
    return XML_ROLE_ATTLIST_NONE;
832
1.25k
  case XML_TOK_NAME:
833
1.25k
    state->handler = attlist7;
834
1.25k
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.68k
  }
836
3
  return common(state, tok);
837
1.68k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.72k
         const ENCODING *enc) {
842
1.72k
  UNUSED_P(ptr);
843
1.72k
  UNUSED_P(end);
844
1.72k
  UNUSED_P(enc);
845
1.72k
  switch (tok) {
846
486
  case XML_TOK_PROLOG_S:
847
486
    return XML_ROLE_ATTLIST_NONE;
848
353
  case XML_TOK_CLOSE_PAREN:
849
353
    state->handler = attlist8;
850
353
    return XML_ROLE_ATTLIST_NONE;
851
885
  case XML_TOK_OR:
852
885
    state->handler = attlist6;
853
885
    return XML_ROLE_ATTLIST_NONE;
854
1.72k
  }
855
2
  return common(state, tok);
856
1.72k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
576k
         const ENCODING *enc) {
862
576k
  switch (tok) {
863
288k
  case XML_TOK_PROLOG_S:
864
288k
    return XML_ROLE_ATTLIST_NONE;
865
248k
  case XML_TOK_POUND_NAME:
866
248k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
248k
                            KW_IMPLIED)) {
868
247k
      state->handler = attlist1;
869
247k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
247k
    }
871
751
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
751
                            KW_REQUIRED)) {
873
353
      state->handler = attlist1;
874
353
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
353
    }
876
398
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
398
                            KW_FIXED)) {
878
386
      state->handler = attlist9;
879
386
      return XML_ROLE_ATTLIST_NONE;
880
386
    }
881
12
    break;
882
39.6k
  case XML_TOK_LITERAL:
883
39.6k
    state->handler = attlist1;
884
39.6k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
576k
  }
886
21
  return common(state, tok);
887
576k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
758
         const ENCODING *enc) {
892
758
  UNUSED_P(ptr);
893
758
  UNUSED_P(end);
894
758
  UNUSED_P(enc);
895
758
  switch (tok) {
896
384
  case XML_TOK_PROLOG_S:
897
384
    return XML_ROLE_ATTLIST_NONE;
898
368
  case XML_TOK_LITERAL:
899
368
    state->handler = attlist1;
900
368
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
758
  }
902
6
  return common(state, tok);
903
758
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
7.01k
         const ENCODING *enc) {
908
7.01k
  UNUSED_P(ptr);
909
7.01k
  UNUSED_P(end);
910
7.01k
  UNUSED_P(enc);
911
7.01k
  switch (tok) {
912
3.51k
  case XML_TOK_PROLOG_S:
913
3.51k
    return XML_ROLE_ELEMENT_NONE;
914
3.50k
  case XML_TOK_NAME:
915
3.50k
  case XML_TOK_PREFIXED_NAME:
916
3.50k
    state->handler = element1;
917
3.50k
    return XML_ROLE_ELEMENT_NAME;
918
7.01k
  }
919
3
  return common(state, tok);
920
7.01k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
6.99k
         const ENCODING *enc) {
925
6.99k
  switch (tok) {
926
3.50k
  case XML_TOK_PROLOG_S:
927
3.50k
    return XML_ROLE_ELEMENT_NONE;
928
310
  case XML_TOK_NAME:
929
310
    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
244
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
243
      state->handler = declClose;
936
243
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
243
      return XML_ROLE_CONTENT_ANY;
938
243
    }
939
1
    break;
940
3.17k
  case XML_TOK_OPEN_PAREN:
941
3.17k
    state->handler = element2;
942
3.17k
    state->level = 1;
943
3.17k
    return XML_ROLE_GROUP_OPEN;
944
6.99k
  }
945
2
  return common(state, tok);
946
6.99k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
4.02k
         const ENCODING *enc) {
951
4.02k
  switch (tok) {
952
862
  case XML_TOK_PROLOG_S:
953
862
    return XML_ROLE_ELEMENT_NONE;
954
1.21k
  case XML_TOK_POUND_NAME:
955
1.21k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
1.21k
                            KW_PCDATA)) {
957
1.21k
      state->handler = element3;
958
1.21k
      return XML_ROLE_CONTENT_PCDATA;
959
1.21k
    }
960
6
    break;
961
662
  case XML_TOK_OPEN_PAREN:
962
662
    state->level = 2;
963
662
    state->handler = element6;
964
662
    return XML_ROLE_GROUP_OPEN;
965
913
  case XML_TOK_NAME:
966
913
  case XML_TOK_PREFIXED_NAME:
967
913
    state->handler = element7;
968
913
    return XML_ROLE_CONTENT_ELEMENT;
969
78
  case XML_TOK_NAME_QUESTION:
970
78
    state->handler = element7;
971
78
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
202
  case XML_TOK_NAME_ASTERISK:
973
202
    state->handler = element7;
974
202
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
86
  case XML_TOK_NAME_PLUS:
976
86
    state->handler = element7;
977
86
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
4.02k
  }
979
7
  return common(state, tok);
980
4.02k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
1.51k
         const ENCODING *enc) {
985
1.51k
  UNUSED_P(ptr);
986
1.51k
  UNUSED_P(end);
987
1.51k
  UNUSED_P(enc);
988
1.51k
  switch (tok) {
989
317
  case XML_TOK_PROLOG_S:
990
317
    return XML_ROLE_ELEMENT_NONE;
991
333
  case XML_TOK_CLOSE_PAREN:
992
333
    state->handler = declClose;
993
333
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
333
    return XML_ROLE_GROUP_CLOSE;
995
211
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
211
    state->handler = declClose;
997
211
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
211
    return XML_ROLE_GROUP_CLOSE_REP;
999
653
  case XML_TOK_OR:
1000
653
    state->handler = element4;
1001
653
    return XML_ROLE_ELEMENT_NONE;
1002
1.51k
  }
1003
3
  return common(state, tok);
1004
1.51k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.86k
         const ENCODING *enc) {
1009
1.86k
  UNUSED_P(ptr);
1010
1.86k
  UNUSED_P(end);
1011
1.86k
  UNUSED_P(enc);
1012
1.86k
  switch (tok) {
1013
341
  case XML_TOK_PROLOG_S:
1014
341
    return XML_ROLE_ELEMENT_NONE;
1015
1.51k
  case XML_TOK_NAME:
1016
1.51k
  case XML_TOK_PREFIXED_NAME:
1017
1.51k
    state->handler = element5;
1018
1.51k
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.86k
  }
1020
10
  return common(state, tok);
1021
1.86k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
2.00k
         const ENCODING *enc) {
1026
2.00k
  UNUSED_P(ptr);
1027
2.00k
  UNUSED_P(end);
1028
2.00k
  UNUSED_P(enc);
1029
2.00k
  switch (tok) {
1030
502
  case XML_TOK_PROLOG_S:
1031
502
    return XML_ROLE_ELEMENT_NONE;
1032
599
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
599
    state->handler = declClose;
1034
599
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
599
    return XML_ROLE_GROUP_CLOSE_REP;
1036
898
  case XML_TOK_OR:
1037
898
    state->handler = element4;
1038
898
    return XML_ROLE_ELEMENT_NONE;
1039
2.00k
  }
1040
1
  return common(state, tok);
1041
2.00k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
3.30M
         const ENCODING *enc) {
1046
3.30M
  UNUSED_P(ptr);
1047
3.30M
  UNUSED_P(end);
1048
3.30M
  UNUSED_P(enc);
1049
3.30M
  switch (tok) {
1050
26.2k
  case XML_TOK_PROLOG_S:
1051
26.2k
    return XML_ROLE_ELEMENT_NONE;
1052
3.23M
  case XML_TOK_OPEN_PAREN:
1053
3.23M
    state->level += 1;
1054
3.23M
    return XML_ROLE_GROUP_OPEN;
1055
28.1k
  case XML_TOK_NAME:
1056
28.1k
  case XML_TOK_PREFIXED_NAME:
1057
28.1k
    state->handler = element7;
1058
28.1k
    return XML_ROLE_CONTENT_ELEMENT;
1059
130
  case XML_TOK_NAME_QUESTION:
1060
130
    state->handler = element7;
1061
130
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
8.52k
  case XML_TOK_NAME_ASTERISK:
1063
8.52k
    state->handler = element7;
1064
8.52k
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
208
  case XML_TOK_NAME_PLUS:
1066
208
    state->handler = element7;
1067
208
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
3.30M
  }
1069
11
  return common(state, tok);
1070
3.30M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
137k
         const ENCODING *enc) {
1075
137k
  UNUSED_P(ptr);
1076
137k
  UNUSED_P(end);
1077
137k
  UNUSED_P(enc);
1078
137k
  switch (tok) {
1079
9.40k
  case XML_TOK_PROLOG_S:
1080
9.40k
    return XML_ROLE_ELEMENT_NONE;
1081
54.6k
  case XML_TOK_CLOSE_PAREN:
1082
54.6k
    state->level -= 1;
1083
54.6k
    if (state->level == 0) {
1084
1.01k
      state->handler = declClose;
1085
1.01k
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
1.01k
    }
1087
54.6k
    return XML_ROLE_GROUP_CLOSE;
1088
18.7k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
18.7k
    state->level -= 1;
1090
18.7k
    if (state->level == 0) {
1091
292
      state->handler = declClose;
1092
292
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
292
    }
1094
18.7k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
8.92k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
8.92k
    state->level -= 1;
1097
8.92k
    if (state->level == 0) {
1098
77
      state->handler = declClose;
1099
77
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
77
    }
1101
8.92k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
9.42k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
9.42k
    state->level -= 1;
1104
9.42k
    if (state->level == 0) {
1105
342
      state->handler = declClose;
1106
342
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
342
    }
1108
9.42k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
9.52k
  case XML_TOK_COMMA:
1110
9.52k
    state->handler = element6;
1111
9.52k
    return XML_ROLE_GROUP_SEQUENCE;
1112
26.8k
  case XML_TOK_OR:
1113
26.8k
    state->handler = element6;
1114
26.8k
    return XML_ROLE_GROUP_CHOICE;
1115
137k
  }
1116
4
  return common(state, tok);
1117
137k
}
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
916
  case XML_TOK_PROLOG_S:
1184
916
    return state->role_none;
1185
10.7k
  case XML_TOK_DECL_CLOSE:
1186
10.7k
    setTopLevel(state);
1187
10.7k
    return state->role_none;
1188
11.7k
  }
1189
45
  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
626
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
626
  UNUSED_P(tok);
1231
626
#endif
1232
626
  state->handler = error;
1233
626
  return XML_ROLE_ERROR;
1234
626
}
1235
1236
void
1237
9.28k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
9.28k
  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.28k
}
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 */