Coverage Report

Created: 2025-08-28 06:56

/src/CMake/Utilities/cmexpat/lib/xmlrole.c
Line
Count
Source (jump to first uncovered line)
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
54.5k
#  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.53k
        const ENCODING *enc) {
143
8.53k
  switch (tok) {
144
180
  case XML_TOK_PROLOG_S:
145
180
    state->handler = prolog1;
146
180
    return XML_ROLE_NONE;
147
1.12k
  case XML_TOK_XML_DECL:
148
1.12k
    state->handler = prolog1;
149
1.12k
    return XML_ROLE_XML_DECL;
150
197
  case XML_TOK_PI:
151
197
    state->handler = prolog1;
152
197
    return XML_ROLE_PI;
153
78
  case XML_TOK_COMMENT:
154
78
    state->handler = prolog1;
155
78
    return XML_ROLE_COMMENT;
156
290
  case XML_TOK_BOM:
157
290
    return XML_ROLE_NONE;
158
2.77k
  case XML_TOK_DECL_OPEN:
159
2.77k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160
2.77k
                              KW_DOCTYPE))
161
24
      break;
162
2.74k
    state->handler = doctype0;
163
2.74k
    return XML_ROLE_DOCTYPE_NONE;
164
3.65k
  case XML_TOK_INSTANCE_START:
165
3.65k
    state->handler = error;
166
3.65k
    return XML_ROLE_INSTANCE_START;
167
8.53k
  }
168
262
  return common(state, tok);
169
8.53k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
6.10k
        const ENCODING *enc) {
174
6.10k
  switch (tok) {
175
1.00k
  case XML_TOK_PROLOG_S:
176
1.00k
    return XML_ROLE_NONE;
177
3.31k
  case XML_TOK_PI:
178
3.31k
    return XML_ROLE_PI;
179
696
  case XML_TOK_COMMENT:
180
696
    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
463
  case XML_TOK_DECL_OPEN:
191
463
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
463
                              KW_DOCTYPE))
193
3
      break;
194
460
    state->handler = doctype0;
195
460
    return XML_ROLE_DOCTYPE_NONE;
196
619
  case XML_TOK_INSTANCE_START:
197
619
    state->handler = error;
198
619
    return XML_ROLE_INSTANCE_START;
199
6.10k
  }
200
10
  return common(state, tok);
201
6.10k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
6.04k
        const ENCODING *enc) {
206
6.04k
  UNUSED_P(ptr);
207
6.04k
  UNUSED_P(end);
208
6.04k
  UNUSED_P(enc);
209
6.04k
  switch (tok) {
210
1.93k
  case XML_TOK_PROLOG_S:
211
1.93k
    return XML_ROLE_NONE;
212
2.28k
  case XML_TOK_PI:
213
2.28k
    return XML_ROLE_PI;
214
359
  case XML_TOK_COMMENT:
215
359
    return XML_ROLE_COMMENT;
216
1.45k
  case XML_TOK_INSTANCE_START:
217
1.45k
    state->handler = error;
218
1.45k
    return XML_ROLE_INSTANCE_START;
219
6.04k
  }
220
8
  return common(state, tok);
221
6.04k
}
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.99k
         const ENCODING *enc) {
243
3.99k
  switch (tok) {
244
796
  case XML_TOK_PROLOG_S:
245
796
    return XML_ROLE_DOCTYPE_NONE;
246
2.36k
  case XML_TOK_OPEN_BRACKET:
247
2.36k
    state->handler = internalSubset;
248
2.36k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
35
  case XML_TOK_DECL_CLOSE:
250
35
    state->handler = prolog2;
251
35
    return XML_ROLE_DOCTYPE_CLOSE;
252
790
  case XML_TOK_NAME:
253
790
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
18
      state->handler = doctype3;
255
18
      return XML_ROLE_DOCTYPE_NONE;
256
18
    }
257
772
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
762
      state->handler = doctype2;
259
762
      return XML_ROLE_DOCTYPE_NONE;
260
762
    }
261
10
    break;
262
3.99k
  }
263
12
  return common(state, tok);
