Coverage Report

Created: 2026-10-28 06:38

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-2026 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
   Copyright (c) 2025      Alfonso Gregory <gfunni234@gmail.com>
20
   Licensed under the MIT license:
21
22
   Permission is  hereby granted,  free of charge,  to any  person obtaining
23
   a  copy  of  this  software   and  associated  documentation  files  (the
24
   "Software"),  to  deal in  the  Software  without restriction,  including
25
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
26
   distribute, sublicense, and/or sell copies of the Software, and to permit
27
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
28
   following conditions:
29
30
   The above copyright  notice and this permission notice  shall be included
31
   in all copies or substantial portions of the Software.
32
33
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
34
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
35
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
36
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
37
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
38
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
39
   USE OR OTHER DEALINGS IN THE SOFTWARE.
40
41
   SPDX-License-Identifier: MIT
42
*/
43
44
#include "expat_config.h"
45
46
#include <stddef.h>
47
48
#ifdef _WIN32
49
#  include "winconfig.h"
50
#endif
51
52
#include "internal.h"
53
#include "xmlrole.h"
54
#include "ascii.h"
55
56
/* Doesn't check:
57
58
 that ,| are not mixed in a model group
59
 content of literals
60
61
*/
62
63
static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
64
static const char KW_ATTLIST[]
65
    = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
66
static const char KW_CDATA[]
67
    = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
68
static const char KW_DOCTYPE[]
69
    = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
70
static const char KW_ELEMENT[]
71
    = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
72
static const char KW_EMPTY[]
73
    = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
74
static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
75
                                   ASCII_I, ASCII_E, ASCII_S, '\0'};
76
static const char KW_ENTITY[]
77
    = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
78
static const char KW_FIXED[]
79
    = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
80
static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
81
static const char KW_IDREF[]
82
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
83
static const char KW_IDREFS[]
84
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
85
#ifdef XML_DTD
86
static const char KW_IGNORE[]
87
    = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
88
#endif
89
static const char KW_IMPLIED[]
90
    = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
91
#ifdef XML_DTD
92
static const char KW_INCLUDE[]
93
    = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
94
#endif
95
static const char KW_NDATA[]
96
    = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
97
static const char KW_NMTOKEN[]
98
    = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
99
static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
100
                                   ASCII_E, ASCII_N, ASCII_S, '\0'};
101
static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
102
                                   ASCII_I, ASCII_O, ASCII_N, '\0'};
103
static const char KW_PCDATA[]
104
    = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
105
static const char KW_PUBLIC[]
106
    = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
107
static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
108
                                   ASCII_R, ASCII_E, ASCII_D, '\0'};
109
static const char KW_SYSTEM[]
110
    = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
111
112
#ifndef MIN_BYTES_PER_CHAR
113
#  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
114
#endif
115
116
#ifdef XML_DTD
117
#  define setTopLevel(state)                                                   \
118
    ((state)->handler                                                          \
119
     = ((state)->documentEntity ? internalSubset : externalSubset1))
120
#else /* not XML_DTD */
121
31.6k
#  define setTopLevel(state) ((state)->handler = internalSubset)
122
#endif /* not XML_DTD */
123
124
typedef int PROLOG_HANDLER(PROLOG_STATE *state, int tok, const char *ptr,
125
                           const char *end, const ENCODING *enc);
126
127
static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
128
    doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
129
    entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
130
    notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
131
    attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
132
    attlist9, element0, element1, element2, element3, element4, element5,
133
    element6, element7,
134
#ifdef XML_DTD
135
    externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
136
#endif /* XML_DTD */
137
    declClose, error;
138
139
static int common(PROLOG_STATE *state, int tok);
140
141
static int
142
prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
143
8.57k
        const ENCODING *enc) {
144
8.57k
  switch (tok) {
145
156
  case XML_TOK_PROLOG_S:
146
156
    state->handler = prolog1;
147
156
    return XML_ROLE_NONE;
148
503
  case XML_TOK_XML_DECL:
149
503
    state->handler = prolog1;
150
503
    return XML_ROLE_XML_DECL;
151
219
  case XML_TOK_PI:
152
219
    state->handler = prolog1;
153
219
    return XML_ROLE_PI;
154
64
  case XML_TOK_COMMENT:
155
64
    state->handler = prolog1;
156
64
    return XML_ROLE_COMMENT;
157
290
  case XML_TOK_BOM:
158
290
    return XML_ROLE_NONE;
159
3.06k
  case XML_TOK_DECL_OPEN:
160
3.06k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
161
3.06k
                              KW_DOCTYPE))
162
16
      break;
163
3.05k
    state->handler = doctype0;
164
3.05k
    return XML_ROLE_DOCTYPE_NONE;
165
4.00k
  case XML_TOK_INSTANCE_START:
166
4.00k
    state->handler = error;
167
4.00k
    return XML_ROLE_INSTANCE_START;
168
8.57k
  }
169
289
  return common(state, tok);
170
8.57k
}
171
172
static int
173
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
174
4.88k
        const ENCODING *enc) {
175
4.88k
  switch (tok) {
176
669
  case XML_TOK_PROLOG_S:
177
669
    return XML_ROLE_NONE;
178
3.33k
  case XML_TOK_PI:
179
3.33k
    return XML_ROLE_PI;
180
491
  case XML_TOK_COMMENT:
181
491
    return XML_ROLE_COMMENT;
182
0
  case XML_TOK_BOM:
183
    /* This case can never arise.  To reach this role function, the
184
     * parse must have passed through prolog0 and therefore have had
185
     * some form of input, even if only a space.  At that point, a
186
     * byte order mark is no longer a valid character (though
187
     * technically it should be interpreted as a non-breaking space),
188
     * so will be rejected by the tokenizing stages.
189
     */
190
0
    return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
191
43
  case XML_TOK_DECL_OPEN:
192
43
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
193
43
                              KW_DOCTYPE))
194
3
      break;
195
40
    state->handler = doctype0;
