Coverage Report

Created: 2025-11-08 06:32

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
79.6k
#  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.34k
        const ENCODING *enc) {
143
8.34k
  switch (tok) {
144
148
  case XML_TOK_PROLOG_S:
145
148
    state->handler = prolog1;
146
148
    return XML_ROLE_NONE;
147
1.13k
  case XML_TOK_XML_DECL:
148
1.13k
    state->handler = prolog1;
149
1.13k
    return XML_ROLE_XML_DECL;
150
182
  case XML_TOK_PI:
151
182
    state->handler = prolog1;
152
182
    return XML_ROLE_PI;
153
67
  case XML_TOK_COMMENT:
154
67
    state->handler = prolog1;
155
67
    return XML_ROLE_COMMENT;
156
254
  case XML_TOK_BOM:
157
254
    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
25
      break;
162
2.70k
    state->handler = doctype0;
163
2.70k
    return XML_ROLE_DOCTYPE_NONE;
164
3.59k
  case XML_TOK_INSTANCE_START:
165
3.59k
    state->handler = error;
166
3.59k
    return XML_ROLE_INSTANCE_START;
167
8.34k
  }
168
255
  return common(state, tok);
169
8.34k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
5.10k
        const ENCODING *enc) {
174
5.10k
  switch (tok) {
175
1.18k
  case XML_TOK_PROLOG_S:
176
1.18k
    return XML_ROLE_NONE;
177
2.08k
  case XML_TOK_PI:
178
2.08k
    return XML_ROLE_PI;
179
773
  case XML_TOK_COMMENT:
180
773
    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
471
  case XML_TOK_DECL_OPEN:
191
471
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
471
                              KW_DOCTYPE))
193
2
      break;
194
469
    state->handler = doctype0;
195
469
    return XML_ROLE_DOCTYPE_NONE;
196
569
  case XML_TOK_INSTANCE_START:
197
569
    state->handler = error;
198
569
    return XML_ROLE_INSTANCE_START;
199
5.10k
  }
200
18
  return common(state, tok);
201
5.10k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
8.20k
        const ENCODING *enc) {
206
8.20k
  UNUSED_P(ptr);
207
8.20k
  UNUSED_P(end);
208
8.20k
  UNUSED_P(enc);
209
8.20k
  switch (tok) {
210
2.51k
  case XML_TOK_PROLOG_S:
211
2.51k
    return XML_ROLE_NONE;
212
3.48k
  case XML_TOK_PI:
213
3.48k
    return XML_ROLE_PI;
214
552
  case XML_TOK_COMMENT:
215
552
    return XML_ROLE_COMMENT;
216
1.64k
  case XML_TOK_INSTANCE_START:
217
1.64k
    state->handler = error;
218
1.64k
    return XML_ROLE_INSTANCE_START;
219
8.20k
  }
220
16
  return common(state, tok);
221
8.20k
}
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.17k
  case XML_TOK_PROLOG_S:
231
3.17k
    return XML_ROLE_DOCTYPE_NONE;
232
3.16k
  case XML_TOK_NAME:
233
3.16k
  case XML_TOK_PREFIXED_NAME:
234
3.16k
    state->handler = doctype1;
235
3.16k
    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
865
  case XML_TOK_PROLOG_S:
245
865
    return XML_ROLE_DOCTYPE_NONE;
246
2.27k
  case XML_TOK_OPEN_BRACKET:
247
2.27k
    state->handler = internalSubset;
248
2.27k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
33
  case XML_TOK_DECL_CLOSE:
250
33
    state->handler = prolog2;
251
33
    return XML_ROLE_DOCTYPE_CLOSE;
252
852
  case XML_TOK_NAME:
253
852
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
16
      state->handler = doctype3;
255
16
      return XML_ROLE_DOCTYPE_NONE;
256
16
    }
257
836
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
828
      state->handler = doctype2;
259
828
      return XML_ROLE_DOCTYPE_NONE;
260
828
    }
261
8
    break;
262
4.02k
  }
263
12
  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
827
  case XML_TOK_PROLOG_S:
274
827
    return XML_ROLE_DOCTYPE_NONE;
275
821
  case XML_TOK_LITERAL:
276
821
    state->handler = doctype3;
