Coverage Report

Created: 2025-11-24 06:25

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