Coverage Report

Created: 2026-06-15 07:03

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