196
40
    return XML_ROLE_DOCTYPE_NONE;
197
334
  case XML_TOK_INSTANCE_START:
198
334
    state->handler = error;
199
334
    return XML_ROLE_INSTANCE_START;
200
4.88k
  }
201
13
  return common(state, tok);
202
4.88k
}
203
204
static int
205
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
206
6.03k
        const ENCODING *enc) {
207
6.03k
  UNUSED_P(ptr);
208
6.03k
  UNUSED_P(end);
209
6.03k
  UNUSED_P(enc);
210
6.03k
  switch (tok) {
211
2.09k
  case XML_TOK_PROLOG_S:
212
2.09k
    return XML_ROLE_NONE;
213
2.29k
  case XML_TOK_PI:
214
2.29k
    return XML_ROLE_PI;
215
594
  case XML_TOK_COMMENT:
216
594
    return XML_ROLE_COMMENT;
217
1.03k
  case XML_TOK_INSTANCE_START:
218
1.03k
    state->handler = error;
219
1.03k
    return XML_ROLE_INSTANCE_START;
220
6.03k
  }
221
14
  return common(state, tok);
222
6.03k
}
223
224
static int
225
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
226
6.18k
         const ENCODING *enc) {
227
6.18k
  UNUSED_P(ptr);
228
6.18k
  UNUSED_P(end);
229
6.18k
  UNUSED_P(enc);
230
6.18k
  switch (tok) {
231
3.09k
  case XML_TOK_PROLOG_S:
232
3.09k
    return XML_ROLE_DOCTYPE_NONE;
233
3.08k
  case XML_TOK_NAME:
234
3.08k
  case XML_TOK_PREFIXED_NAME:
235
3.08k
    state->handler = doctype1;
236
3.08k
    return XML_ROLE_DOCTYPE_NAME;
237
6.18k
  }
238
4
  return common(state, tok);
239
6.18k
}
240
241
static int
242
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
243
3.70k
         const ENCODING *enc) {
244
3.70k
  switch (tok) {
245
621
  case XML_TOK_PROLOG_S:
246
621
    return XML_ROLE_DOCTYPE_NONE;
247
2.43k
  case XML_TOK_OPEN_BRACKET:
248
2.43k
    state->handler = internalSubset;
249
2.43k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
250
37
  case XML_TOK_DECL_CLOSE:
251
37
    state->handler = prolog2;
252
37
    return XML_ROLE_DOCTYPE_CLOSE;
253
608
  case XML_TOK_NAME:
254
608
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
255
29
      state->handler = doctype3;
256
29
      return XML_ROLE_DOCTYPE_NONE;
257
29
    }
258
579
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
259
573
      state->handler = doctype2;
260
573
      return XML_ROLE_DOCTYPE_NONE;
261
573
    }
262
6
    break;
263
3.70k
  }
264
8
  return common(state, tok);
265
3.70k
}
266
267
static int
268
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
269
1.14k
         const ENCODING *enc) {
270
1.14k
  UNUSED_P(ptr);
271
1.14k
  UNUSED_P(end);
272
1.14k
  UNUSED_P(enc);
273
1.14k
  switch (tok) {
274
572
  case XML_TOK_PROLOG_S:
275
572
    return XML_ROLE_DOCTYPE_NONE;
276
564
  case XML_TOK_LITERAL:
277
564
    state->handler = doctype3;
278
564
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
279
1.14k
  }
280
4
  return common(state, tok);
281
1.14k
}
282
283
static int
284
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
285
864
         const ENCODING *enc) {
286
864
  UNUSED_P(ptr);
287
864
  UNUSED_P(end);
288
864
  UNUSED_P(enc);
289
864
  switch (tok) {
290
432
  case XML_TOK_PROLOG_S:
291
432
    return XML_ROLE_DOCTYPE_NONE;
292
404
  case XML_TOK_LITERAL:
293
404
    state->handler = doctype4;
294
404
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
295
864
  }
296
28
  return common(state, tok);
297
864
}
298
299
static int
300
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
301
426
         const ENCODING *enc) {
302
426
  UNUSED_P(ptr);
303
426
  UNUSED_P(end);
304
426
  UNUSED_P(enc);
305
426
  switch (tok) {
306
30
  case XML_TOK_PROLOG_S:
307
30
    return XML_ROLE_DOCTYPE_NONE;
308
143
  case XML_TOK_OPEN_BRACKET:
309
143
    state->handler = internalSubset;
310
143
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
311
249
  case XML_TOK_DECL_CLOSE:
312
249
    state->handler = prolog2;
313
249
    return XML_ROLE_DOCTYPE_CLOSE;
314
426
  }
315
4
  return common(state, tok);
316
426
}
317
318
static int
319
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
320
872
         const ENCODING *enc) {
321
872
  UNUSED_P(ptr);
322
872
  UNUSED_P(end);
323
872
  UNUSED_P(enc);
324
872
  switch (tok) {
325
65
  case XML_TOK_PROLOG_S:
326
65
    return XML_ROLE_DOCTYPE_NONE;
327
804
  case XML_TOK_DECL_CLOSE:
328
804
    state->handler = prolog2;
329
804
    return XML_ROLE_DOCTYPE_CLOSE;
330
872
  }
331
3
  return common(state, tok);
332
872
}
333
334
static int
335
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
336
43.3k
               const ENCODING *enc) {
337
43.3k
  switch (tok) {
338
6.21k
  case XML_TOK_PROLOG_S:
339
6.21k
    return XML_ROLE_NONE;
340
33.2k
  case XML_TOK_DECL_OPEN:
341
33.2k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
342
33.2k
                            KW_ENTITY)) {
343
10.5k
      state->handler = entity0;
344
10.5k
      return XML_ROLE_ENTITY_NONE;
345
10.5k
    }
346
22.7k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
347
22.7k
                            KW_ATTLIST)) {
348
16.4k
      state->handler = attlist0;
349
16.4k
      return XML_ROLE_ATTLIST_NONE;
350
16.4k
    }