264
3.99k
}
265
266
static int PTRCALL
267
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268
1.52k
         const ENCODING *enc) {
269
1.52k
  UNUSED_P(ptr);
270
1.52k
  UNUSED_P(end);
271
1.52k
  UNUSED_P(enc);
272
1.52k
  switch (tok) {
273
761
  case XML_TOK_PROLOG_S:
274
761
    return XML_ROLE_DOCTYPE_NONE;
275
756
  case XML_TOK_LITERAL:
276
756
    state->handler = doctype3;
277
756
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
278
1.52k
  }
279
3
  return common(state, tok);
280
1.52k
}
281
282
static int PTRCALL
283
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284
1.28k
         const ENCODING *enc) {
285
1.28k
  UNUSED_P(ptr);
286
1.28k
  UNUSED_P(end);
287
1.28k
  UNUSED_P(enc);
288
1.28k
  switch (tok) {
289
645
  case XML_TOK_PROLOG_S:
290
645
    return XML_ROLE_DOCTYPE_NONE;
291
626
  case XML_TOK_LITERAL:
292
626
    state->handler = doctype4;
293
626
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
1.28k
  }
295
12
  return common(state, tok);
296
1.28k
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
649
         const ENCODING *enc) {
301
649
  UNUSED_P(ptr);
302
649
  UNUSED_P(end);
303
649
  UNUSED_P(enc);
304
649
  switch (tok) {
305
29
  case XML_TOK_PROLOG_S:
306
29
    return XML_ROLE_DOCTYPE_NONE;
307
347
  case XML_TOK_OPEN_BRACKET:
308
347
    state->handler = internalSubset;
309
347
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
270
  case XML_TOK_DECL_CLOSE:
311
270
    state->handler = prolog2;
312
270
    return XML_ROLE_DOCTYPE_CLOSE;
313
649
  }
314
3
  return common(state, tok);
315
649
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
1.24k
         const ENCODING *enc) {
320
1.24k
  UNUSED_P(ptr);
321
1.24k
  UNUSED_P(end);
322
1.24k
  UNUSED_P(enc);
323
1.24k
  switch (tok) {
324
49
  case XML_TOK_PROLOG_S:
325
49
    return XML_ROLE_DOCTYPE_NONE;
326
1.19k
  case XML_TOK_DECL_CLOSE:
327
1.19k
    state->handler = prolog2;
328
1.19k
    return XML_ROLE_DOCTYPE_CLOSE;
329
1.24k
  }
330
1
  return common(state, tok);
331
1.24k
}
332
333
static int PTRCALL
334
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335
130k
               const ENCODING *enc) {
336
130k
  switch (tok) {
337
4.89k
  case XML_TOK_PROLOG_S:
338
4.89k
    return XML_ROLE_NONE;
339
55.9k
  case XML_TOK_DECL_OPEN:
340
55.9k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
55.9k
                            KW_ENTITY)) {
342
13.8k
      state->handler = entity0;
343
13.8k
      return XML_ROLE_ENTITY_NONE;
344
13.8k
    }
345
42.0k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
42.0k
                            KW_ATTLIST)) {
347
37.2k
      state->handler = attlist0;
348
37.2k
      return XML_ROLE_ATTLIST_NONE;
349
37.2k
    }
350
4.80k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.80k
                            KW_ELEMENT)) {
352
3.52k
      state->handler = element0;
353
3.52k
      return XML_ROLE_ELEMENT_NONE;
354
3.52k
    }
355
1.28k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.28k
                            KW_NOTATION)) {
357
1.26k
      state->handler = notation0;
358
1.26k
      return XML_ROLE_NOTATION_NONE;
359
1.26k
    }
360
21
    break;
361
696
  case XML_TOK_PI:
362
696
    return XML_ROLE_PI;
363
833
  case XML_TOK_COMMENT:
364
833
    return XML_ROLE_COMMENT;
365
66.9k
  case XML_TOK_PARAM_ENTITY_REF:
366
66.9k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.20k
  case XML_TOK_CLOSE_BRACKET:
368
1.20k
    state->handler = doctype5;
369
1.20k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
130k
  }
373
51
  return common(state, tok);
