Coverage Report

Created: 2026-03-12 06:35

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