Coverage Report

Created: 2024-07-27 06:44

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