Coverage Report

Created: 2025-10-28 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/CMake/Utilities/cmexpat/lib/xmlrole.c
Line
Count
Source
1
/*
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
12
   Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14
   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15
   Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
16
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2021      Donghee Na <donghee.na@python.org>
19
   Licensed under the MIT license:
20
21
   Permission is  hereby granted,  free of charge,  to any  person obtaining
22
   a  copy  of  this  software   and  associated  documentation  files  (the
23
   "Software"),  to  deal in  the  Software  without restriction,  including
24
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
25
   distribute, sublicense, and/or sell copies of the Software, and to permit
26
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
27
   following conditions:
28
29
   The above copyright  notice and this permission notice  shall be included
30
   in all copies or substantial portions of the Software.
31
32
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
33
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
34
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
35
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
37
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38
   USE OR OTHER DEALINGS IN THE SOFTWARE.
39
*/
40
41
#include "expat_config.h"
42
43
#include <stddef.h>
44
45
#ifdef _WIN32
46
#  include "winconfig.h"
47
#endif
48
49
#include "expat_external.h"
50
#include "internal.h"
51
#include "xmlrole.h"
52
#include "ascii.h"
53
54
/* Doesn't check:
55
56
 that ,| are not mixed in a model group
57
 content of literals
58
59
*/
60
61
static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
62
static const char KW_ATTLIST[]
63
    = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
64
static const char KW_CDATA[]
65
    = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
66
static const char KW_DOCTYPE[]
67
    = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
68
static const char KW_ELEMENT[]
69
    = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
70
static const char KW_EMPTY[]
71
    = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
72
static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
73
                                   ASCII_I, ASCII_E, ASCII_S, '\0'};
74
static const char KW_ENTITY[]
75
    = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
76
static const char KW_FIXED[]
77
    = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
78
static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
79
static const char KW_IDREF[]
80
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
81
static const char KW_IDREFS[]
82
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83
#ifdef XML_DTD
84
static const char KW_IGNORE[]
85
    = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86
#endif
87
static const char KW_IMPLIED[]
88
    = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89
#ifdef XML_DTD
90
static const char KW_INCLUDE[]
91
    = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92
#endif
93
static const char KW_NDATA[]
94
    = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
95
static const char KW_NMTOKEN[]
96
    = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
97
static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
98
                                   ASCII_E, ASCII_N, ASCII_S, '\0'};
99
static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
100
                                   ASCII_I, ASCII_O, ASCII_N, '\0'};
101
static const char KW_PCDATA[]
102
    = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
103
static const char KW_PUBLIC[]
104
    = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
105
static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
106
                                   ASCII_R, ASCII_E, ASCII_D, '\0'};
107
static const char KW_SYSTEM[]
108
    = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
109
110
#ifndef MIN_BYTES_PER_CHAR
111
#  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
112
#endif
113
114
#ifdef XML_DTD
115
#  define setTopLevel(state)                                                   \
116
    ((state)->handler                                                          \
117
     = ((state)->documentEntity ? internalSubset : externalSubset1))
118
#else /* not XML_DTD */
119
84.3k
#  define setTopLevel(state) ((state)->handler = internalSubset)
120
#endif /* not XML_DTD */
121
122
typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
123
                                   const char *ptr, const char *end,
124
                                   const ENCODING *enc);
125
126
static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
127
    doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
128
    entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
129
    notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
130
    attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
131
    attlist9, element0, element1, element2, element3, element4, element5,
132
    element6, element7,
133
#ifdef XML_DTD
134
    externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
135
#endif /* XML_DTD */
136
    declClose, error;
137
138
static int FASTCALL common(PROLOG_STATE *state, int tok);
139
140
static int PTRCALL
141
prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
142
8.10k
        const ENCODING *enc) {
143
8.10k
  switch (tok) {
144
137
  case XML_TOK_PROLOG_S:
145
137
    state->handler = prolog1;
146
137
    return XML_ROLE_NONE;
147
1.12k
  case XML_TOK_XML_DECL:
148
1.12k
    state->handler = prolog1;
149
1.12k
    return XML_ROLE_XML_DECL;
150
189
  case XML_TOK_PI:
151
189
    state->handler = prolog1;
152
189
    return XML_ROLE_PI;
153
61
  case XML_TOK_COMMENT:
154
61
    state->handler = prolog1;
155
61
    return XML_ROLE_COMMENT;
156
250
  case XML_TOK_BOM:
157
250
    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
16
      break;
162
2.64k
    state->handler = doctype0;
163
2.64k
    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.10k
  }
168
228
  return common(state, tok);
169
8.10k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
6.13k
        const ENCODING *enc) {
174
6.13k
  switch (tok) {
175
1.18k
  case XML_TOK_PROLOG_S:
176
1.18k
    return XML_ROLE_NONE;
177
3.15k
  case XML_TOK_PI:
178
3.15k
    return XML_ROLE_PI;
179
769
  case XML_TOK_COMMENT:
180
769
    return XML_ROLE_COMMENT;
181
0
  case XML_TOK_BOM:
182
    /* This case can never arise.  To reach this role function, the
183
     * parse must have passed through prolog0 and therefore have had
184
     * some form of input, even if only a space.  At that point, a
185
     * byte order mark is no longer a valid character (though
186
     * technically it should be interpreted as a non-breaking space),
187
     * so will be rejected by the tokenizing stages.
188
     */
189
0
    return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
190
463
  case XML_TOK_DECL_OPEN:
191
463
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
463
                              KW_DOCTYPE))
