Coverage Report

Created: 2025-07-18 07:06

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