374
130k
}
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
27.7k
        const ENCODING *enc) {
418
27.7k
  UNUSED_P(ptr);
419
27.7k
  UNUSED_P(end);
420
27.7k
  UNUSED_P(enc);
421
27.7k
  switch (tok) {
422
13.8k
  case XML_TOK_PROLOG_S:
423
13.8k
    return XML_ROLE_ENTITY_NONE;
424
2.15k
  case XML_TOK_PERCENT:
425
2.15k
    state->handler = entity1;
426
2.15k
    return XML_ROLE_ENTITY_NONE;
427
11.7k
  case XML_TOK_NAME:
428
11.7k
    state->handler = entity2;
429
11.7k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
27.7k
  }
431
4
  return common(state, tok);
432
27.7k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
4.29k
        const ENCODING *enc) {
437
4.29k
  UNUSED_P(ptr);
438
4.29k
  UNUSED_P(end);
439
4.29k
  UNUSED_P(enc);
440
4.29k
  switch (tok) {
441
2.15k
  case XML_TOK_PROLOG_S:
442
2.15k
    return XML_ROLE_ENTITY_NONE;
443
2.13k
  case XML_TOK_NAME:
444
2.13k
    state->handler = entity7;
445
2.13k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
4.29k
  }
447
11
  return common(state, tok);
448
4.29k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
23.3k
        const ENCODING *enc) {
453
23.3k
  switch (tok) {
454
11.6k
  case XML_TOK_PROLOG_S:
455
11.6k
    return XML_ROLE_ENTITY_NONE;
456
2.42k
  case XML_TOK_NAME:
457
2.42k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
1.01k
      state->handler = entity4;
459
1.01k
      return XML_ROLE_ENTITY_NONE;
460
1.01k
    }
461
1.40k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
1.40k
      state->handler = entity3;
463
1.40k
      return XML_ROLE_ENTITY_NONE;
464
1.40k
    }
465
8
    break;
466
9.24k
  case XML_TOK_LITERAL:
467
9.24k
    state->handler = declClose;
468
9.24k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
9.24k
    return XML_ROLE_ENTITY_VALUE;
470
23.3k
  }
471
13
  return common(state, tok);
472
23.3k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
2.79k
        const ENCODING *enc) {
477
2.79k
  UNUSED_P(ptr);
478
2.79k
  UNUSED_P(end);
479
2.79k
  UNUSED_P(enc);
480
2.79k
  switch (tok) {
481
1.40k
  case XML_TOK_PROLOG_S:
482
1.40k
    return XML_ROLE_ENTITY_NONE;
483
1.39k
  case XML_TOK_LITERAL:
484
1.39k
    state->handler = entity4;
485
1.39k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
2.79k
  }
487
1
  return common(state, tok);
488
2.79k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
4.70k
        const ENCODING *enc) {
493
4.70k
  UNUSED_P(ptr);
494
4.70k
  UNUSED_P(end);
495
4.70k
  UNUSED_P(enc);
496
4.70k
  switch (tok) {
497
2.35k
  case XML_TOK_PROLOG_S:
498
2.35k
    return XML_ROLE_ENTITY_NONE;
499
2.34k
  case XML_TOK_LITERAL:
500
2.34k
    state->handler = entity5;
501
2.34k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
4.70k
  }
503
5
  return common(state, tok);
504
4.70k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
2.78k
        const ENCODING *enc) {
509
2.78k
  switch (tok) {
510
463
  case XML_TOK_PROLOG_S:
511
463
    return XML_ROLE_ENTITY_NONE;
512
1.98k
  case XML_TOK_DECL_CLOSE:
513
1.98k
    setTopLevel(state);
514
1.98k
    return XML_ROLE_ENTITY_COMPLETE;
515
334
  case XML_TOK_NAME:
516
334
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
333
      state->handler = entity6;
518
333
      return XML_ROLE_ENTITY_NONE;
519
333
    }
520
1
    break;
521
2.78k
  }
522
2
  return common(state, tok);
523
2.78k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
655
        const ENCODING *enc) {
528
655
  UNUSED_P(ptr);
529
655
  UNUSED_P(end);
530
655
  UNUSED_P(enc);
531
655
  switch (tok) {
532
329
  case XML_TOK_PROLOG_S:
533
329
    return XML_ROLE_ENTITY_NONE;
534
325
  case XML_TOK_NAME:
535
325
    state->handler = declClose;
536
325
    state->role_none = XML_ROLE_ENTITY_NONE;
537
325
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
655
  }
539
1
  return common(state, tok);
540
655
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
4.25k
        const ENCODING *enc) {
545
4.25k
  switch (tok) {
546
2.13k
  case XML_TOK_PROLOG_S:
547
2.13k
    return XML_ROLE_ENTITY_NONE;
548
1.21k
  case XML_TOK_NAME:
549
1.21k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
418
      state->handler = entity9;
551
418
      return XML_ROLE_ENTITY_NONE;
552
418
    }
553
800
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
799
      state->handler = entity8;
555
799
      return XML_ROLE_ENTITY_NONE;
556
799
    }
557
1
    break;
