Coverage Report

Created: 2025-08-25 06:42

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