193
2
      break;
194
461
    state->handler = doctype0;
195
461
    return XML_ROLE_DOCTYPE_NONE;
196
561
  case XML_TOK_INSTANCE_START:
197
561
    state->handler = error;
198
561
    return XML_ROLE_INSTANCE_START;
199
6.13k
  }
200
13
  return common(state, tok);
201
6.13k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
5.05k
        const ENCODING *enc) {
206
5.05k
  UNUSED_P(ptr);
207
5.05k
  UNUSED_P(end);
208
5.05k
  UNUSED_P(enc);
209
5.05k
  switch (tok) {
210
1.46k
  case XML_TOK_PROLOG_S:
211
1.46k
    return XML_ROLE_NONE;
212
1.57k
  case XML_TOK_PI:
213
1.57k
    return XML_ROLE_PI;
214
364
  case XML_TOK_COMMENT:
215
364
    return XML_ROLE_COMMENT;
216
1.64k
  case XML_TOK_INSTANCE_START:
217
1.64k
    state->handler = error;
218
1.64k
    return XML_ROLE_INSTANCE_START;
219
5.05k
  }
220
10
  return common(state, tok);
221
5.05k
}
222
223
static int PTRCALL
224
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225
6.20k
         const ENCODING *enc) {
226
6.20k
  UNUSED_P(ptr);
227
6.20k
  UNUSED_P(end);
228
6.20k
  UNUSED_P(enc);
229
6.20k
  switch (tok) {
230
3.10k
  case XML_TOK_PROLOG_S:
231
3.10k
    return XML_ROLE_DOCTYPE_NONE;
232
3.09k
  case XML_TOK_NAME:
233
3.09k
  case XML_TOK_PREFIXED_NAME:
234
3.09k
    state->handler = doctype1;
235
3.09k
    return XML_ROLE_DOCTYPE_NAME;
236
6.20k
  }
237
3
  return common(state, tok);
238
6.20k
}
239
240
static int PTRCALL
241
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242
3.92k
         const ENCODING *enc) {
243
3.92k
  switch (tok) {
244
833
  case XML_TOK_PROLOG_S:
245
833
    return XML_ROLE_DOCTYPE_NONE;
246
2.22k
  case XML_TOK_OPEN_BRACKET:
247
2.22k
    state->handler = internalSubset;
248
2.22k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
39
  case XML_TOK_DECL_CLOSE:
250
39
    state->handler = prolog2;
251
39
    return XML_ROLE_DOCTYPE_CLOSE;
252
824
  case XML_TOK_NAME:
253
824
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
16
      state->handler = doctype3;
255
16
      return XML_ROLE_DOCTYPE_NONE;
256
16
    }
257
808
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
804
      state->handler = doctype2;
259
804
      return XML_ROLE_DOCTYPE_NONE;
260
804
    }
261
4
    break;
262
3.92k
  }
263
6
  return common(state, tok);
264
3.92k
}
265
266
static int PTRCALL
267
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268
1.60k
         const ENCODING *enc) {
269
1.60k
  UNUSED_P(ptr);
270
1.60k
  UNUSED_P(end);
271
1.60k
  UNUSED_P(enc);
272
1.60k
  switch (tok) {
273
802
  case XML_TOK_PROLOG_S:
274
802
    return XML_ROLE_DOCTYPE_NONE;
275
797
  case XML_TOK_LITERAL:
276
797
    state->handler = doctype3;
277
797
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
278
1.60k
  }
279
4
  return common(state, tok);
280
1.60k
}
281
282
static int PTRCALL
283
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284
1.41k
         const ENCODING *enc) {
285
1.41k
  UNUSED_P(ptr);
286
1.41k
  UNUSED_P(end);
287
1.41k
  UNUSED_P(enc);
288
1.41k
  switch (tok) {
289
711
  case XML_TOK_PROLOG_S:
290
711
    return XML_ROLE_DOCTYPE_NONE;
291
694
  case XML_TOK_LITERAL:
292
694
    state->handler = doctype4;
293
694
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
1.41k
  }
295
11
  return common(state, tok);
296
1.41k
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
709
         const ENCODING *enc) {
301
709
  UNUSED_P(ptr);
302
709
  UNUSED_P(end);
303
709
  UNUSED_P(enc);
304
709
  switch (tok) {
305
23
  case XML_TOK_PROLOG_S:
306
23
    return XML_ROLE_DOCTYPE_NONE;
307
342
  case XML_TOK_OPEN_BRACKET:
308
342
    state->handler = internalSubset;
309
342
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
341
  case XML_TOK_DECL_CLOSE:
311
341
    state->handler = prolog2;
312
341
    return XML_ROLE_DOCTYPE_CLOSE;
313
709
  }
314
3
  return common(state, tok);
315
709
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
1.39k
         const ENCODING *enc) {
320
1.39k
  UNUSED_P(ptr);
321
1.39k
  UNUSED_P(end);
322
1.39k
  UNUSED_P(enc);
323
1.39k
  switch (tok) {
324
83
  case XML_TOK_PROLOG_S:
325
83
    return XML_ROLE_DOCTYPE_NONE;
326
1.30k
  case XML_TOK_DECL_CLOSE:
327
1.30k
    state->handler = prolog2;
328
1.30k
    return XML_ROLE_DOCTYPE_CLOSE;
329
1.39k
  }
330
4
  return common(state, tok);
331
1.39k
}
332
333
static int PTRCALL
334
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335
343k
               const ENCODING *enc) {
336
343k
  switch (tok) {
337
42.9k
  case XML_TOK_PROLOG_S:
338
42.9k
    return XML_ROLE_NONE;
339
85.4k
  case XML_TOK_DECL_OPEN:
340
85.4k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
85.4k
                            KW_ENTITY)) {
342
15.5k
      state->handler = entity0;
343
15.5k
      return XML_ROLE_ENTITY_NONE;
344
15.5k
    }