277
821
    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.46k
         const ENCODING *enc) {
285
1.46k
  UNUSED_P(ptr);
286
1.46k
  UNUSED_P(end);
287
1.46k
  UNUSED_P(enc);
288
1.46k
  switch (tok) {
289
735
  case XML_TOK_PROLOG_S:
290
735
    return XML_ROLE_DOCTYPE_NONE;
291
719
  case XML_TOK_LITERAL:
292
719
    state->handler = doctype4;
293
719
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
1.46k
  }
295
14
  return common(state, tok);
296
1.46k
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
735
         const ENCODING *enc) {
301
735
  UNUSED_P(ptr);
302
735
  UNUSED_P(end);
303
735
  UNUSED_P(enc);
304
735
  switch (tok) {
305
22
  case XML_TOK_PROLOG_S:
306
22
    return XML_ROLE_DOCTYPE_NONE;
307
334
  case XML_TOK_OPEN_BRACKET:
308
334
    state->handler = internalSubset;
309
334
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
375
  case XML_TOK_DECL_CLOSE:
311
375
    state->handler = prolog2;
312
375
    return XML_ROLE_DOCTYPE_CLOSE;
313
735
  }
314
4
  return common(state, tok);
315
735
}
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
81
  case XML_TOK_PROLOG_S:
325
81
    return XML_ROLE_DOCTYPE_NONE;
326
1.29k
  case XML_TOK_DECL_CLOSE:
327
1.29k
    state->handler = prolog2;
328
1.29k
    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
188k
               const ENCODING *enc) {
336
188k
  switch (tok) {
337
29.0k
  case XML_TOK_PROLOG_S:
338
29.0k
    return XML_ROLE_NONE;
339
80.7k
  case XML_TOK_DECL_OPEN:
340
80.7k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
80.7k
                            KW_ENTITY)) {
342
14.1k
      state->handler = entity0;
343
14.1k
      return XML_ROLE_ENTITY_NONE;
344
14.1k
    }
345
66.6k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
66.6k
                            KW_ATTLIST)) {
347
61.8k
      state->handler = attlist0;
348
61.8k
      return XML_ROLE_ATTLIST_NONE;
349
61.8k
    }
350
4.79k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.79k
                            KW_ELEMENT)) {
352
3.73k
      state->handler = element0;
353
3.73k
      return XML_ROLE_ELEMENT_NONE;
354
3.73k
    }
355
1.05k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.05k
                            KW_NOTATION)) {
357
1.03k
      state->handler = notation0;
358
1.03k
      return XML_ROLE_NOTATION_NONE;
359
1.03k
    }
360
24
    break;
361
376
  case XML_TOK_PI:
362
376
    return XML_ROLE_PI;
363
229
  case XML_TOK_COMMENT:
364
229
    return XML_ROLE_COMMENT;
365
77.0k
  case XML_TOK_PARAM_ENTITY_REF:
366
77.0k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.29k
  case XML_TOK_CLOSE_BRACKET:
368
1.29k
    state->handler = doctype5;
369
1.29k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
188k
  }
373
63
  return common(state, tok);
374
188k
}
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.2k
        const ENCODING *enc) {
418
28.2k
  UNUSED_P(ptr);
419
28.2k
  UNUSED_P(end);
420
28.2k
  UNUSED_P(enc);
421
28.2k
  switch (tok) {
422
14.1k
  case XML_TOK_PROLOG_S:
423
14.1k
    return XML_ROLE_ENTITY_NONE;
424
2.83k
  case XML_TOK_PERCENT:
425
2.83k
    state->handler = entity1;
426
2.83k
    return XML_ROLE_ENTITY_NONE;
427
11.2k
  case XML_TOK_NAME:
428
11.2k
    state->handler = entity2;
429
11.2k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
28.2k
  }
431
2
  return common(state, tok);
432
28.2k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
5.66k
        const ENCODING *enc) {
437
5.66k
  UNUSED_P(ptr);
438
5.66k
  UNUSED_P(end);
439
5.66k
  UNUSED_P(enc);
440
5.66k
  switch (tok) {
441
2.83k
  case XML_TOK_PROLOG_S:
442
2.83k
    return XML_ROLE_ENTITY_NONE;
443
2.81k
  case XML_TOK_NAME:
444
2.81k
    state->handler = entity7;
445
2.81k
    return XML_ROLE_PARAM_ENTITY_NAME;
446
5.66k
  }
447
13
  return common(state, tok);
448
5.66k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
22.5k
        const ENCODING *enc) {
453
22.5k
  switch (tok) {
454
11.2k
  case XML_TOK_PROLOG_S:
455
11.2k
    return XML_ROLE_ENTITY_NONE;
456
2.30k
  case XML_TOK_NAME:
457
2.30k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
690
      state->handler = entity4;
459
690
      return XML_ROLE_ENTITY_NONE;
460
690
    }
461
1.61k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
1.60k
      state->handler = entity3;
463
1.60k
      return XML_ROLE_ENTITY_NONE;
464
1.60k
    }