351
6.21k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
352
6.21k
                            KW_ELEMENT)) {
353
4.25k
      state->handler = element0;
354
4.25k
      return XML_ROLE_ELEMENT_NONE;
355
4.25k
    }
356
1.96k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
357
1.96k
                            KW_NOTATION)) {
358
1.93k
      state->handler = notation0;
359
1.93k
      return XML_ROLE_NOTATION_NONE;
360
1.93k
    }
361
26
    break;
362
256
  case XML_TOK_PI:
363
256
    return XML_ROLE_PI;
364
194
  case XML_TOK_COMMENT:
365
194
    return XML_ROLE_COMMENT;
366
2.62k
  case XML_TOK_PARAM_ENTITY_REF:
367
2.62k
    return XML_ROLE_PARAM_ENTITY_REF;
368
812
  case XML_TOK_CLOSE_BRACKET:
369
812
    state->handler = doctype5;
370
812
    return XML_ROLE_DOCTYPE_NONE;
371
0
  case XML_TOK_NONE:
372
0
    return XML_ROLE_NONE;
373
43.3k
  }
374
65
  return common(state, tok);
375
43.3k
}
376
377
#ifdef XML_DTD
378
379
static int
380
externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
381
                const ENCODING *enc) {
382
  state->handler = externalSubset1;
383
  if (tok == XML_TOK_XML_DECL)
384
    return XML_ROLE_TEXT_DECL;
385
  return externalSubset1(state, tok, ptr, end, enc);
386
}
387
388
static int
389
externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
390
                const ENCODING *enc) {
391
  switch (tok) {
392
  case XML_TOK_COND_SECT_OPEN:
393
    state->handler = condSect0;
394
    return XML_ROLE_NONE;
395
  case XML_TOK_COND_SECT_CLOSE:
396
    if (state->includeLevel == 0)
397
      break;
398
    state->includeLevel -= 1;
399
    return XML_ROLE_NONE;
400
  case XML_TOK_PROLOG_S:
401
    return XML_ROLE_NONE;
402
  case XML_TOK_CLOSE_BRACKET:
403
    break;
404
  case XML_TOK_NONE:
405
    if (state->includeLevel)
406
      break;
407
    return XML_ROLE_NONE;
408
  default:
409
    return internalSubset(state, tok, ptr, end, enc);
410
  }
411
  return common(state, tok);
412
}
413
414
#endif /* XML_DTD */
415
416
static int
417
entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
418
21.0k
        const ENCODING *enc) {
419
21.0k
  UNUSED_P(ptr);
420
21.0k
  UNUSED_P(end);
421
21.0k
  UNUSED_P(enc);
422
21.0k
  switch (tok) {
423
10.5k
  case XML_TOK_PROLOG_S:
424
10.5k
    return XML_ROLE_ENTITY_NONE;
425
3.33k
  case XML_TOK_PERCENT:
426
3.33k
    state->handler = entity1;
427
3.33k
    return XML_ROLE_ENTITY_NONE;
428
7.18k
  case XML_TOK_NAME:
429
7.18k
    state->handler = entity2;
430
7.18k
    return XML_ROLE_GENERAL_ENTITY_NAME;
431
21.0k
  }
432
3
  return common(state, tok);
433
21.0k
}
434
435
static int
436
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
437
6.66k
        const ENCODING *enc) {
438
6.66k
  UNUSED_P(ptr);
439
6.66k
  UNUSED_P(end);
440
6.66k
  UNUSED_P(enc);
441
6.66k
  switch (tok) {
442
3.34k
  case XML_TOK_PROLOG_S:
443
3.34k
    return XML_ROLE_ENTITY_NONE;
444
3.30k
  case XML_TOK_NAME:
445
3.30k
    state->handler = entity7;
446
3.30k
    return XML_ROLE_PARAM_ENTITY_NAME;
447
6.66k
  }
448
10
  return common(state, tok);
449
6.66k
}
450
451
static int
452
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
453
14.3k
        const ENCODING *enc) {
454
14.3k
  switch (tok) {
455
7.16k
  case XML_TOK_PROLOG_S:
456
7.16k
    return XML_ROLE_ENTITY_NONE;
457
3.69k
  case XML_TOK_NAME:
458
3.69k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
459
1.23k
      state->handler = entity4;
460
1.23k
      return XML_ROLE_ENTITY_NONE;
461
1.23k
    }
462
2.46k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
463
2.45k
      state->handler = entity3;
464
2.45k
      return XML_ROLE_ENTITY_NONE;
465
2.45k
    }
466
2
    break;
467
3.44k
  case XML_TOK_LITERAL:
468
3.44k
    state->handler = declClose;
469
3.44k
    state->role_none = XML_ROLE_ENTITY_NONE;
470
3.44k
    return XML_ROLE_ENTITY_VALUE;
471
14.3k
  }
472
5
  return common(state, tok);
473
14.3k
}
474
475
static int
476
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
477
4.90k
        const ENCODING *enc) {
478
4.90k
  UNUSED_P(ptr);
479
4.90k
  UNUSED_P(end);
480
4.90k
  UNUSED_P(enc);
481
4.90k
  switch (tok) {
482
2.46k
  case XML_TOK_PROLOG_S:
483
2.46k
    return XML_ROLE_ENTITY_NONE;
484
2.44k
  case XML_TOK_LITERAL:
485
2.44k
    state->handler = entity4;
486
2.44k
    return XML_ROLE_ENTITY_PUBLIC_ID;
487
4.90k
  }
488
1
  return common(state, tok);
489
4.90k
}
490
491
static int
492
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
493
7.21k
        const ENCODING *enc) {
494
7.21k
  UNUSED_P(ptr);
495
7.21k
  UNUSED_P(end);
496
7.21k
  UNUSED_P(enc);
497
7.21k
  switch (tok) {
498
3.62k
  case XML_TOK_PROLOG_S:
499
3.62k
    return XML_ROLE_ENTITY_NONE;
500
3.58k
  case XML_TOK_LITERAL:
501
3.58k
    state->handler = entity5;
502
3.58k
    return XML_ROLE_ENTITY_SYSTEM_ID;
503
7.21k
  }
504
9
  return common(state, tok);
505
7.21k
}
506
507
static int
508
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
509
4.12k
        const ENCODING *enc) {
510
4.12k
  switch (tok) {
511
563
  case XML_TOK_PROLOG_S:
512
563
    return XML_ROLE_ENTITY_NONE;
513
3.10k
  case XML_TOK_DECL_CLOSE:
514
3.10k
    setTopLevel(state);
515
3.10k
    return XML_ROLE_ENTITY_COMPLETE;
516
457
  case XML_TOK_NAME:
517
457
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
518
454
      state->handler = entity6;
519
454
      return XML_ROLE_ENTITY_NONE;
520
454
    }
521
3
    break;
522
4.12k
  }
