Coverage Report

Created: 2026-01-17 06:58

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