465
4
    break;
466
8.93k
  case XML_TOK_LITERAL:
467
8.93k
    state->handler = declClose;
468
8.93k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
8.93k
    return XML_ROLE_ENTITY_VALUE;
470
22.5k
  }
471
7
  return common(state, tok);
472
22.5k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
3.21k
        const ENCODING *enc) {
477
3.21k
  UNUSED_P(ptr);
478
3.21k
  UNUSED_P(end);
479
3.21k
  UNUSED_P(enc);
480
3.21k
  switch (tok) {
481
1.61k
  case XML_TOK_PROLOG_S:
482
1.61k
    return XML_ROLE_ENTITY_NONE;
483
1.60k
  case XML_TOK_LITERAL:
484
1.60k
    state->handler = entity4;
485
1.60k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
3.21k
  }
487
1
  return common(state, tok);
488
3.21k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
4.48k
        const ENCODING *enc) {
493
4.48k
  UNUSED_P(ptr);
494
4.48k
  UNUSED_P(end);
495
4.48k
  UNUSED_P(enc);
496
4.48k
  switch (tok) {
497
2.25k
  case XML_TOK_PROLOG_S:
498
2.25k
    return XML_ROLE_ENTITY_NONE;
499
2.22k
  case XML_TOK_LITERAL:
500
2.22k
    state->handler = entity5;
501
2.22k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
4.48k
  }
503
5
  return common(state, tok);
504
4.48k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
2.94k
        const ENCODING *enc) {
509
2.94k
  switch (tok) {
510
730
  case XML_TOK_PROLOG_S:
511
730
    return XML_ROLE_ENTITY_NONE;
512
1.60k
  case XML_TOK_DECL_CLOSE:
513
1.60k
    setTopLevel(state);
514
1.60k
    return XML_ROLE_ENTITY_COMPLETE;
515
606
  case XML_TOK_NAME:
516
606
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
603
      state->handler = entity6;
518
603
      return XML_ROLE_ENTITY_NONE;
519
603
    }
520
3
    break;
521
2.94k
  }
522
4
  return common(state, tok);
523
2.94k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
1.19k
        const ENCODING *enc) {
528
1.19k
  UNUSED_P(ptr);
529
1.19k
  UNUSED_P(end);
530
1.19k
  UNUSED_P(enc);
531
1.19k
  switch (tok) {
532
598
  case XML_TOK_PROLOG_S:
533
598
    return XML_ROLE_ENTITY_NONE;
534
595
  case XML_TOK_NAME:
535
595
    state->handler = declClose;
536
595
    state->role_none = XML_ROLE_ENTITY_NONE;
537
595
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
1.19k
  }
539
1
  return common(state, tok);
540
1.19k
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
5.61k
        const ENCODING *enc) {
545
5.61k
  switch (tok) {
546
2.81k
  case XML_TOK_PROLOG_S:
547
2.81k
    return XML_ROLE_ENTITY_NONE;
548
2.12k
  case XML_TOK_NAME:
549
2.12k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
397
      state->handler = entity9;
551
397
      return XML_ROLE_ENTITY_NONE;
552
397
    }
553
1.73k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
1.73k
      state->handler = entity8;
555
1.73k
      return XML_ROLE_ENTITY_NONE;
556
1.73k
    }
557
1
    break;
558
670
  case XML_TOK_LITERAL:
559
670
    state->handler = declClose;
560
670
    state->role_none = XML_ROLE_ENTITY_NONE;
561
670
    return XML_ROLE_ENTITY_VALUE;
562
5.61k
  }
563
3
  return common(state, tok);