523
5
  return common(state, tok);
524
4.12k
}
525
526
static int
527
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
528
892
        const ENCODING *enc) {
529
892
  UNUSED_P(ptr);
530
892
  UNUSED_P(end);
531
892
  UNUSED_P(enc);
532
892
  switch (tok) {
533
449
  case XML_TOK_PROLOG_S:
534
449
    return XML_ROLE_ENTITY_NONE;
535
442
  case XML_TOK_NAME:
536
442
    state->handler = declClose;
537
442
    state->role_none = XML_ROLE_ENTITY_NONE;
538
442
    return XML_ROLE_ENTITY_NOTATION_NAME;
539
892
  }
540
1
  return common(state, tok);
541
892
}
542
543
static int
544
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
545
6.60k
        const ENCODING *enc) {
546
6.60k
  switch (tok) {
547
3.30k
  case XML_TOK_PROLOG_S:
548
3.30k
    return XML_ROLE_ENTITY_NONE;
549
2.11k
  case XML_TOK_NAME:
550
2.11k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
551
672
      state->handler = entity9;
552
672
      return XML_ROLE_ENTITY_NONE;
553
672
    }
554
1.44k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
555
1.44k
      state->handler = entity8;
556
1.44k
      return XML_ROLE_ENTITY_NONE;
557
1.44k
    }
558
1
    break;
559
1.16k
  case XML_TOK_LITERAL:
560
1.16k
    state->handler = declClose;
561
1.16k
    state->role_none = XML_ROLE_ENTITY_NONE;
562
1.16k
    return XML_ROLE_ENTITY_VALUE;
563
6.60k
  }
564
11
  return common(state, tok);
565
6.60k
}
566
567
static int
568
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
569
2.87k
        const ENCODING *enc) {
570
2.87k
  UNUSED_P(ptr);
571
2.87k
  UNUSED_P(end);
572
2.87k
  UNUSED_P(enc);
573
2.87k
  switch (tok) {
574
1.44k
  case XML_TOK_PROLOG_S:
575
1.44k
    return XML_ROLE_ENTITY_NONE;
576
1.43k
  case XML_TOK_LITERAL:
577
1.43k
    state->handler = entity9;
578
1.43k
    return XML_ROLE_ENTITY_PUBLIC_ID;
579
2.87k
  }
580
1
  return common(state, tok);
581
2.87k
}
582
583
static int
584
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
585
4.16k
        const ENCODING *enc) {
586
4.16k
  UNUSED_P(ptr);
587
4.16k
  UNUSED_P(end);
588
4.16k
  UNUSED_P(enc);
589
4.16k
  switch (tok) {
590
2.09k
  case XML_TOK_PROLOG_S:
591
2.09k
    return XML_ROLE_ENTITY_NONE;
592
2.07k
  case XML_TOK_LITERAL:
593
2.07k
    state->handler = entity10;
594
2.07k
    return XML_ROLE_ENTITY_SYSTEM_ID;
595
4.16k
  }
596
2
  return common(state, tok);
597
4.16k
}
598
599
static int
600
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
601
2.50k
         const ENCODING *enc) {
602
2.50k
  UNUSED_P(ptr);
603
2.50k
  UNUSED_P(end);
604
2.50k
  UNUSED_P(enc);
605
2.50k
  switch (tok) {
606
438
  case XML_TOK_PROLOG_S:
607
438
    return XML_ROLE_ENTITY_NONE;
608
2.06k
  case XML_TOK_DECL_CLOSE:
609
2.06k
    setTopLevel(state);
610
2.06k
    return XML_ROLE_ENTITY_COMPLETE;
611
2.50k
  }
612
2
  return common(state, tok);
613
2.50k
}
614
615
static int
616
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
617
3.85k
          const ENCODING *enc) {
618
3.85k
  UNUSED_P(ptr);
619
3.85k
  UNUSED_P(end);
620
3.85k
  UNUSED_P(enc);
621
3.85k
  switch (tok) {
622
1.94k
  case XML_TOK_PROLOG_S:
623
1.94k
    return XML_ROLE_NOTATION_NONE;
624
1.91k
  case XML_TOK_NAME:
625
1.91k
    state->handler = notation1;
626
1.91k
    return XML_ROLE_NOTATION_NAME;
627
3.85k
  }
628
1
  return common(state, tok);
629
3.85k
}
630
631
static int
632
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
633
3.81k
          const ENCODING *enc) {
634
3.81k
  switch (tok) {
635
1.91k
  case XML_TOK_PROLOG_S:
636
1.91k
    return XML_ROLE_NOTATION_NONE;
637
1.89k
  case XML_TOK_NAME:
638
1.89k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
639
907
      state->handler = notation3;
640
907
      return XML_ROLE_NOTATION_NONE;
641
907
    }
642
990
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
643
987
      state->handler = notation2;
644
987
      return XML_ROLE_NOTATION_NONE;
645
987
    }
646
3
    break;
647
3.81k
  }
648
4
  return common(state, tok);
