Coverage Report

Created: 2026-01-09 07:09

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