Coverage Report

Created: 2025-07-11 07:20

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