649
3.81k
}
650
651
static int
652
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
653
1.95k
          const ENCODING *enc) {
654
1.95k
  UNUSED_P(ptr);
655
1.95k
  UNUSED_P(end);
656
1.95k
  UNUSED_P(enc);
657
1.95k
  switch (tok) {
658
987
  case XML_TOK_PROLOG_S:
659
987
    return XML_ROLE_NOTATION_NONE;
660
967
  case XML_TOK_LITERAL:
661
967
    state->handler = notation4;
662
967
    return XML_ROLE_NOTATION_PUBLIC_ID;
663
1.95k
  }
664
3
  return common(state, tok);
665
1.95k
}
666
667
static int
668
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
669
1.80k
          const ENCODING *enc) {
670
1.80k
  UNUSED_P(ptr);
671
1.80k
  UNUSED_P(end);
672
1.80k
  UNUSED_P(enc);
673
1.80k
  switch (tok) {
674
918
  case XML_TOK_PROLOG_S:
675
918
    return XML_ROLE_NOTATION_NONE;
676
889
  case XML_TOK_LITERAL:
677
889
    state->handler = declClose;
678
889
    state->role_none = XML_ROLE_NOTATION_NONE;
679
889
    return XML_ROLE_NOTATION_SYSTEM_ID;
680
1.80k
  }
681
1
  return common(state, tok);
682
1.80k
}
683
684
static int
685
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
686
1.69k
          const ENCODING *enc) {
687
1.69k
  UNUSED_P(ptr);
688
1.69k
  UNUSED_P(end);
689
1.69k
  UNUSED_P(enc);
690
1.69k
  switch (tok) {
691
742
  case XML_TOK_PROLOG_S:
692
742
    return XML_ROLE_NOTATION_NONE;
693
199
  case XML_TOK_LITERAL:
694
199
    state->handler = declClose;
695
199
    state->role_none = XML_ROLE_NOTATION_NONE;
696
199
    return XML_ROLE_NOTATION_SYSTEM_ID;
697
753
  case XML_TOK_DECL_CLOSE:
698
753
    setTopLevel(state);
699
753
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
700
1.69k
  }
701
4
  return common(state, tok);
702
1.69k
}
703
704
static int
705
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
706
32.9k
         const ENCODING *enc) {
707
32.9k
  UNUSED_P(ptr);
708
32.9k
  UNUSED_P(end);
709
32.9k
  UNUSED_P(enc);
710
32.9k
  switch (tok) {
711
16.4k
  case XML_TOK_PROLOG_S:
712
16.4k
    return XML_ROLE_ATTLIST_NONE;
713
16.4k
  case XML_TOK_NAME:
714
16.4k
  case XML_TOK_PREFIXED_NAME:
715
16.4k
    state->handler = attlist1;
716
16.4k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
717
32.9k
  }
718
4
  return common(state, tok);
719
32.9k
}
720
721
static int
722
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
723
287k
         const ENCODING *enc) {
724
287k
  UNUSED_P(ptr);
725
287k
  UNUSED_P(end);
726
287k
  UNUSED_P(enc);
727
287k
  switch (tok) {
728
135k
  case XML_TOK_PROLOG_S:
729
135k
    return XML_ROLE_ATTLIST_NONE;
730
15.9k
  case XML_TOK_DECL_CLOSE:
731
15.9k
    setTopLevel(state);
732
15.9k
    return XML_ROLE_ATTLIST_NONE;
733
135k
  case XML_TOK_NAME:
734
135k
  case XML_TOK_PREFIXED_NAME:
735
135k
    state->handler = attlist2;
736
135k
    return XML_ROLE_ATTRIBUTE_NAME;
737
287k
  }
738
27
  return common(state, tok);
739
287k
}
740
741
static int
742
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
743
271k
         const ENCODING *enc) {
744
271k
  switch (tok) {
745
135k
  case XML_TOK_PROLOG_S:
746
135k
    return XML_ROLE_ATTLIST_NONE;
747
22.2k
  case XML_TOK_NAME: {
748
22.2k
    static const char *const types[] = {
749
22.2k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
750
22.2k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
751
22.2k
    };
752
22.2k
    int i;
753
69.6k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
754
69.1k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
755
21.7k
        state->handler = attlist8;
756
21.7k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
757
21.7k
      }
758
22.2k
  }
759
481
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
760
470
      state->handler = attlist5;
761
470
      return XML_ROLE_ATTLIST_NONE;
762
470
    }
763
11
    break;
764
113k
  case XML_TOK_OPEN_PAREN:
765
113k
    state->handler = attlist3;
766
113k
    return XML_ROLE_ATTLIST_NONE;
767
271k
  }
768
19
  return common(state, tok);