345
69.9k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
69.9k
                            KW_ATTLIST)) {
347
65.4k
      state->handler = attlist0;
348
65.4k
      return XML_ROLE_ATTLIST_NONE;
349
65.4k
    }
350
4.55k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.55k
                            KW_ELEMENT)) {
352
3.34k
      state->handler = element0;
353
3.34k
      return XML_ROLE_ELEMENT_NONE;
354
3.34k
    }
355
1.21k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.21k
                            KW_NOTATION)) {
357
1.18k
      state->handler = notation0;
358
1.18k
      return XML_ROLE_NOTATION_NONE;
359
1.18k
    }
360
22
    break;
361
3.93k
  case XML_TOK_PI:
362
3.93k
    return XML_ROLE_PI;
363
459
  case XML_TOK_COMMENT:
364
459
    return XML_ROLE_COMMENT;
365
209k
  case XML_TOK_PARAM_ENTITY_REF:
366
209k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.31k
  case XML_TOK_CLOSE_BRACKET:
368
1.31k
    state->handler = doctype5;
369
1.31k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
343k
  }
373
53
  return common(state, tok);
374
343k
}
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
31.0k
        const ENCODING *enc) {
418
31.0k
  UNUSED_P(ptr);
419
31.0k
  UNUSED_P(end);
420
31.0k
  UNUSED_P(enc);
421
31.0k
  switch (tok) {
422
15.5k
  case XML_TOK_PROLOG_S:
423
15.5k
    return XML_ROLE_ENTITY_NONE;
424
1.75k
  case XML_TOK_PERCENT:
425
1.75k
    state->handler = entity1;
426
1.75k
    return XML_ROLE_ENTITY_NONE;
427
13.7k
  case XML_TOK_NAME:
428
13.7k
    state->handler = entity2;
429
13.7k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
31.0k
  }
431
2
  return common(state, tok);
432
31.0k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
3.50k
        const ENCODING *enc) {
437
3.50k
  UNUSED_P(ptr);
438
3.50k
  UNUSED_P(end);
439
3.50k
  UNUSED_P(enc);
440
3.50k
  switch (tok) {
441
1.75k
  case XML_TOK_PROLOG_S:
442
1.75k
    return XML_ROLE_ENTITY_NONE;
443
1.73k
  case XML_TOK_NAME:
444
1.73k
    state->handler = entity7;
445
1.73k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
3.50k
  }
447
12
  return common(state, tok);
448
3.50k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
27.4k
        const ENCODING *enc) {
453
27.4k
  switch (tok) {
454
13.7k
  case XML_TOK_PROLOG_S:
455
13.7k
    return XML_ROLE_ENTITY_NONE;
456
1.97k
  case XML_TOK_NAME:
457
1.97k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
840
      state->handler = entity4;
459
840
      return XML_ROLE_ENTITY_NONE;
460
840
    }
461
1.13k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
1.13k
      state->handler = entity3;
463
1.13k
      return XML_ROLE_ENTITY_NONE;
464
1.13k
    }
465
4
    break;
466
11.7k
  case XML_TOK_LITERAL:
467
11.7k
    state->handler = declClose;
468
11.7k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
11.7k
    return XML_ROLE_ENTITY_VALUE;
470
27.4k
  }
471
8
  return common(state, tok);