564
5.61k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
3.44k
        const ENCODING *enc) {
569
3.44k
  UNUSED_P(ptr);
570
3.44k
  UNUSED_P(end);
571
3.44k
  UNUSED_P(enc);
572
3.44k
  switch (tok) {
573
1.73k
  case XML_TOK_PROLOG_S:
574
1.73k
    return XML_ROLE_ENTITY_NONE;
575
1.71k
  case XML_TOK_LITERAL:
576
1.71k
    state->handler = entity9;
577
1.71k
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
3.44k
  }
579
1
  return common(state, tok);
580
3.44k
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
4.19k
        const ENCODING *enc) {
585
4.19k
  UNUSED_P(ptr);
586
4.19k
  UNUSED_P(end);
587
4.19k
  UNUSED_P(enc);
588
4.19k
  switch (tok) {
589
2.10k
  case XML_TOK_PROLOG_S:
590
2.10k
    return XML_ROLE_ENTITY_NONE;
591
2.09k
  case XML_TOK_LITERAL:
592
2.09k
    state->handler = entity10;
593
2.09k
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
4.19k
  }
595
1
  return common(state, tok);
596
4.19k
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
2.51k
         const ENCODING *enc) {
601
2.51k
  UNUSED_P(ptr);
602
2.51k
  UNUSED_P(end);
603
2.51k
  UNUSED_P(enc);
604
2.51k
  switch (tok) {
605
427
  case XML_TOK_PROLOG_S:
606
427
    return XML_ROLE_ENTITY_NONE;
607
2.08k
  case XML_TOK_DECL_CLOSE:
608
2.08k
    setTopLevel(state);
609
2.08k
    return XML_ROLE_ENTITY_COMPLETE;
610
2.51k
  }
611
2
  return common(state, tok);
612
2.51k
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.05k
          const ENCODING *enc) {
617
2.05k
  UNUSED_P(ptr);
618
2.05k
  UNUSED_P(end);
619
2.05k
  UNUSED_P(enc);
620
2.05k
  switch (tok) {
621
1.04k
  case XML_TOK_PROLOG_S:
622
1.04k
    return XML_ROLE_NOTATION_NONE;
623
1.01k
  case XML_TOK_NAME:
624
1.01k
    state->handler = notation1;
625
1.01k
    return XML_ROLE_NOTATION_NAME;
626
2.05k
  }
627
1
  return common(state, tok);
628
2.05k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.02k
          const ENCODING *enc) {
633
2.02k
  switch (tok) {
634
1.01k
  case XML_TOK_PROLOG_S:
635
1.01k
    return XML_ROLE_NOTATION_NONE;
636
1.00k
  case XML_TOK_NAME:
637
1.00k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
428
      state->handler = notation3;
639
428
      return XML_ROLE_NOTATION_NONE;
640
428
    }
641
578
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
576
      state->handler = notation2;
643
576
      return XML_ROLE_NOTATION_NONE;
644
576
    }
645
2
    break;
646
2.02k
  }
647
3
  return common(state, tok);
648
2.02k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
1.13k
          const ENCODING *enc) {
653
1.13k
  UNUSED_P(ptr);
654
1.13k
  UNUSED_P(end);
655
1.13k
  UNUSED_P(enc);
656
1.13k
  switch (tok) {
657
574
  case XML_TOK_PROLOG_S:
658
574
    return XML_ROLE_NOTATION_NONE;
659
558
  case XML_TOK_LITERAL:
660
558
    state->handler = notation4;
661
558
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
1.13k
  }
663
2
  return common(state, tok);
664
1.13k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
854
          const ENCODING *enc) {
669
854
  UNUSED_P(ptr);
670
854
  UNUSED_P(end);
671
854
  UNUSED_P(enc);
672
854
  switch (tok) {
673
437
  case XML_TOK_PROLOG_S:
674
437
    return XML_ROLE_NOTATION_NONE;
675
416
  case XML_TOK_LITERAL:
676
416
    state->handler = declClose;
677
416
    state->role_none = XML_ROLE_NOTATION_NONE;
678
416
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
854
  }
680
1
  return common(state, tok);
681
854
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
881
          const ENCODING *enc) {
686
881
  UNUSED_P(ptr);
687
881
  UNUSED_P(end);
688
881
  UNUSED_P(enc);
689
881
  switch (tok) {
690
330
  case XML_TOK_PROLOG_S:
691
330
    return XML_ROLE_NOTATION_NONE;
692
265
  case XML_TOK_LITERAL:
693
265
    state->handler = declClose;
694
265
    state->role_none = XML_ROLE_NOTATION_NONE;
695
265
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
283
  case XML_TOK_DECL_CLOSE:
697
283
    setTopLevel(state);
698
283
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
881
  }
700
3
  return common(state, tok);
701
881
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
123k
         const ENCODING *enc) {
706
123k
  UNUSED_P(ptr);
707
123k
  UNUSED_P(end);
708
123k
  UNUSED_P(enc);
709
123k
  switch (tok) {
710
61.8k
  case XML_TOK_PROLOG_S:
711
61.8k
    return XML_ROLE_ATTLIST_NONE;
712
61.8k
  case XML_TOK_NAME:
713
61.8k
  case XML_TOK_PREFIXED_NAME:
714
61.8k
    state->handler = attlist1;
715
61.8k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
123k
  }
717
1
  return common(state, tok);
718
123k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
364k
         const ENCODING *enc) {
723
364k
  UNUSED_P(ptr);
724
364k
  UNUSED_P(end);
725
364k
  UNUSED_P(enc);
726
364k
  switch (tok) {
727
151k
  case XML_TOK_PROLOG_S:
728
151k
    return XML_ROLE_ATTLIST_NONE;
729
61.4k
  case XML_TOK_DECL_CLOSE:
730
61.4k
    setTopLevel(state);
731
61.4k
    return XML_ROLE_ATTLIST_NONE;
732
151k
  case XML_TOK_NAME:
733
151k
  case XML_TOK_PREFIXED_NAME:
734
151k
    state->handler = attlist2;
735
151k
    return XML_ROLE_ATTRIBUTE_NAME;
736
364k
  }
737
14
  return common(state, tok);
738
364k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
303k
         const ENCODING *enc) {
743
303k
  switch (tok) {
744
151k
  case XML_TOK_PROLOG_S:
745
151k
    return XML_ROLE_ATTLIST_NONE;
746
47.2k
  case XML_TOK_NAME: {
747
47.2k
    static const char *const types[] = {
748
47.2k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
47.2k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
47.2k
    };
751
47.2k
    int i;
752
199k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
199k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
46.8k
        state->handler = attlist8;
755
46.8k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
46.8k
      }
757
47.2k
  }
758
400
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
386
      state->handler = attlist5;
760
386
      return XML_ROLE_ATTLIST_NONE;
761
386
    }