769
271k
}
770
771
static int
772
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
773
116k
         const ENCODING *enc) {
774
116k
  UNUSED_P(ptr);
775
116k
  UNUSED_P(end);
776
116k
  UNUSED_P(enc);
777
116k
  switch (tok) {
778
471
  case XML_TOK_PROLOG_S:
779
471
    return XML_ROLE_ATTLIST_NONE;
780
2.28k
  case XML_TOK_NMTOKEN:
781
115k
  case XML_TOK_NAME:
782
115k
  case XML_TOK_PREFIXED_NAME:
783
115k
    state->handler = attlist4;
784
115k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
785
116k
  }
786
1
  return common(state, tok);
787
116k
}
788
789
static int
790
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
791
115k
         const ENCODING *enc) {
792
115k
  UNUSED_P(ptr);
793
115k
  UNUSED_P(end);
794
115k
  UNUSED_P(enc);
795
115k
  switch (tok) {
796
387
  case XML_TOK_PROLOG_S:
797
387
    return XML_ROLE_ATTLIST_NONE;
798
113k
  case XML_TOK_CLOSE_PAREN:
799
113k
    state->handler = attlist8;
800
113k
    return XML_ROLE_ATTLIST_NONE;
801
2.40k
  case XML_TOK_OR:
802
2.40k
    state->handler = attlist3;
803
2.40k
    return XML_ROLE_ATTLIST_NONE;
804
115k
  }
805
9
  return common(state, tok);
806
115k
}
807
808
static int
809
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
810
925
         const ENCODING *enc) {
811
925
  UNUSED_P(ptr);
812
925
  UNUSED_P(end);
813
925
  UNUSED_P(enc);
814
925
  switch (tok) {
815
473
  case XML_TOK_PROLOG_S:
816
473
    return XML_ROLE_ATTLIST_NONE;
817
451
  case XML_TOK_OPEN_PAREN:
818
451
    state->handler = attlist6;
819
451
    return XML_ROLE_ATTLIST_NONE;
820
925
  }
821
1
  return common(state, tok);
822
925
}
823
824
static int
825
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
826
1.66k
         const ENCODING *enc) {
827
1.66k
  UNUSED_P(ptr);
828
1.66k
  UNUSED_P(end);
829
1.66k
  UNUSED_P(enc);
830
1.66k
  switch (tok) {
831
297
  case XML_TOK_PROLOG_S:
832
297
    return XML_ROLE_ATTLIST_NONE;
833
1.36k
  case XML_TOK_NAME:
834
1.36k
    state->handler = attlist7;
835
1.36k
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
836
1.66k
  }
837
2
  return common(state, tok);
838
1.66k
}
839
840
static int
841
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
842
1.86k
         const ENCODING *enc) {
843
1.86k
  UNUSED_P(ptr);
844
1.86k
  UNUSED_P(end);
845
1.86k
  UNUSED_P(enc);
846
1.86k
  switch (tok) {
847
517
  case XML_TOK_PROLOG_S:
848
517
    return XML_ROLE_ATTLIST_NONE;
849
405
  case XML_TOK_CLOSE_PAREN:
850
405
    state->handler = attlist8;
851
405
    return XML_ROLE_ATTLIST_NONE;
852
937
  case XML_TOK_OR:
853
937
    state->handler = attlist6;
854
937
    return XML_ROLE_ATTLIST_NONE;
855
1.86k
  }
856
2
  return common(state, tok);
857
1.86k
}
858
859
/* default value */
860
static int
861
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
862
270k
         const ENCODING *enc) {
863
270k
  switch (tok) {
864
135k
  case XML_TOK_PROLOG_S:
865
135k
    return XML_ROLE_ATTLIST_NONE;
866
115k
  case XML_TOK_POUND_NAME:
867
115k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
868
115k
                            KW_IMPLIED)) {
869
114k
      state->handler = attlist1;
870
114k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
871
114k
    }
872
796
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
873
796
                            KW_REQUIRED)) {
874
197
      state->handler = attlist1;
875
197
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
876
197
    }
877
599
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
878
599
                            KW_FIXED)) {
879
595
      state->handler = attlist9;
880
595
      return XML_ROLE_ATTLIST_NONE;
881
595
    }
882
4
    break;
883
19.5k
  case XML_TOK_LITERAL:
884
19.5k
    state->handler = attlist1;
885
19.5k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
886
270k
  }
887
6
  return common(state, tok);
888
270k
}
889
890
static int
891
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
892
1.17k
         const ENCODING *enc) {
893
1.17k
  UNUSED_P(ptr);
894
1.17k
  UNUSED_P(end);
895
1.17k
  UNUSED_P(enc);
896
1.17k
  switch (tok) {
897
597
  case XML_TOK_PROLOG_S:
898
597
    return XML_ROLE_ATTLIST_NONE;
899
566
  case XML_TOK_LITERAL:
900
566
    state->handler = attlist1;
901
566
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
902
1.17k
  }
903
9
  return common(state, tok);
904
1.17k
}
905
906
static int
907
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
908
8.50k
         const ENCODING *enc) {
909
8.50k
  UNUSED_P(ptr);
910
8.50k
  UNUSED_P(end);
911
8.50k
  UNUSED_P(enc);
912
8.50k
  switch (tok) {
913
4.25k
  case XML_TOK_PROLOG_S:
914
4.25k
    return XML_ROLE_ELEMENT_NONE;
915
4.24k
  case XML_TOK_NAME:
916
4.24k
  case XML_TOK_PREFIXED_NAME:
917
4.24k
    state->handler = element1;
918
4.24k
    return XML_ROLE_ELEMENT_NAME;
919
8.50k
  }
920
4
  return common(state, tok);
921
8.50k
}
922
923
static int
924
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
925
8.47k
         const ENCODING *enc) {
926
8.47k
  switch (tok) {
927
4.24k
  case XML_TOK_PROLOG_S:
928
4.24k
    return XML_ROLE_ELEMENT_NONE;
929
360
  case XML_TOK_NAME:
930
360
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
931
66
      state->handler = declClose;
932
66
      state->role_none = XML_ROLE_ELEMENT_NONE;
933
66
      return XML_ROLE_CONTENT_EMPTY;
934
66
    }
935
294
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
936
292
      state->handler = declClose;
937
292
      state->role_none = XML_ROLE_ELEMENT_NONE;
938
292
      return XML_ROLE_CONTENT_ANY;
939
292
    }
940
2
    break;
941
3.86k
  case XML_TOK_OPEN_PAREN:
942
3.86k
    state->handler = element2;
943
3.86k
    state->level = 1;
944
3.86k
    return XML_ROLE_GROUP_OPEN;
945
8.47k
  }
946
3
  return common(state, tok);
947
8.47k
}
948
949
static int
950
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
951
4.82k
         const ENCODING *enc) {
952
4.82k
  switch (tok) {
953
981
  case XML_TOK_PROLOG_S:
954
981
    return XML_ROLE_ELEMENT_NONE;
955
1.33k
  case XML_TOK_POUND_NAME:
956
1.33k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
957
1.33k
                            KW_PCDATA)) {
958
1.33k
      state->handler = element3;
959
1.33k
      return XML_ROLE_CONTENT_PCDATA;
960
1.33k
    }
961
6
    break;
962
639
  case XML_TOK_OPEN_PAREN:
963
639
    state->level = 2;
964
639
    state->handler = element6;