472
27.4k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
2.25k
        const ENCODING *enc) {
477
2.25k
  UNUSED_P(ptr);
478
2.25k
  UNUSED_P(end);
479
2.25k
  UNUSED_P(enc);
480
2.25k
  switch (tok) {
481
1.13k
  case XML_TOK_PROLOG_S:
482
1.13k
    return XML_ROLE_ENTITY_NONE;
483
1.12k
  case XML_TOK_LITERAL:
484
1.12k
    state->handler = entity4;
485
1.12k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
2.25k
  }
487
1
  return common(state, tok);
488
2.25k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
3.84k
        const ENCODING *enc) {
493
3.84k
  UNUSED_P(ptr);
494
3.84k
  UNUSED_P(end);
495
3.84k
  UNUSED_P(enc);
496
3.84k
  switch (tok) {
497
1.92k
  case XML_TOK_PROLOG_S:
498
1.92k
    return XML_ROLE_ENTITY_NONE;
499
1.91k
  case XML_TOK_LITERAL:
500
1.91k
    state->handler = entity5;
501
1.91k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
3.84k
  }
503
2
  return common(state, tok);
504
3.84k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
2.42k
        const ENCODING *enc) {
509
2.42k
  switch (tok) {
510
527
  case XML_TOK_PROLOG_S:
511
527
    return XML_ROLE_ENTITY_NONE;
512
1.44k
  case XML_TOK_DECL_CLOSE:
513
1.44k
    setTopLevel(state);
514
1.44k
    return XML_ROLE_ENTITY_COMPLETE;
515
458
  case XML_TOK_NAME:
516
458
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
455
      state->handler = entity6;
518
455
      return XML_ROLE_ENTITY_NONE;
519
455
    }
520
3
    break;
521
2.42k
  }
522
4
  return common(state, tok);
523
2.42k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
898
        const ENCODING *enc) {
528
898
  UNUSED_P(ptr);
529
898
  UNUSED_P(end);
530
898
  UNUSED_P(enc);
531
898
  switch (tok) {
532
451
  case XML_TOK_PROLOG_S:
533
451
    return XML_ROLE_ENTITY_NONE;
534
446
  case XML_TOK_NAME:
535
446
    state->handler = declClose;
536
446
    state->role_none = XML_ROLE_ENTITY_NONE;
537
446
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
898
  }
539
1
  return common(state, tok);
540
898
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
3.45k
        const ENCODING *enc) {
545
3.45k
  switch (tok) {
546
1.73k
  case XML_TOK_PROLOG_S:
547
1.73k
    return XML_ROLE_ENTITY_NONE;
548
939
  case XML_TOK_NAME:
549
939
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
459
      state->handler = entity9;
551
459
      return XML_ROLE_ENTITY_NONE;
552
459
    }
553
480
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
479
      state->handler = entity8;
555
479
      return XML_ROLE_ENTITY_NONE;
556
479
    }
557
1
    break;
558
780
  case XML_TOK_LITERAL:
559
780
    state->handler = declClose;
560
780
    state->role_none = XML_ROLE_ENTITY_NONE;
561
780
    return XML_ROLE_ENTITY_VALUE;
562
3.45k
  }
563
4
  return common(state, tok);
564
3.45k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
944
        const ENCODING *enc) {
569
944
  UNUSED_P(ptr);
570
944
  UNUSED_P(end);
571
944
  UNUSED_P(enc);
572
944
  switch (tok) {
573
478
  case XML_TOK_PROLOG_S:
574
478
    return XML_ROLE_ENTITY_NONE;
575
465
  case XML_TOK_LITERAL:
576
465
    state->handler = entity9;
577
465
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
944
  }
579
1
  return common(state, tok);
580
944
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
1.82k
        const ENCODING *enc) {
585
1.82k
  UNUSED_P(ptr);
586
1.82k
  UNUSED_P(end);
587
1.82k
  UNUSED_P(enc);
588
1.82k
  switch (tok) {
589
913
  case XML_TOK_PROLOG_S:
590
913
    return XML_ROLE_ENTITY_NONE;
591
907
  case XML_TOK_LITERAL:
592
907
    state->handler = entity10;
593
907
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
1.82k
  }
595
2
  return common(state, tok);
596
1.82k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
1.27k
         const ENCODING *enc) {
601
1.27k
  UNUSED_P(ptr);
602
1.27k
  UNUSED_P(end);
603
1.27k
  UNUSED_P(enc);
604
1.27k
  switch (tok) {
605
381
  case XML_TOK_PROLOG_S:
606
381
    return XML_ROLE_ENTITY_NONE;
607
894
  case XML_TOK_DECL_CLOSE:
608
894
    setTopLevel(state);
609
894
    return XML_ROLE_ENTITY_COMPLETE;
610
1.27k
  }
611
1
  return common(state, tok);
612
1.27k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.36k
          const ENCODING *enc) {
617
2.36k
  UNUSED_P(ptr);
618
2.36k
  UNUSED_P(end);
619
2.36k
  UNUSED_P(enc);
620
2.36k
  switch (tok) {
621
1.19k
  case XML_TOK_PROLOG_S:
622
1.19k
    return XML_ROLE_NOTATION_NONE;
623
1.17k
  case XML_TOK_NAME:
624
1.17k
    state->handler = notation1;
625
1.17k
    return XML_ROLE_NOTATION_NAME;
626
2.36k
  }
627
1
  return common(state, tok);
628
2.36k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.33k
          const ENCODING *enc) {
633
2.33k
  switch (tok) {
634
1.17k
  case XML_TOK_PROLOG_S:
635
1.17k
    return XML_ROLE_NOTATION_NONE;
636
1.16k
  case XML_TOK_NAME:
637
1.16k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
541
      state->handler = notation3;
639
541
      return XML_ROLE_NOTATION_NONE;
640
541
    }
641
622
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
619
      state->handler = notation2;
643
619
      return XML_ROLE_NOTATION_NONE;
644
619
    }