558
892
  case XML_TOK_LITERAL:
559
892
    state->handler = declClose;
560
892
    state->role_none = XML_ROLE_ENTITY_NONE;
561
892
    return XML_ROLE_ENTITY_VALUE;
562
4.25k
  }
563
4
  return common(state, tok);
564
4.25k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
1.58k
        const ENCODING *enc) {
569
1.58k
  UNUSED_P(ptr);
570
1.58k
  UNUSED_P(end);
571
1.58k
  UNUSED_P(enc);
572
1.58k
  switch (tok) {
573
800
  case XML_TOK_PROLOG_S:
574
800
    return XML_ROLE_ENTITY_NONE;
575
784
  case XML_TOK_LITERAL:
576
784
    state->handler = entity9;
577
784
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
1.58k
  }
579
2
  return common(state, tok);
580
1.58k
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
2.36k
        const ENCODING *enc) {
585
2.36k
  UNUSED_P(ptr);
586
2.36k
  UNUSED_P(end);
587
2.36k
  UNUSED_P(enc);
588
2.36k
  switch (tok) {
589
1.19k
  case XML_TOK_PROLOG_S:
590
1.19k
    return XML_ROLE_ENTITY_NONE;
591
1.17k
  case XML_TOK_LITERAL:
592
1.17k
    state->handler = entity10;
593
1.17k
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
2.36k
  }
595
1
  return common(state, tok);
596
2.36k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
1.53k
         const ENCODING *enc) {
601
1.53k
  UNUSED_P(ptr);
602
1.53k
  UNUSED_P(end);
603
1.53k
  UNUSED_P(enc);
604
1.53k
  switch (tok) {
605
374
  case XML_TOK_PROLOG_S:
606
374
    return XML_ROLE_ENTITY_NONE;
607
1.16k
  case XML_TOK_DECL_CLOSE:
608
1.16k
    setTopLevel(state);
609
1.16k
    return XML_ROLE_ENTITY_COMPLETE;
610
1.53k
  }
611
1
  return common(state, tok);
612
1.53k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.51k
          const ENCODING *enc) {
617
2.51k
  UNUSED_P(ptr);
618
2.51k
  UNUSED_P(end);
619
2.51k
  UNUSED_P(enc);
620
2.51k
  switch (tok) {
621
1.26k
  case XML_TOK_PROLOG_S:
622
1.26k
    return XML_ROLE_NOTATION_NONE;
623
1.24k
  case XML_TOK_NAME:
624
1.24k
    state->handler = notation1;
625
1.24k
    return XML_ROLE_NOTATION_NAME;
626
2.51k
  }
627
1
  return common(state, tok);
628
2.51k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.47k
          const ENCODING *enc) {
633
2.47k
  switch (tok) {
634
1.24k
  case XML_TOK_PROLOG_S:
635
1.24k
    return XML_ROLE_NOTATION_NONE;
636
1.23k
  case XML_TOK_NAME:
637
1.23k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
390
      state->handler = notation3;
639
390
      return XML_ROLE_NOTATION_NONE;
640
390
    }
641
841
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
835
      state->handler = notation2;
643
835
      return XML_ROLE_NOTATION_NONE;
644
835
    }
645
6
    break;
646
2.47k
  }
647
7
  return common(state, tok);
648
2.47k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.65k
          const ENCODING *enc) {
653
1.65k
  UNUSED_P(ptr);
654
1.65k
  UNUSED_P(end);
655
1.65k
  UNUSED_P(enc);
656
1.65k
  switch (tok) {
657
833
  case XML_TOK_PROLOG_S:
658
833
    return XML_ROLE_NOTATION_NONE;
659
818
  case XML_TOK_LITERAL:
660
818
    state->handler = notation4;
661
818
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.65k
  }
663
4
  return common(state, tok);
664
1.65k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
778
          const ENCODING *enc) {
669
778
  UNUSED_P(ptr);
670
778
  UNUSED_P(end);
671
778
  UNUSED_P(enc);
672
778
  switch (tok) {
673
395
  case XML_TOK_PROLOG_S:
674
395
    return XML_ROLE_NOTATION_NONE;
675
382
  case XML_TOK_LITERAL:
676
382
    state->handler = declClose;
677
382
    state->role_none = XML_ROLE_NOTATION_NONE;
678
382
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
778
  }
680
1
  return common(state, tok);
681
778
}
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
334
  case XML_TOK_PROLOG_S:
691
334
    return XML_ROLE_NOTATION_NONE;
692
67
  case XML_TOK_LITERAL:
693
67
    state->handler = declClose;
694
67
    state->role_none = XML_ROLE_NOTATION_NONE;
695
67
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
738
  case XML_TOK_DECL_CLOSE:
697
738
    setTopLevel(state);
698
738
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
1.14k
  }
700
9
  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.4k
         const ENCODING *enc) {
706
74.4k
  UNUSED_P(ptr);
707
74.4k
  UNUSED_P(end);
708
74.4k
  UNUSED_P(enc);
709
74.4k
  switch (tok) {
710
37.2k
  case XML_TOK_PROLOG_S:
711
37.2k
    return XML_ROLE_ATTLIST_NONE;
712
37.2k
  case XML_TOK_NAME:
713
37.2k
  case XML_TOK_PREFIXED_NAME:
714
37.2k
    state->handler = attlist1;
715
37.2k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
74.4k
  }
717
1
  return common(state, tok);
718
74.4k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
192k
         const ENCODING *enc) {
723
192k
  UNUSED_P(ptr);
724
192k
  UNUSED_P(end);
725
192k
  UNUSED_P(enc);
726
192k
  switch (tok) {
727
77.8k
  case XML_TOK_PROLOG_S:
728
77.8k
    return XML_ROLE_ATTLIST_NONE;
729
36.7k
  case XML_TOK_DECL_CLOSE:
730
36.7k
    setTopLevel(state);
731
36.7k
    return XML_ROLE_ATTLIST_NONE;
732
77.7k
  case XML_TOK_NAME:
733
77.7k
  case XML_TOK_PREFIXED_NAME:
734
77.7k
    state->handler = attlist2;
735
77.7k
    return XML_ROLE_ATTRIBUTE_NAME;
736
192k
  }
737
19
  return common(state, tok);
738
192k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
155k
         const ENCODING *enc) {
743
155k
  switch (tok) {
744
77.7k
  case XML_TOK_PROLOG_S:
745
77.7k
    return XML_ROLE_ATTLIST_NONE;
746
27.4k
  case XML_TOK_NAME: {
747
27.4k
    static const char *const types[] = {
748
27.4k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
27.4k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
27.4k
    };
751
27.4k
    int i;
752
64.6k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
64.1k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
26.8k
        state->handler = attlist8;
755
26.8k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
26.8k
      }
757
27.4k
  }
758
558
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
542
      state->handler = attlist5;
760
542
      return XML_ROLE_ATTLIST_NONE;
761
542
    }
762
16
    break;
763
50.3k
  case XML_TOK_OPEN_PAREN:
764
50.3k
    state->handler = attlist3;
765
50.3k
    return XML_ROLE_ATTLIST_NONE;
766
155k
  }
767
26
  return common(state, tok);