965
639
    return XML_ROLE_GROUP_OPEN;
966
1.26k
  case XML_TOK_NAME:
967
1.26k
  case XML_TOK_PREFIXED_NAME:
968
1.26k
    state->handler = element7;
969
1.26k
    return XML_ROLE_CONTENT_ELEMENT;
970
327
  case XML_TOK_NAME_QUESTION:
971
327
    state->handler = element7;
972
327
    return XML_ROLE_CONTENT_ELEMENT_OPT;
973
203
  case XML_TOK_NAME_ASTERISK:
974
203
    state->handler = element7;
975
203
    return XML_ROLE_CONTENT_ELEMENT_REP;
976
79
  case XML_TOK_NAME_PLUS:
977
79
    state->handler = element7;
978
79
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
979
4.82k
  }
980
8
  return common(state, tok);
981
4.82k
}
982
983
static int
984
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
985
1.64k
         const ENCODING *enc) {
986
1.64k
  UNUSED_P(ptr);
987
1.64k
  UNUSED_P(end);
988
1.64k
  UNUSED_P(enc);
989
1.64k
  switch (tok) {
990
325
  case XML_TOK_PROLOG_S:
991
325
    return XML_ROLE_ELEMENT_NONE;
992
366
  case XML_TOK_CLOSE_PAREN:
993
366
    state->handler = declClose;
994
366
    state->role_none = XML_ROLE_ELEMENT_NONE;
995
366
    return XML_ROLE_GROUP_CLOSE;
996
195
  case XML_TOK_CLOSE_PAREN_ASTERISK:
997
195
    state->handler = declClose;
998
195
    state->role_none = XML_ROLE_ELEMENT_NONE;
999
195
    return XML_ROLE_GROUP_CLOSE_REP;
1000
753
  case XML_TOK_OR:
1001
753
    state->handler = element4;
1002
753
    return XML_ROLE_ELEMENT_NONE;
1003
1.64k
  }
1004
3
  return common(state, tok);
1005
1.64k
}
1006
1007
static int
1008
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1009
2.14k
         const ENCODING *enc) {
1010
2.14k
  UNUSED_P(ptr);
1011
2.14k
  UNUSED_P(end);
1012
2.14k
  UNUSED_P(enc);
1013
2.14k
  switch (tok) {
1014
389
  case XML_TOK_PROLOG_S:
1015
389
    return XML_ROLE_ELEMENT_NONE;
1016
1.75k
  case XML_TOK_NAME:
1017
1.75k
  case XML_TOK_PREFIXED_NAME:
1018
1.75k
    state->handler = element5;
1019
1.75k
    return XML_ROLE_CONTENT_ELEMENT;
1020
2.14k
  }
1021
8
  return common(state, tok);
1022
2.14k
}
1023
1024
static int
1025
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1026
2.33k
         const ENCODING *enc) {
1027
2.33k
  UNUSED_P(ptr);
1028
2.33k
  UNUSED_P(end);
1029
2.33k
  UNUSED_P(enc);
1030
2.33k
  switch (tok) {
1031
606
  case XML_TOK_PROLOG_S:
1032
606
    return XML_ROLE_ELEMENT_NONE;
1033
693
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1034
693
    state->handler = declClose;
1035
693
    state->role_none = XML_ROLE_ELEMENT_NONE;
1036
693
    return XML_ROLE_GROUP_CLOSE_REP;
1037
1.03k
  case XML_TOK_OR:
1038
1.03k
    state->handler = element4;
1039
1.03k
    return XML_ROLE_ELEMENT_NONE;
1040
2.33k
  }
1041
1
  return common(state, tok);
1042
2.33k
}
1043
1044
static int
1045
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1046
5.14M
         const ENCODING *enc) {
1047
5.14M
  UNUSED_P(ptr);
1048
5.14M
  UNUSED_P(end);
1049
5.14M
  UNUSED_P(enc);
1050
5.14M
  switch (tok) {
1051
89.0k
  case XML_TOK_PROLOG_S:
1052
89.0k
    return XML_ROLE_ELEMENT_NONE;
1053
4.86M
  case XML_TOK_OPEN_PAREN:
1054
4.86M
    state->level += 1;
1055
4.86M
    return XML_ROLE_GROUP_OPEN;
1056
145k
  case XML_TOK_NAME:
1057
145k
  case XML_TOK_PREFIXED_NAME:
1058
145k
    state->handler = element7;
1059
145k
    return XML_ROLE_CONTENT_ELEMENT;
1060
5.98k
  case XML_TOK_NAME_QUESTION:
1061
5.98k
    state->handler = element7;
1062
5.98k
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1063
5.22k
  case XML_TOK_NAME_ASTERISK:
1064
5.22k
    state->handler = element7;
1065
5.22k
    return XML_ROLE_CONTENT_ELEMENT_REP;
1066
42.8k
  case XML_TOK_NAME_PLUS:
1067
42.8k
    state->handler = element7;
1068
42.8k
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1069
5.14M
  }
1070
21
  return common(state, tok);
1071
5.14M
}
1072
1073
static int
1074
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1075
467k
         const ENCODING *enc) {
1076
467k
  UNUSED_P(ptr);
1077
467k
  UNUSED_P(end);
1078
467k
  UNUSED_P(enc);
1079
467k
  switch (tok) {
1080
19.5k
  case XML_TOK_PROLOG_S:
1081
19.5k
    return XML_ROLE_ELEMENT_NONE;
1082
113k
  case XML_TOK_CLOSE_PAREN:
1083
113k
    state->level -= 1;
1084
113k
    if (state->level == 0) {
1085
1.38k
      state->handler = declClose;
1086
1.38k
      state->role_none = XML_ROLE_ELEMENT_NONE;
1087
1.38k
    }
1088
113k
    return XML_ROLE_GROUP_CLOSE;
1089
17.3k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1090
17.3k
    state->level -= 1;
1091
17.3k
    if (state->level == 0) {
1092
352
      state->handler = declClose;
1093
352
      state->role_none = XML_ROLE_ELEMENT_NONE;
1094
352
    }
1095
17.3k
    return XML_ROLE_GROUP_CLOSE_REP;
1096
46.6k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1097
46.6k
    state->level -= 1;
1098
46.6k
    if (state->level == 0) {
1099
209
      state->handler = declClose;
1100
209
      state->role_none = XML_ROLE_ELEMENT_NONE;
1101
209
    }
1102
46.6k
    return XML_ROLE_GROUP_CLOSE_OPT;
1103
71.3k
  case XML_TOK_CLOSE_PAREN_PLUS:
1104
71.3k
    state->level -= 1;
1105
71.3k
    if (state->level == 0) {
1106
310
      state->handler = declClose;
1107
310
      state->role_none = XML_ROLE_ELEMENT_NONE;
1108
310
    }
1109
71.3k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1110
108k
  case XML_TOK_COMMA:
1111
108k
    state->handler = element6;
1112
108k
    return XML_ROLE_GROUP_SEQUENCE;
1113
90.7k
  case XML_TOK_OR:
1114
90.7k
    state->handler = element6;
1115
90.7k
    return XML_ROLE_GROUP_CHOICE;
1116
467k
  }
1117
12
  return common(state, tok);
1118
467k
}
1119
1120
#ifdef XML_DTD
1121
1122
static int
1123
condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1124
          const ENCODING *enc) {
1125
  switch (tok) {
1126
  case XML_TOK_PROLOG_S:
1127
    return XML_ROLE_NONE;
1128
  case XML_TOK_NAME:
1129
    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1130
      state->handler = condSect1;
1131
      return XML_ROLE_NONE;
1132
    }
1133
    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1134
      state->handler = condSect2;
1135
      return XML_ROLE_NONE;
1136
    }