645
3
    break;
646
2.33k
  }
647
4
  return common(state, tok);
648
2.33k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.22k
          const ENCODING *enc) {
653
1.22k
  UNUSED_P(ptr);
654
1.22k
  UNUSED_P(end);
655
1.22k
  UNUSED_P(enc);
656
1.22k
  switch (tok) {
657
617
  case XML_TOK_PROLOG_S:
658
617
    return XML_ROLE_NOTATION_NONE;
659
601
  case XML_TOK_LITERAL:
660
601
    state->handler = notation4;
661
601
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.22k
  }
663
2
  return common(state, tok);
664
1.22k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
1.07k
          const ENCODING *enc) {
669
1.07k
  UNUSED_P(ptr);
670
1.07k
  UNUSED_P(end);
671
1.07k
  UNUSED_P(enc);
672
1.07k
  switch (tok) {
673
549
  case XML_TOK_PROLOG_S:
674
549
    return XML_ROLE_NOTATION_NONE;
675
528
  case XML_TOK_LITERAL:
676
528
    state->handler = declClose;
677
528
    state->role_none = XML_ROLE_NOTATION_NONE;
678
528
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
1.07k
  }
680
1
  return common(state, tok);
681
1.07k
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
799
          const ENCODING *enc) {
686
799
  UNUSED_P(ptr);
687
799
  UNUSED_P(end);
688
799
  UNUSED_P(enc);
689
799
  switch (tok) {
690
202
  case XML_TOK_PROLOG_S:
691
202
    return XML_ROLE_NOTATION_NONE;
692
146
  case XML_TOK_LITERAL:
693
146
    state->handler = declClose;
694
146
    state->role_none = XML_ROLE_NOTATION_NONE;
695
146
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
448
  case XML_TOK_DECL_CLOSE:
697
448
    setTopLevel(state);
698
448
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
799
  }
700
3
  return common(state, tok);
701
799
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
130k
         const ENCODING *enc) {
706
130k
  UNUSED_P(ptr);
707
130k
  UNUSED_P(end);
708
130k
  UNUSED_P(enc);
709
130k
  switch (tok) {
710
65.4k
  case XML_TOK_PROLOG_S:
711
65.4k
    return XML_ROLE_ATTLIST_NONE;
712
65.4k
  case XML_TOK_NAME:
713
65.4k
  case XML_TOK_PREFIXED_NAME:
714
65.4k
    state->handler = attlist1;
715
65.4k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
130k
  }
717
1
  return common(state, tok);
718
130k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
366k
         const ENCODING *enc) {
723
366k
  UNUSED_P(ptr);
724
366k
  UNUSED_P(end);
725
366k
  UNUSED_P(enc);
726
366k
  switch (tok) {
727
150k
  case XML_TOK_PROLOG_S:
728
150k
    return XML_ROLE_ATTLIST_NONE;
729
65.0k
  case XML_TOK_DECL_CLOSE:
730
65.0k
    setTopLevel(state);
731
65.0k
    return XML_ROLE_ATTLIST_NONE;
732
150k
  case XML_TOK_NAME:
733
150k
  case XML_TOK_PREFIXED_NAME:
734
150k
    state->handler = attlist2;
735
150k
    return XML_ROLE_ATTRIBUTE_NAME;
736
366k
  }
737
11
  return common(state, tok);
738
366k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
301k
         const ENCODING *enc) {
743
301k
  switch (tok) {
744
150k
  case XML_TOK_PROLOG_S:
745
150k
    return XML_ROLE_ATTLIST_NONE;
746
57.1k
  case XML_TOK_NAME: {
747
57.1k
    static const char *const types[] = {
748
57.1k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
57.1k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
57.1k
    };
751
57.1k
    int i;
752
256k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
255k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
56.7k
        state->handler = attlist8;
755
56.7k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
56.7k
      }
757
57.1k
  }
758
403
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
391
      state->handler = attlist5;
760
391
      return XML_ROLE_ATTLIST_NONE;
761
391
    }
762
12
    break;
763
93.5k
  case XML_TOK_OPEN_PAREN:
764
93.5k
    state->handler = attlist3;
765
93.5k
    return XML_ROLE_ATTLIST_NONE;
766
301k
  }
767
14
  return common(state, tok);
