Coverage Report

Created: 2025-10-12 07:14

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