768
155k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
170k
         const ENCODING *enc) {
773
170k
  UNUSED_P(ptr);
774
170k
  UNUSED_P(end);
775
170k
  UNUSED_P(enc);
776
170k
  switch (tok) {
777
2.23k
  case XML_TOK_PROLOG_S:
778
2.23k
    return XML_ROLE_ATTLIST_NONE;
779
112k
  case XML_TOK_NMTOKEN:
780
168k
  case XML_TOK_NAME:
781
168k
  case XML_TOK_PREFIXED_NAME:
782
168k
    state->handler = attlist4;
783
168k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
170k
  }
785
7
  return common(state, tok);
786
170k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
172k
         const ENCODING *enc) {
791
172k
  UNUSED_P(ptr);
792
172k
  UNUSED_P(end);
793
172k
  UNUSED_P(enc);
794
172k
  switch (tok) {
795
3.74k
  case XML_TOK_PROLOG_S:
796
3.74k
    return XML_ROLE_ATTLIST_NONE;
797
50.2k
  case XML_TOK_CLOSE_PAREN:
798
50.2k
    state->handler = attlist8;
799
50.2k
    return XML_ROLE_ATTLIST_NONE;
800
118k
  case XML_TOK_OR:
801
118k
    state->handler = attlist3;
802
118k
    return XML_ROLE_ATTLIST_NONE;
803
172k
  }
804
5
  return common(state, tok);
805
172k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
1.06k
         const ENCODING *enc) {
810
1.06k
  UNUSED_P(ptr);
811
1.06k
  UNUSED_P(end);
812
1.06k
  UNUSED_P(enc);
813
1.06k
  switch (tok) {
814
541
  case XML_TOK_PROLOG_S:
815
541
    return XML_ROLE_ATTLIST_NONE;
816
525
  case XML_TOK_OPEN_PAREN:
817
525
    state->handler = attlist6;
818
525
    return XML_ROLE_ATTLIST_NONE;
819
1.06k
  }
820
1
  return common(state, tok);
821
1.06k
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.46k
         const ENCODING *enc) {
826
1.46k
  UNUSED_P(ptr);
827
1.46k
  UNUSED_P(end);
828
1.46k
  UNUSED_P(enc);
829
1.46k
  switch (tok) {
830
285
  case XML_TOK_PROLOG_S:
831
285
    return XML_ROLE_ATTLIST_NONE;
832
1.17k
  case XML_TOK_NAME:
833
1.17k
    state->handler = attlist7;
834
1.17k
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.46k
  }
836
1
  return common(state, tok);
837
1.46k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.59k
         const ENCODING *enc) {
842
1.59k
  UNUSED_P(ptr);
843
1.59k
  UNUSED_P(end);
844
1.59k
  UNUSED_P(enc);
845
1.59k
  switch (tok) {
846
426
  case XML_TOK_PROLOG_S:
847
426
    return XML_ROLE_ATTLIST_NONE;
848
486
  case XML_TOK_CLOSE_PAREN:
849
486
    state->handler = attlist8;
850
486
    return XML_ROLE_ATTLIST_NONE;
851
676
  case XML_TOK_OR:
852
676
    state->handler = attlist6;
853
676
    return XML_ROLE_ATTLIST_NONE;
854
1.59k
  }
855
3
  return common(state, tok);
856
1.59k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
155k
         const ENCODING *enc) {
862
155k
  switch (tok) {
863
77.5k
  case XML_TOK_PROLOG_S:
864
77.5k
    return XML_ROLE_ATTLIST_NONE;
865
59.8k
  case XML_TOK_POUND_NAME:
866
59.8k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
59.8k
                            KW_IMPLIED)) {
868
59.2k
      state->handler = attlist1;
869
59.2k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
59.2k
    }
871
563
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
563
                            KW_REQUIRED)) {
873
35
      state->handler = attlist1;
874
35
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
35
    }
876
528
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
528
                            KW_FIXED)) {
878
514
      state->handler = attlist9;
879
514
      return XML_ROLE_ATTLIST_NONE;
880
514
    }
881
14
    break;
882
17.6k
  case XML_TOK_LITERAL:
883
17.6k
    state->handler = attlist1;
884
17.6k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
155k
  }
886
17
  return common(state, tok);
887
155k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
1.01k
         const ENCODING *enc) {
892
1.01k
  UNUSED_P(ptr);
893
1.01k
  UNUSED_P(end);
894
1.01k
  UNUSED_P(enc);
895
1.01k
  switch (tok) {
896
509
  case XML_TOK_PROLOG_S:
897
509
    return XML_ROLE_ATTLIST_NONE;
898
498
  case XML_TOK_LITERAL:
899
498
    state->handler = attlist1;
900
498
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
1.01k
  }
902
5
  return common(state, tok);
903
1.01k
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
7.04k
         const ENCODING *enc) {
908
7.04k
  UNUSED_P(ptr);
909
7.04k
  UNUSED_P(end);
910
7.04k
  UNUSED_P(enc);
911
7.04k
  switch (tok) {
912
3.52k
  case XML_TOK_PROLOG_S:
913
3.52k
    return XML_ROLE_ELEMENT_NONE;
914
3.51k
  case XML_TOK_NAME:
915
3.51k
  case XML_TOK_PREFIXED_NAME:
916
3.51k
    state->handler = element1;
917
3.51k
    return XML_ROLE_ELEMENT_NAME;
918
7.04k
  }
919
5
  return common(state, tok);
920
7.04k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
7.01k
         const ENCODING *enc) {
925
7.01k
  switch (tok) {
926
3.51k
  case XML_TOK_PROLOG_S:
927
3.51k
    return XML_ROLE_ELEMENT_NONE;
928
298
  case XML_TOK_NAME:
929
298
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
70
      state->handler = declClose;
931
70
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
70
      return XML_ROLE_CONTENT_EMPTY;
933
70
    }
934
228
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
226
      state->handler = declClose;
936
226
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
226
      return XML_ROLE_CONTENT_ANY;
938
226
    }
939
2
    break;