768
301k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
96.8k
         const ENCODING *enc) {
773
96.8k
  UNUSED_P(ptr);
774
96.8k
  UNUSED_P(end);
775
96.8k
  UNUSED_P(enc);
776
96.8k
  switch (tok) {
777
478
  case XML_TOK_PROLOG_S:
778
478
    return XML_ROLE_ATTLIST_NONE;
779
2.19k
  case XML_TOK_NMTOKEN:
780
96.3k
  case XML_TOK_NAME:
781
96.3k
  case XML_TOK_PREFIXED_NAME:
782
96.3k
    state->handler = attlist4;
783
96.3k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
96.8k
  }
785
8
  return common(state, tok);
786
96.8k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
96.7k
         const ENCODING *enc) {
791
96.7k
  UNUSED_P(ptr);
792
96.7k
  UNUSED_P(end);
793
96.7k
  UNUSED_P(enc);
794
96.7k
  switch (tok) {
795
477
  case XML_TOK_PROLOG_S:
796
477
    return XML_ROLE_ATTLIST_NONE;
797
93.5k
  case XML_TOK_CLOSE_PAREN:
798
93.5k
    state->handler = attlist8;
799
93.5k
    return XML_ROLE_ATTLIST_NONE;
800
2.79k
  case XML_TOK_OR:
801
2.79k
    state->handler = attlist3;
802
2.79k
    return XML_ROLE_ATTLIST_NONE;
803
96.7k
  }
804
2
  return common(state, tok);
805
96.7k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
777
         const ENCODING *enc) {
810
777
  UNUSED_P(ptr);
811
777
  UNUSED_P(end);
812
777
  UNUSED_P(enc);
813
777
  switch (tok) {
814
395
  case XML_TOK_PROLOG_S:
815
395
    return XML_ROLE_ATTLIST_NONE;
816
380
  case XML_TOK_OPEN_PAREN:
817
380
    state->handler = attlist6;
818
380
    return XML_ROLE_ATTLIST_NONE;
819
777
  }
820
2
  return common(state, tok);
821
777
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.14k
         const ENCODING *enc) {
826
1.14k
  UNUSED_P(ptr);
827
1.14k
  UNUSED_P(end);
828
1.14k
  UNUSED_P(enc);
829
1.14k
  switch (tok) {
830
327
  case XML_TOK_PROLOG_S:
831
327
    return XML_ROLE_ATTLIST_NONE;
832
816
  case XML_TOK_NAME:
833
816
    state->handler = attlist7;
834
816
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.14k
  }
836
1
  return common(state, tok);
837
1.14k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
967
         const ENCODING *enc) {
842
967
  UNUSED_P(ptr);
843
967
  UNUSED_P(end);
844
967
  UNUSED_P(enc);
845
967
  switch (tok) {
846
158
  case XML_TOK_PROLOG_S:
847
158
    return XML_ROLE_ATTLIST_NONE;
848
351
  case XML_TOK_CLOSE_PAREN:
849
351
    state->handler = attlist8;
850
351
    return XML_ROLE_ATTLIST_NONE;
851
455
  case XML_TOK_OR:
852
455
    state->handler = attlist6;
853
455
    return XML_ROLE_ATTLIST_NONE;
854
967
  }
855
3
  return common(state, tok);
856
967
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
301k
         const ENCODING *enc) {
862
301k
  switch (tok) {
863
150k
  case XML_TOK_PROLOG_S:
864
150k
    return XML_ROLE_ATTLIST_NONE;
865
97.9k
  case XML_TOK_POUND_NAME:
866
97.9k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
97.9k
                            KW_IMPLIED)) {
868
97.7k
      state->handler = attlist1;
869
97.7k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
97.7k
    }
871
240
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
240
                            KW_REQUIRED)) {
873
51
      state->handler = attlist1;
874
51
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
51
    }
876
189
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
189
                            KW_FIXED)) {
878
183
      state->handler = attlist9;
879
183
      return XML_ROLE_ATTLIST_NONE;
880
183
    }
881
6
    break;
882
52.5k
  case XML_TOK_LITERAL:
883
52.5k
    state->handler = attlist1;
884
52.5k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
301k
  }
886
7
  return common(state, tok);
