Coverage Report

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