940
3.19k
  case XML_TOK_OPEN_PAREN:
941
3.19k
    state->handler = element2;
942
3.19k
    state->level = 1;
943
3.19k
    return XML_ROLE_GROUP_OPEN;
944
7.01k
  }
945
6
  return common(state, tok);
946
7.01k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
3.36k
         const ENCODING *enc) {
951
3.36k
  switch (tok) {
952
181
  case XML_TOK_PROLOG_S:
953
181
    return XML_ROLE_ELEMENT_NONE;
954
1.06k
  case XML_TOK_POUND_NAME:
955
1.06k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
1.06k
                            KW_PCDATA)) {
957
1.06k
      state->handler = element3;
958
1.06k
      return XML_ROLE_CONTENT_PCDATA;
959
1.06k
    }
960
2
    break;
961
490
  case XML_TOK_OPEN_PAREN:
962
490
    state->level = 2;
963
490
    state->handler = element6;
964
490
    return XML_ROLE_GROUP_OPEN;
965
939
  case XML_TOK_NAME:
966
939
  case XML_TOK_PREFIXED_NAME:
967
939
    state->handler = element7;
968
939
    return XML_ROLE_CONTENT_ELEMENT;
969
331
  case XML_TOK_NAME_QUESTION:
970
331
    state->handler = element7;
971
331
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
207
  case XML_TOK_NAME_ASTERISK:
973
207
    state->handler = element7;
974
207
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
142
  case XML_TOK_NAME_PLUS:
976
142
    state->handler = element7;
977
142
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
3.36k
  }
979
8
  return common(state, tok);