887
301k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
354
         const ENCODING *enc) {
892
354
  UNUSED_P(ptr);
893
354
  UNUSED_P(end);
894
354
  UNUSED_P(enc);
895
354
  switch (tok) {
896
180
  case XML_TOK_PROLOG_S:
897
180
    return XML_ROLE_ATTLIST_NONE;
898
169
  case XML_TOK_LITERAL:
899
169
    state->handler = attlist1;
900
169
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
354
  }
902
5
  return common(state, tok);
903
354
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
6.67k
         const ENCODING *enc) {
908
6.67k
  UNUSED_P(ptr);
909
6.67k
  UNUSED_P(end);
910
6.67k
  UNUSED_P(enc);
911
6.67k
  switch (tok) {
912
3.34k
  case XML_TOK_PROLOG_S:
913
3.34k
    return XML_ROLE_ELEMENT_NONE;
914
3.32k
  case XML_TOK_NAME:
915
3.32k
  case XML_TOK_PREFIXED_NAME:
916
3.32k
    state->handler = element1;
917
3.32k
    return XML_ROLE_ELEMENT_NAME;
918
6.67k
  }
919
4
  return common(state, tok);
920
6.67k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
6.64k
         const ENCODING *enc) {
925
6.64k
  switch (tok) {
926
3.32k
  case XML_TOK_PROLOG_S:
927
3.32k
    return XML_ROLE_ELEMENT_NONE;
928
167
  case XML_TOK_NAME:
929
167
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
79
      state->handler = declClose;
931
79
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
79
      return XML_ROLE_CONTENT_EMPTY;
933
79
    }
934
88
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
86
      state->handler = declClose;
936
86
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
86
      return XML_ROLE_CONTENT_ANY;
938
86
    }
939
2
    break;
940
3.14k
  case XML_TOK_OPEN_PAREN:
941
3.14k
    state->handler = element2;
942
3.14k
    state->level = 1;
943
3.14k
    return XML_ROLE_GROUP_OPEN;
944
6.64k
  }
945
5
  return common(state, tok);
946
6.64k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
3.54k
         const ENCODING *enc) {
951
3.54k
  switch (tok) {
952
415
  case XML_TOK_PROLOG_S:
953
415
    return XML_ROLE_ELEMENT_NONE;
954
949
  case XML_TOK_POUND_NAME:
955
949
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
949
                            KW_PCDATA)) {
957
946
      state->handler = element3;
958
946
      return XML_ROLE_CONTENT_PCDATA;
959
946
    }
960
3
    break;
961
673
  case XML_TOK_OPEN_PAREN:
962
673
    state->level = 2;
963
673
    state->handler = element6;
964
673
    return XML_ROLE_GROUP_OPEN;
965
866
  case XML_TOK_NAME:
966
866
  case XML_TOK_PREFIXED_NAME:
967
866
    state->handler = element7;
968
866
    return XML_ROLE_CONTENT_ELEMENT;
969
226
  case XML_TOK_NAME_QUESTION:
970
226
    state->handler = element7;
971
226
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
336
  case XML_TOK_NAME_ASTERISK:
973
336
    state->handler = element7;
974
336
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
79
  case XML_TOK_NAME_PLUS:
976
79
    state->handler = element7;
977
79
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
3.54k
  }
979
6
  return common(state, tok);