762
14
    break;
763
104k
  case XML_TOK_OPEN_PAREN:
764
104k
    state->handler = attlist3;
765
104k
    return XML_ROLE_ATTLIST_NONE;
766
303k
  }
767
18
  return common(state, tok);
768
303k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
111k
         const ENCODING *enc) {
773
111k
  UNUSED_P(ptr);
774
111k
  UNUSED_P(end);
775
111k
  UNUSED_P(enc);
776
111k
  switch (tok) {
777
1.40k
  case XML_TOK_PROLOG_S:
778
1.40k
    return XML_ROLE_ATTLIST_NONE;
779
4.24k
  case XML_TOK_NMTOKEN:
780
109k
  case XML_TOK_NAME:
781
109k
  case XML_TOK_PREFIXED_NAME:
782
109k
    state->handler = attlist4;
783
109k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
111k
  }
785
3
  return common(state, tok);
786
111k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
110k
         const ENCODING *enc) {
791
110k
  UNUSED_P(ptr);
792
110k
  UNUSED_P(end);
793
110k
  UNUSED_P(enc);
794
110k
  switch (tok) {
795
833
  case XML_TOK_PROLOG_S:
796
833
    return XML_ROLE_ATTLIST_NONE;
797
104k
  case XML_TOK_CLOSE_PAREN:
798
104k
    state->handler = attlist8;
799
104k
    return XML_ROLE_ATTLIST_NONE;
800
5.52k
  case XML_TOK_OR:
801
5.52k
    state->handler = attlist3;
802
5.52k
    return XML_ROLE_ATTLIST_NONE;
803
110k
  }
804
5
  return common(state, tok);
805
110k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
766
         const ENCODING *enc) {
810
766
  UNUSED_P(ptr);
811
766
  UNUSED_P(end);
812
766
  UNUSED_P(enc);
813
766
  switch (tok) {
814
389
  case XML_TOK_PROLOG_S:
815
389
    return XML_ROLE_ATTLIST_NONE;
816
376
  case XML_TOK_OPEN_PAREN:
817
376
    state->handler = attlist6;
818
376
    return XML_ROLE_ATTLIST_NONE;
819
766
  }
820
1
  return common(state, tok);
821
766
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.05k
         const ENCODING *enc) {
826
1.05k
  UNUSED_P(ptr);
827
1.05k
  UNUSED_P(end);
828
1.05k
  UNUSED_P(enc);
829
1.05k
  switch (tok) {
830
179
  case XML_TOK_PROLOG_S:
831
179
    return XML_ROLE_ATTLIST_NONE;
832
874
  case XML_TOK_NAME:
833
874
    state->handler = attlist7;
834
874
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.05k
  }
836
1
  return common(state, tok);
837
1.05k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.22k
         const ENCODING *enc) {
842
1.22k
  UNUSED_P(ptr);
843
1.22k
  UNUSED_P(end);
844
1.22k
  UNUSED_P(enc);
845
1.22k
  switch (tok) {
846
364
  case XML_TOK_PROLOG_S:
847
364
    return XML_ROLE_ATTLIST_NONE;
848
346
  case XML_TOK_CLOSE_PAREN:
849
346
    state->handler = attlist8;
850
346
    return XML_ROLE_ATTLIST_NONE;
851
514
  case XML_TOK_OR:
852
514
    state->handler = attlist6;
853
514
    return XML_ROLE_ATTLIST_NONE;
854
1.22k
  }
855
4
  return common(state, tok);
856
1.22k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
302k
         const ENCODING *enc) {
862
302k
  switch (tok) {
863
151k
  case XML_TOK_PROLOG_S:
864
151k
    return XML_ROLE_ATTLIST_NONE;
865
109k
  case XML_TOK_POUND_NAME:
866
109k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
109k
                            KW_IMPLIED)) {
868
109k
      state->handler = attlist1;
869
109k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
109k
    }