1137
    break;
1138
  }
1139
  return common(state, tok);
1140
}
1141
1142
static int
1143
condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1144
          const ENCODING *enc) {
1145
  UNUSED_P(ptr);
1146
  UNUSED_P(end);
1147
  UNUSED_P(enc);
1148
  switch (tok) {
1149
  case XML_TOK_PROLOG_S:
1150
    return XML_ROLE_NONE;
1151
  case XML_TOK_OPEN_BRACKET:
1152
    state->handler = externalSubset1;
1153
    state->includeLevel += 1;
1154
    return XML_ROLE_NONE;
1155
  }
1156
  return common(state, tok);
1157
}
1158
1159
static int
1160
condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1161
          const ENCODING *enc) {
1162
  UNUSED_P(ptr);
1163
  UNUSED_P(end);
1164
  UNUSED_P(enc);
1165
  switch (tok) {
1166
  case XML_TOK_PROLOG_S:
1167
    return XML_ROLE_NONE;
1168
  case XML_TOK_OPEN_BRACKET:
1169
    state->handler = externalSubset1;
1170
    return XML_ROLE_IGNORE_SECT;
1171
  }
1172
  return common(state, tok);
1173
}
1174
1175
#endif /* XML_DTD */
1176
1177
static int
1178
declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1179
10.4k
          const ENCODING *enc) {
1180
10.4k
  UNUSED_P(ptr);
1181
10.4k
  UNUSED_P(end);
1182
10.4k
  UNUSED_P(enc);
1183
10.4k
  switch (tok) {
1184
545
  case XML_TOK_PROLOG_S:
1185
545
    return state->role_none;
1186
9.81k
  case XML_TOK_DECL_CLOSE:
1187
9.81k
    setTopLevel(state);
1188
9.81k
    return state->role_none;
1189
10.4k
  }
1190
53
  return common(state, tok);
1191
10.4k
}
1192
1193
/* This function will only be invoked if the internal logic of the
1194
 * parser has broken down.  It is used in two cases:
1195
 *
1196
 * 1: When the XML prolog has been finished.  At this point the
1197
 * processor (the parser level above these role handlers) should
1198
 * switch from prologProcessor to contentProcessor and reinitialise
1199
 * the handler function.
1200
 *
1201
 * 2: When an error has been detected (via common() below).  At this
1202
 * point again the processor should be switched to errorProcessor,
1203
 * which will never call a handler.
1204
 *
1205
 * The result of this is that error() can only be called if the
1206
 * processor switch failed to happen, which is an internal error and
1207
 * therefore we shouldn't be able to provoke it simply by using the
1208
 * library.  It is a necessary backstop, however, so we merely exclude
1209
 * it from the coverage statistics.
1210
 *
1211
 * LCOV_EXCL_START
1212
 */
1213
static int
1214
error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1215
0
      const ENCODING *enc) {
1216
0
  UNUSED_P(state);
1217
0
  UNUSED_P(tok);
1218
0
  UNUSED_P(ptr);
1219
0
  UNUSED_P(end);
1220
0
  UNUSED_P(enc);
1221
0
  return XML_ROLE_NONE;
1222
0
}
1223
/* LCOV_EXCL_STOP */
1224
1225
static int
1226
688
common(PROLOG_STATE *state, int tok) {
1227
#ifdef XML_DTD
1228
  if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1229
    return XML_ROLE_INNER_PARAM_ENTITY_REF;
1230
#else
1231
688
  UNUSED_P(tok);
1232
688
#endif
1233
688
  state->handler = error;
1234
688
  return XML_ROLE_ERROR;
1235
688
}
1236
1237
void
1238
9.40k
XmlPrologStateInit(PROLOG_STATE *state) {
1239
9.40k
  state->handler = prolog0;
1240
#ifdef XML_DTD
1241
  state->documentEntity = 1;
1242
  state->includeLevel = 0;
1243
  state->inEntityValue = 0;
1244
#endif /* XML_DTD */
1245
9.40k
}
1246
1247
#ifdef XML_DTD
1248
1249
void
1250
XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
1251
  state->handler = externalSubset0;
1252
  state->documentEntity = 0;
1253
  state->includeLevel = 0;
1254
}
1255
1256
#endif /* XML_DTD */