980
3.54k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
1.45k
         const ENCODING *enc) {
985
1.45k
  UNUSED_P(ptr);
986
1.45k
  UNUSED_P(end);
987
1.45k
  UNUSED_P(enc);
988
1.45k
  switch (tok) {
989
513
  case XML_TOK_PROLOG_S:
990
513
    return XML_ROLE_ELEMENT_NONE;
991
208
  case XML_TOK_CLOSE_PAREN:
992
208
    state->handler = declClose;
993
208
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
208
    return XML_ROLE_GROUP_CLOSE;
995
294
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
294
    state->handler = declClose;
997
294
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
294
    return XML_ROLE_GROUP_CLOSE_REP;
999
432
  case XML_TOK_OR:
1000
432
    state->handler = element4;
1001
432
    return XML_ROLE_ELEMENT_NONE;
1002
1.45k
  }
1003
3
  return common(state, tok);
1004
1.45k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.52k
         const ENCODING *enc) {
1009
1.52k
  UNUSED_P(ptr);
1010
1.52k
  UNUSED_P(end);
1011
1.52k
  UNUSED_P(enc);
1012
1.52k
  switch (tok) {
1013
348
  case XML_TOK_PROLOG_S:
1014
348
    return XML_ROLE_ELEMENT_NONE;
1015
1.17k
  case XML_TOK_NAME:
1016
1.17k
  case XML_TOK_PREFIXED_NAME:
1017
1.17k
    state->handler = element5;
1018
1.17k
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.52k
  }
1020
9
  return common(state, tok);
1021
1.52k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
1.61k
         const ENCODING *enc) {
1026
1.61k
  UNUSED_P(ptr);
1027
1.61k
  UNUSED_P(end);
1028
1.61k
  UNUSED_P(enc);
1029
1.61k
  switch (tok) {
1030
458
  case XML_TOK_PROLOG_S:
1031
458
    return XML_ROLE_ELEMENT_NONE;
1032
386
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
386
    state->handler = declClose;
1034
386
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
386
    return XML_ROLE_GROUP_CLOSE_REP;
1036
764
  case XML_TOK_OR:
1037
764
    state->handler = element4;
1038
764
    return XML_ROLE_ELEMENT_NONE;
1039
1.61k
  }
1040
2
  return common(state, tok);
1041
1.61k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
1.38M
         const ENCODING *enc) {
1046
1.38M
  UNUSED_P(ptr);
1047
1.38M
  UNUSED_P(end);
1048
1.38M
  UNUSED_P(enc);
1049
1.38M
  switch (tok) {
1050
5.66k
  case XML_TOK_PROLOG_S:
1051
5.66k
    return XML_ROLE_ELEMENT_NONE;
1052
1.36M
  case XML_TOK_OPEN_PAREN:
1053
1.36M
    state->level += 1;
1054
1.36M
    return XML_ROLE_GROUP_OPEN;
1055
11.8k
  case XML_TOK_NAME:
1056
11.8k
  case XML_TOK_PREFIXED_NAME:
1057
11.8k
    state->handler = element7;
1058
11.8k
    return XML_ROLE_CONTENT_ELEMENT;
1059
111
  case XML_TOK_NAME_QUESTION:
1060
111
    state->handler = element7;
1061
111
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
1.06k
  case XML_TOK_NAME_ASTERISK:
1063
1.06k
    state->handler = element7;
1064
1.06k
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
506
  case XML_TOK_NAME_PLUS:
1066
506
    state->handler = element7;
1067
506
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
1.38M
  }
1069
13
  return common(state, tok);
1070
1.38M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
79.0k
         const ENCODING *enc) {
1075
79.0k
  UNUSED_P(ptr);
1076
79.0k
  UNUSED_P(end);
1077
79.0k
  UNUSED_P(enc);
1078
79.0k
  switch (tok) {
1079
24.7k
  case XML_TOK_PROLOG_S:
1080
24.7k
    return XML_ROLE_ELEMENT_NONE;
1081
34.5k
  case XML_TOK_CLOSE_PAREN:
1082
34.5k
    state->level -= 1;
1083
34.5k
    if (state->level == 0) {
1084
1.24k
      state->handler = declClose;
1085
1.24k
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
1.24k
    }
1087
34.5k
    return XML_ROLE_GROUP_CLOSE;
1088
1.88k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
1.88k
    state->level -= 1;
1090
1.88k
    if (state->level == 0) {
1091
160
      state->handler = declClose;
1092
160
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
160
    }
1094
1.88k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
2.14k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
2.14k
    state->level -= 1;
1097
2.14k
    if (state->level == 0) {
1098
237
      state->handler = declClose;
1099
237
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
237
    }
1101
2.14k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
2.78k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
2.78k
    state->level -= 1;
1104
2.78k
    if (state->level == 0) {
1105
360
      state->handler = declClose;
1106
360
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
360
    }
1108
2.78k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
6.83k
  case XML_TOK_COMMA:
1110
6.83k
    state->handler = element6;
1111
6.83k
    return XML_ROLE_GROUP_SEQUENCE;
1112
6.13k
  case XML_TOK_OR:
1113
6.13k
    state->handler = element6;
1114
6.13k
    return XML_ROLE_GROUP_CHOICE;
1115
79.0k
  }
1116
4
  return common(state, tok);
1117
79.0k
}
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
18.6k
          const ENCODING *enc) {
1179
18.6k
  UNUSED_P(ptr);
1180
18.6k
  UNUSED_P(end);
1181
18.6k
  UNUSED_P(enc);
1182
18.6k
  switch (tok) {
1183
2.10k
  case XML_TOK_PROLOG_S:
1184
2.10k
    return state->role_none;
1185
16.5k
  case XML_TOK_DECL_CLOSE:
1186
16.5k
    setTopLevel(state);
1187
16.5k
    return state->role_none;
1188
18.6k
  }
1189
25
  return common(state, tok);
1190
18.6k
}
1191
1192
/* This function will only be invoked if the internal logic of the
1193
 * parser has broken down.  It is used in two cases:
1194
 *
1195
 * 1: When the XML prolog has been finished.  At this point the
1196
 * processor (the parser level above these role handlers) should
1197
 * switch from prologProcessor to contentProcessor and reinitialise
1198
 * the handler function.
1199
 *
1200
 * 2: When an error has been detected (via common() below).  At this
1201
 * point again the processor should be switched to errorProcessor,
1202
 * which will never call a handler.
1203
 *
1204
 * The result of this is that error() can only be called if the
1205
 * processor switch failed to happen, which is an internal error and
1206
 * therefore we shouldn't be able to provoke it simply by using the
1207
 * library.  It is a necessary backstop, however, so we merely exclude
1208
 * it from the coverage statistics.
1209
 *
1210
 * LCOV_EXCL_START
1211
 */
1212
static int PTRCALL
1213
error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1214
0
      const ENCODING *enc) {
1215
0
  UNUSED_P(state);
1216
0
  UNUSED_P(tok);
1217
0
  UNUSED_P(ptr);
1218
0
  UNUSED_P(end);
1219
0
  UNUSED_P(enc);
1220
0
  return XML_ROLE_NONE;
1221
0
}
1222
/* LCOV_EXCL_STOP */
1223
1224
static int FASTCALL
1225
509
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
509
  UNUSED_P(tok);
1231
509
#endif
1232
509
  state->handler = error;
1233
509
  return XML_ROLE_ERROR;
1234
509
}
1235
1236
void
1237
8.72k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
8.72k
  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.72k
}
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 */