871
558
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
558
                            KW_REQUIRED)) {
873
80
      state->handler = attlist1;
874
80
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
80
    }
876
478
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
478
                            KW_FIXED)) {
878
471
      state->handler = attlist9;
879
471
      return XML_ROLE_ATTLIST_NONE;
880
471
    }
881
7
    break;
882
41.5k
  case XML_TOK_LITERAL:
883
41.5k
    state->handler = attlist1;
884
41.5k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
302k
  }
886
8
  return common(state, tok);
887
302k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
922
         const ENCODING *enc) {
892
922
  UNUSED_P(ptr);
893
922
  UNUSED_P(end);
894
922
  UNUSED_P(enc);
895
922
  switch (tok) {
896
468
  case XML_TOK_PROLOG_S:
897
468
    return XML_ROLE_ATTLIST_NONE;
898
446
  case XML_TOK_LITERAL:
899
446
    state->handler = attlist1;
900
446
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
922
  }
902
8
  return common(state, tok);
903
922
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
7.46k
         const ENCODING *enc) {
908
7.46k
  UNUSED_P(ptr);
909
7.46k
  UNUSED_P(end);
910
7.46k
  UNUSED_P(enc);
911
7.46k
  switch (tok) {
912
3.73k
  case XML_TOK_PROLOG_S:
913
3.73k
    return XML_ROLE_ELEMENT_NONE;
914
3.72k
  case XML_TOK_NAME:
915
3.72k
  case XML_TOK_PREFIXED_NAME:
916
3.72k
    state->handler = element1;
917
3.72k
    return XML_ROLE_ELEMENT_NAME;
918
7.46k
  }
919
5
  return common(state, tok);
920
7.46k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
7.43k
         const ENCODING *enc) {
925
7.43k
  switch (tok) {
926
3.72k
  case XML_TOK_PROLOG_S:
927
3.72k
    return XML_ROLE_ELEMENT_NONE;
928
147
  case XML_TOK_NAME:
929
147
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
68
      state->handler = declClose;
931
68
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
68
      return XML_ROLE_CONTENT_EMPTY;
933
68
    }
934
79
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
77
      state->handler = declClose;
936
77
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
77
      return XML_ROLE_CONTENT_ANY;
938
77
    }
939
2
    break;
940
3.56k
  case XML_TOK_OPEN_PAREN:
941
3.56k
    state->handler = element2;
942
3.56k
    state->level = 1;
943
3.56k
    return XML_ROLE_GROUP_OPEN;
944
7.43k
  }
945
3
  return common(state, tok);
946
7.43k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
3.97k
         const ENCODING *enc) {
951
3.97k
  switch (tok) {
952
428
  case XML_TOK_PROLOG_S:
953
428
    return XML_ROLE_ELEMENT_NONE;
954
1.41k
  case XML_TOK_POUND_NAME:
955
1.41k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
1.41k
                            KW_PCDATA)) {
957
1.41k
      state->handler = element3;
958
1.41k
      return XML_ROLE_CONTENT_PCDATA;
959
1.41k
    }
960
2
    break;
961
702
  case XML_TOK_OPEN_PAREN:
962
702
    state->level = 2;
963
702
    state->handler = element6;
964
702
    return XML_ROLE_GROUP_OPEN;
965
643
  case XML_TOK_NAME:
966
643
  case XML_TOK_PREFIXED_NAME:
967
643
    state->handler = element7;
968
643
    return XML_ROLE_CONTENT_ELEMENT;
969
214
  case XML_TOK_NAME_QUESTION:
970
214
    state->handler = element7;
971
214
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
350
  case XML_TOK_NAME_ASTERISK:
973
350
    state->handler = element7;
974
350
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
220
  case XML_TOK_NAME_PLUS:
976
220
    state->handler = element7;
977
220
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
3.97k
  }
979
3
  return common(state, tok);
980
3.97k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
1.83k
         const ENCODING *enc) {
985
1.83k
  UNUSED_P(ptr);
986
1.83k
  UNUSED_P(end);
987
1.83k
  UNUSED_P(enc);
988
1.83k
  switch (tok) {
989
429
  case XML_TOK_PROLOG_S:
990
429
    return XML_ROLE_ELEMENT_NONE;
991
314
  case XML_TOK_CLOSE_PAREN:
992
314
    state->handler = declClose;
993
314
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
314
    return XML_ROLE_GROUP_CLOSE;
995
377
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
377
    state->handler = declClose;
997
377
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
377
    return XML_ROLE_GROUP_CLOSE_REP;
999
707
  case XML_TOK_OR:
1000
707
    state->handler = element4;
1001
707
    return XML_ROLE_ELEMENT_NONE;
1002
1.83k
  }
1003
3
  return common(state, tok);
1004
1.83k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.98k
         const ENCODING *enc) {
1009
1.98k
  UNUSED_P(ptr);
1010
1.98k
  UNUSED_P(end);
1011
1.98k
  UNUSED_P(enc);
1012
1.98k
  switch (tok) {
1013
374
  case XML_TOK_PROLOG_S:
1014
374
    return XML_ROLE_ELEMENT_NONE;
1015
1.60k
  case XML_TOK_NAME:
1016
1.60k
  case XML_TOK_PREFIXED_NAME:
1017
1.60k
    state->handler = element5;
1018
1.60k
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.98k
  }
1020
10
  return common(state, tok);
1021
1.98k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
2.13k
         const ENCODING *enc) {
1026
2.13k
  UNUSED_P(ptr);
1027
2.13k
  UNUSED_P(end);
1028
2.13k
  UNUSED_P(enc);
1029
2.13k
  switch (tok) {
1030
551
  case XML_TOK_PROLOG_S:
1031
551
    return XML_ROLE_ELEMENT_NONE;
1032
658
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
658
    state->handler = declClose;
1034
658
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
658
    return XML_ROLE_GROUP_CLOSE_REP;
1036
921
  case XML_TOK_OR:
1037
921
    state->handler = element4;
1038
921
    return XML_ROLE_ELEMENT_NONE;
1039
2.13k
  }
1040
1
  return common(state, tok);
1041
2.13k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
1.24M
         const ENCODING *enc) {
1046
1.24M
  UNUSED_P(ptr);
1047
1.24M
  UNUSED_P(end);
1048
1.24M
  UNUSED_P(enc);
1049
1.24M
  switch (tok) {
1050
2.80k
  case XML_TOK_PROLOG_S:
1051
2.80k
    return XML_ROLE_ELEMENT_NONE;
1052
1.23M
  case XML_TOK_OPEN_PAREN:
1053
1.23M
    state->level += 1;
1054
1.23M
    return XML_ROLE_GROUP_OPEN;
1055
5.08k
  case XML_TOK_NAME:
1056
5.08k
  case XML_TOK_PREFIXED_NAME:
1057
5.08k
    state->handler = element7;
1058
5.08k
    return XML_ROLE_CONTENT_ELEMENT;
1059
126
  case XML_TOK_NAME_QUESTION:
1060
126
    state->handler = element7;
1061
126
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
784
  case XML_TOK_NAME_ASTERISK:
1063
784
    state->handler = element7;
1064
784
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
179
  case XML_TOK_NAME_PLUS:
1066
179
    state->handler = element7;
1067
179
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
1.24M
  }
1069
16
  return common(state, tok);
1070
1.24M
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
20.8k
         const ENCODING *enc) {
1075
20.8k
  UNUSED_P(ptr);
1076
20.8k
  UNUSED_P(end);
1077
20.8k
  UNUSED_P(enc);
1078
20.8k
  switch (tok) {
1079
1.68k
  case XML_TOK_PROLOG_S:
1080
1.68k
    return XML_ROLE_ELEMENT_NONE;
1081
9.26k
  case XML_TOK_CLOSE_PAREN:
1082
9.26k
    state->level -= 1;
1083
9.26k
    if (state->level == 0) {
1084
1.44k
      state->handler = declClose;
1085
1.44k
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
1.44k
    }
1087
9.26k
    return XML_ROLE_GROUP_CLOSE;
1088
1.21k
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
1.21k
    state->level -= 1;
1090
1.21k
    if (state->level == 0) {
1091
74
      state->handler = declClose;
1092
74
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
74
    }
1094
1.21k
    return XML_ROLE_GROUP_CLOSE_REP;
1095
1.01k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
1.01k
    state->level -= 1;
1097
1.01k
    if (state->level == 0) {
1098
77
      state->handler = declClose;
1099
77
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
77
    }
1101
1.01k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
2.08k
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
2.08k
    state->level -= 1;
1104
2.08k
    if (state->level == 0) {
1105
364
      state->handler = declClose;
1106
364
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
364
    }
1108
2.08k
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
2.55k
  case XML_TOK_COMMA:
1110
2.55k
    state->handler = element6;
1111
2.55k
    return XML_ROLE_GROUP_SEQUENCE;
1112
3.00k
  case XML_TOK_OR:
1113
3.00k
    state->handler = element6;
1114
3.00k
    return XML_ROLE_GROUP_CHOICE;
1115
20.8k
  }
1116
7
  return common(state, tok);
1117
20.8k
}
1118
1119
#ifdef XML_DTD
1120
1121
static int PTRCALL
1122
condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1123
          const ENCODING *enc) {
1124
  switch (tok) {
1125
  case XML_TOK_PROLOG_S:
1126
    return XML_ROLE_NONE;
1127
  case XML_TOK_NAME:
1128
    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1129
      state->handler = condSect1;
1130
      return XML_ROLE_NONE;
1131
    }
1132
    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1133
      state->handler = condSect2;
1134
      return XML_ROLE_NONE;
1135
    }