980
3.36k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
1.33k
         const ENCODING *enc) {
985
1.33k
  UNUSED_P(ptr);
986
1.33k
  UNUSED_P(end);
987
1.33k
  UNUSED_P(enc);
988
1.33k
  switch (tok) {
989
277
  case XML_TOK_PROLOG_S:
990
277
    return XML_ROLE_ELEMENT_NONE;
991
284
  case XML_TOK_CLOSE_PAREN:
992
284
    state->handler = declClose;
993
284
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
284
    return XML_ROLE_GROUP_CLOSE;
995
386
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
386
    state->handler = declClose;
997
386
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
386
    return XML_ROLE_GROUP_CLOSE_REP;
999
383
  case XML_TOK_OR:
1000
383
    state->handler = element4;
1001
383
    return XML_ROLE_ELEMENT_NONE;
1002
1.33k
  }
1003
3
  return common(state, tok);
1004
1.33k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.61k
         const ENCODING *enc) {
1009
1.61k
  UNUSED_P(ptr);
1010
1.61k
  UNUSED_P(end);
1011
1.61k
  UNUSED_P(enc);
1012
1.61k
  switch (tok) {
1013
354
  case XML_TOK_PROLOG_S:
1014
354
    return XML_ROLE_ELEMENT_NONE;
1015
1.25k
  case XML_TOK_NAME:
1016
1.25k
  case XML_TOK_PREFIXED_NAME:
1017
1.25k
    state->handler = element5;
1018
1.25k
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.61k
  }
1020
12
  return common(state, tok);
1021
1.61k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
1.77k
         const ENCODING *enc) {
1026
1.77k
  UNUSED_P(ptr);
1027
1.77k
  UNUSED_P(end);
1028
1.77k
  UNUSED_P(enc);
1029
1.77k
  switch (tok) {
1030
544
  case XML_TOK_PROLOG_S:
1031
544
    return XML_ROLE_ELEMENT_NONE;
1032
329
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
329
    state->handler = declClose;
1034
329
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
329
    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
1.77k
  }
1040
1
  return common(state, tok);
1041
1.77k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
3.33M
         const ENCODING *enc) {
1046
3.33M
  UNUSED_P(ptr);
1047
3.33M
  UNUSED_P(end);
1048
3.33M
  UNUSED_P(enc);
1049
3.33M
  switch (tok) {
1050
10.4k
  case XML_TOK_PROLOG_S:
1051
10.4k
    return XML_ROLE_ELEMENT_NONE;
1052
3.30M
  case XML_TOK_OPEN_PAREN:
1053
3.30M
    state->level += 1;
1054
3.30M
    return XML_ROLE_GROUP_OPEN;
1055
22.0k
  case XML_TOK_NAME:
1056
22.0k
  case XML_TOK_PREFIXED_NAME:
1057
22.0k
    state->handler = element7;
1058
22.0k
    return XML_ROLE_CONTENT_ELEMENT;
1059
312
  case XML_TOK_NAME_QUESTION:
1060
312
    state->handler = element7;
1061
312
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
710
  case XML_TOK_NAME_ASTERISK:
1063
710
    state->handler = element7;
1064
710
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
3.95k
  case XML_TOK_NAME_PLUS:
1066
3.95k
    state->handler = element7;
1067
3.95k
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
3.33M
  }
1069
7
  return common(state, tok);
1070
3.33M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
78.2k
         const ENCODING *enc) {
1075
78.2k
  UNUSED_P(ptr);
1076
78.2k
  UNUSED_P(end);
1077
78.2k
  UNUSED_P(enc);
1078
78.2k
  switch (tok) {
1079
4.66k
  case XML_TOK_PROLOG_S:
1080
4.66k
    return XML_ROLE_ELEMENT_NONE;
1081
27.5k
  case XML_TOK_CLOSE_PAREN:
1082
27.5k
    state->level -= 1;
1083
27.5k
    if (state->level == 0) {
1084
886
      state->handler = declClose;
1085
886
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
886
    }
1087
27.5k
    return XML_ROLE_GROUP_CLOSE;
1088
6.29k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
6.29k
    state->level -= 1;
1090
6.29k
    if (state->level == 0) {
1091
72
      state->handler = declClose;
1092
72
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
72
    }
1094
6.29k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
5.65k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
5.65k
    state->level -= 1;
1097
5.65k
    if (state->level == 0) {
1098
574
      state->handler = declClose;
1099
574
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
574
    }
1101
5.65k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
7.44k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
7.44k
    state->level -= 1;
1104
7.44k
    if (state->level == 0) {
1105
340
      state->handler = declClose;
1106
340
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
340
    }
1108
7.44k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
10.8k
  case XML_TOK_COMMA:
1110
10.8k
    state->handler = element6;
1111
10.8k
    return XML_ROLE_GROUP_SEQUENCE;
1112
15.8k
  case XML_TOK_OR:
1113
15.8k
    state->handler = element6;
1114
15.8k
    return XML_ROLE_GROUP_CHOICE;
1115
78.2k
  }
1116
7
  return common(state, tok);
1117
78.2k
}
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.6k
          const ENCODING *enc) {
1179
15.6k
  UNUSED_P(ptr);
1180
15.6k
  UNUSED_P(end);
1181
15.6k
  UNUSED_P(enc);
1182
15.6k
  switch (tok) {
1183
1.65k
  case XML_TOK_PROLOG_S:
1184
1.65k
    return state->role_none;
1185
13.9k
  case XML_TOK_DECL_CLOSE:
1186
13.9k
    setTopLevel(state);
1187
13.9k
    return state->role_none;
1188
15.6k
  }
1189
36
  return common(state, tok);
1190
15.6k
}
1191
1192
/* This function will only be invoked if the internal logic of the
1193
 * parser has broken down.  It is used in two cases:
1194
 *
1195
 * 1: When the XML prolog has been finished.  At this point the
1196
 * processor (the parser level above these role handlers) should
1197
 * switch from prologProcessor to contentProcessor and reinitialise
1198
 * the handler function.
1199
 *
1200
 * 2: When an error has been detected (via common() below).  At this
1201
 * point again the processor should be switched to errorProcessor,
1202
 * which will never call a handler.
1203
 *
1204
 * The result of this is that error() can only be called if the
1205
 * processor switch failed to happen, which is an internal error and
1206
 * therefore we shouldn't be able to provoke it simply by using the
1207
 * library.  It is a necessary backstop, however, so we merely exclude
1208
 * it from the coverage statistics.
1209
 *
1210
 * LCOV_EXCL_START
1211
 */
1212
static int PTRCALL
1213
error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1214
0
      const ENCODING *enc) {
1215
0
  UNUSED_P(state);
1216
0
  UNUSED_P(tok);
1217
0
  UNUSED_P(ptr);
1218
0
  UNUSED_P(end);
1219
0
  UNUSED_P(enc);
1220
0
  return XML_ROLE_NONE;
1221
0
}
1222
/* LCOV_EXCL_STOP */
1223
1224
static int FASTCALL
1225
602
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
602
  UNUSED_P(tok);
1231
602
#endif
1232
602
  state->handler = error;
1233
602
  return XML_ROLE_ERROR;
1234
602
}
1235
1236
void
1237
9.26k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
9.26k
  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.26k
}
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 */