1136
    break;
1137
  }
1138
  return common(state, tok);
1139
}
1140
1141
static int PTRCALL
1142
condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1143
          const ENCODING *enc) {
1144
  UNUSED_P(ptr);
1145
  UNUSED_P(end);
1146
  UNUSED_P(enc);
1147
  switch (tok) {
1148
  case XML_TOK_PROLOG_S:
1149
    return XML_ROLE_NONE;
1150
  case XML_TOK_OPEN_BRACKET:
1151
    state->handler = externalSubset1;
1152
    state->includeLevel += 1;
1153
    return XML_ROLE_NONE;
1154
  }
1155
  return common(state, tok);
1156
}
1157
1158
static int PTRCALL
1159
condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1160
          const ENCODING *enc) {
1161
  UNUSED_P(ptr);
1162
  UNUSED_P(end);
1163
  UNUSED_P(enc);
1164
  switch (tok) {
1165
  case XML_TOK_PROLOG_S:
1166
    return XML_ROLE_NONE;
1167
  case XML_TOK_OPEN_BRACKET:
1168
    state->handler = externalSubset1;
1169
    return XML_ROLE_IGNORE_SECT;
1170
  }
1171
  return common(state, tok);
1172
}
1173
1174
#endif /* XML_DTD */
1175
1176
static int PTRCALL
1177
declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1178
15.6k
          const ENCODING *enc) {
1179
15.6k
  UNUSED_P(ptr);
1180
15.6k
  UNUSED_P(end);
1181
15.6k
  UNUSED_P(enc);
1182
15.6k
  switch (tok) {
1183
1.40k
  case XML_TOK_PROLOG_S:
1184
1.40k
    return state->role_none;
1185
14.2k
  case XML_TOK_DECL_CLOSE:
1186
14.2k
    setTopLevel(state);
1187
14.2k
    return state->role_none;
1188
15.6k
  }
1189
34
  return common(state, tok);
1190
15.6k
}
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
587
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
587
  UNUSED_P(tok);
1231
587
#endif
1232
587
  state->handler = error;
1233
587
  return XML_ROLE_ERROR;
1234
587
}
1235
1236
void
1237
8.98k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
8.98k
  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.98k
}
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 */