Coverage Report

Created: 2023-06-07 06:17

/src/CMake/Utilities/cmexpat/lib/xmlrole.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
                            __  __            _
3
                         ___\ \/ /_ __   __ _| |_
4
                        / _ \\  /| '_ \ / _` | __|
5
                       |  __//  \| |_) | (_| | |_
6
                        \___/_/\_\ .__/ \__,_|\__|
7
                                 |_| XML parser
8
9
   Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10
   Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11
   Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
12
   Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
13
   Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14
   Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15
   Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
16
   Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
17
   Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18
   Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
19
   Licensed under the MIT license:
20
21
   Permission is  hereby granted,  free of charge,  to any  person obtaining
22
   a  copy  of  this  software   and  associated  documentation  files  (the
23
   "Software"),  to  deal in  the  Software  without restriction,  including
24
   without  limitation the  rights  to use,  copy,  modify, merge,  publish,
25
   distribute, sublicense, and/or sell copies of the Software, and to permit
26
   persons  to whom  the Software  is  furnished to  do so,  subject to  the
27
   following conditions:
28
29
   The above copyright  notice and this permission notice  shall be included
30
   in all copies or substantial portions of the Software.
31
32
   THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
33
   EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
34
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
35
   NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
   DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
37
   OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38
   USE OR OTHER DEALINGS IN THE SOFTWARE.
39
*/
40
41
#include <expat_config.h>
42
43
#include <stddef.h>
44
45
#ifdef _WIN32
46
#  include "winconfig.h"
47
#endif
48
49
#include "expat_external.h"
50
#include "internal.h"
51
#include "xmlrole.h"
52
#include "ascii.h"
53
54
/* Doesn't check:
55
56
 that ,| are not mixed in a model group
57
 content of literals
58
59
*/
60
61
static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
62
static const char KW_ATTLIST[]
63
    = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
64
static const char KW_CDATA[]
65
    = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
66
static const char KW_DOCTYPE[]
67
    = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
68
static const char KW_ELEMENT[]
69
    = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
70
static const char KW_EMPTY[]
71
    = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
72
static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
73
                                   ASCII_I, ASCII_E, ASCII_S, '\0'};
74
static const char KW_ENTITY[]
75
    = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
76
static const char KW_FIXED[]
77
    = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
78
static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
79
static const char KW_IDREF[]
80
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
81
static const char KW_IDREFS[]
82
    = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83
#ifdef XML_DTD
84
static const char KW_IGNORE[]
85
    = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86
#endif
87
static const char KW_IMPLIED[]
88
    = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89
#ifdef XML_DTD
90
static const char KW_INCLUDE[]
91
    = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92
#endif
93
static const char KW_NDATA[]
94
    = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
95
static const char KW_NMTOKEN[]
96
    = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
97
static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
98
                                   ASCII_E, ASCII_N, ASCII_S, '\0'};
99
static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
100
                                   ASCII_I, ASCII_O, ASCII_N, '\0'};
101
static const char KW_PCDATA[]
102
    = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
103
static const char KW_PUBLIC[]
104
    = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
105
static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
106
                                   ASCII_R, ASCII_E, ASCII_D, '\0'};
107
static const char KW_SYSTEM[]
108
    = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
109
110
#ifndef MIN_BYTES_PER_CHAR
111
#  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
112
#endif
113
114
#ifdef XML_DTD
115
#  define setTopLevel(state)                                                   \
116
    ((state)->handler                                                          \
117
     = ((state)->documentEntity ? internalSubset : externalSubset1))
118
#else /* not XML_DTD */
119
23.3k
#  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
6.66k
        const ENCODING *enc) {
143
6.66k
  switch (tok) {
144
111
  case XML_TOK_PROLOG_S:
145
111
    state->handler = prolog1;
146
111
    return XML_ROLE_NONE;
147
1.56k
  case XML_TOK_XML_DECL:
148
1.56k
    state->handler = prolog1;
149
1.56k
    return XML_ROLE_XML_DECL;
150
81
  case XML_TOK_PI:
151
81
    state->handler = prolog1;
152
81
    return XML_ROLE_PI;
153
10
  case XML_TOK_COMMENT:
154
10
    state->handler = prolog1;
155
10
    return XML_ROLE_COMMENT;
156
252
  case XML_TOK_BOM:
157
252
    return XML_ROLE_NONE;
158
2.08k
  case XML_TOK_DECL_OPEN:
159
2.08k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160
2.08k
                              KW_DOCTYPE))
161
22
      break;
162
2.06k
    state->handler = doctype0;
163
2.06k
    return XML_ROLE_DOCTYPE_NONE;
164
2.34k
  case XML_TOK_INSTANCE_START:
165
2.34k
    state->handler = error;
166
2.34k
    return XML_ROLE_INSTANCE_START;
167
6.66k
  }
168
237
  return common(state, tok);
169
6.66k
}
170
171
static int PTRCALL
172
prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173
2.98k
        const ENCODING *enc) {
174
2.98k
  switch (tok) {
175
976
  case XML_TOK_PROLOG_S:
176
976
    return XML_ROLE_NONE;
177
529
  case XML_TOK_PI:
178
529
    return XML_ROLE_PI;
179
109
  case XML_TOK_COMMENT:
180
109
    return XML_ROLE_COMMENT;
181
0
  case XML_TOK_BOM:
182
    /* This case can never arise.  To reach this role function, the
183
     * parse must have passed through prolog0 and therefore have had
184
     * some form of input, even if only a space.  At that point, a
185
     * byte order mark is no longer a valid character (though
186
     * technically it should be interpreted as a non-breaking space),
187
     * so will be rejected by the tokenizing stages.
188
     */
189
0
    return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
190
1.18k
  case XML_TOK_DECL_OPEN:
191
1.18k
    if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192
1.18k
                              KW_DOCTYPE))
193
2
      break;
194
1.17k
    state->handler = doctype0;
195
1.17k
    return XML_ROLE_DOCTYPE_NONE;
196
175
  case XML_TOK_INSTANCE_START:
197
175
    state->handler = error;
198
175
    return XML_ROLE_INSTANCE_START;
199
2.98k
  }
200
16
  return common(state, tok);
201
2.98k
}
202
203
static int PTRCALL
204
prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205
2.51k
        const ENCODING *enc) {
206
2.51k
  UNUSED_P(ptr);
207
2.51k
  UNUSED_P(end);
208
2.51k
  UNUSED_P(enc);
209
2.51k
  switch (tok) {
210
489
  case XML_TOK_PROLOG_S:
211
489
    return XML_ROLE_NONE;
212
424
  case XML_TOK_PI:
213
424
    return XML_ROLE_PI;
214
195
  case XML_TOK_COMMENT:
215
195
    return XML_ROLE_COMMENT;
216
1.39k
  case XML_TOK_INSTANCE_START:
217
1.39k
    state->handler = error;
218
1.39k
    return XML_ROLE_INSTANCE_START;
219
2.51k
  }
220
6
  return common(state, tok);
221
2.51k
}
222
223
static int PTRCALL
224
doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225
6.47k
         const ENCODING *enc) {
226
6.47k
  UNUSED_P(ptr);
227
6.47k
  UNUSED_P(end);
228
6.47k
  UNUSED_P(enc);
229
6.47k
  switch (tok) {
230
3.24k
  case XML_TOK_PROLOG_S:
231
3.24k
    return XML_ROLE_DOCTYPE_NONE;
232
3.22k
  case XML_TOK_NAME:
233
3.22k
  case XML_TOK_PREFIXED_NAME:
234
3.22k
    state->handler = doctype1;
235
3.22k
    return XML_ROLE_DOCTYPE_NAME;
236
6.47k
  }
237
6
  return common(state, tok);
238
6.47k
}
239
240
static int PTRCALL
241
doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242
3.71k
         const ENCODING *enc) {
243
3.71k
  switch (tok) {
244
499
  case XML_TOK_PROLOG_S:
245
499
    return XML_ROLE_DOCTYPE_NONE;
246
2.74k
  case XML_TOK_OPEN_BRACKET:
247
2.74k
    state->handler = internalSubset;
248
2.74k
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249
31
  case XML_TOK_DECL_CLOSE:
250
31
    state->handler = prolog2;
251
31
    return XML_ROLE_DOCTYPE_CLOSE;
252
447
  case XML_TOK_NAME:
253
447
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254
10
      state->handler = doctype3;
255
10
      return XML_ROLE_DOCTYPE_NONE;
256
10
    }
257
437
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258
429
      state->handler = doctype2;
259
429
      return XML_ROLE_DOCTYPE_NONE;
260
429
    }
261
8
    break;
262
3.71k
  }
263
10
  return common(state, tok);
264
3.71k
}
265
266
static int PTRCALL
267
doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268
854
         const ENCODING *enc) {
269
854
  UNUSED_P(ptr);
270
854
  UNUSED_P(end);
271
854
  UNUSED_P(enc);
272
854
  switch (tok) {
273
428
  case XML_TOK_PROLOG_S:
274
428
    return XML_ROLE_DOCTYPE_NONE;
275
424
  case XML_TOK_LITERAL:
276
424
    state->handler = doctype3;
277
424
    return XML_ROLE_DOCTYPE_PUBLIC_ID;
278
854
  }
279
2
  return common(state, tok);
280
854
}
281
282
static int PTRCALL
283
doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284
551
         const ENCODING *enc) {
285
551
  UNUSED_P(ptr);
286
551
  UNUSED_P(end);
287
551
  UNUSED_P(enc);
288
551
  switch (tok) {
289
278
  case XML_TOK_PROLOG_S:
290
278
    return XML_ROLE_DOCTYPE_NONE;
291
267
  case XML_TOK_LITERAL:
292
267
    state->handler = doctype4;
293
267
    return XML_ROLE_DOCTYPE_SYSTEM_ID;
294
551
  }
295
6
  return common(state, tok);
296
551
}
297
298
static int PTRCALL
299
doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300
272
         const ENCODING *enc) {
301
272
  UNUSED_P(ptr);
302
272
  UNUSED_P(end);
303
272
  UNUSED_P(enc);
304
272
  switch (tok) {
305
7
  case XML_TOK_PROLOG_S:
306
7
    return XML_ROLE_DOCTYPE_NONE;
307
222
  case XML_TOK_OPEN_BRACKET:
308
222
    state->handler = internalSubset;
309
222
    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310
38
  case XML_TOK_DECL_CLOSE:
311
38
    state->handler = prolog2;
312
38
    return XML_ROLE_DOCTYPE_CLOSE;
313
272
  }
314
5
  return common(state, tok);
315
272
}
316
317
static int PTRCALL
318
doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319
1.36k
         const ENCODING *enc) {
320
1.36k
  UNUSED_P(ptr);
321
1.36k
  UNUSED_P(end);
322
1.36k
  UNUSED_P(enc);
323
1.36k
  switch (tok) {
324
4
  case XML_TOK_PROLOG_S:
325
4
    return XML_ROLE_DOCTYPE_NONE;
326
1.36k
  case XML_TOK_DECL_CLOSE:
327
1.36k
    state->handler = prolog2;
328
1.36k
    return XML_ROLE_DOCTYPE_CLOSE;
329
1.36k
  }
330
4
  return common(state, tok);
331
1.36k
}
332
333
static int PTRCALL
334
internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335
33.4k
               const ENCODING *enc) {
336
33.4k
  switch (tok) {
337
1.62k
  case XML_TOK_PROLOG_S:
338
1.62k
    return XML_ROLE_NONE;
339
24.6k
  case XML_TOK_DECL_OPEN:
340
24.6k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341
24.6k
                            KW_ENTITY)) {
342
9.47k
      state->handler = entity0;
343
9.47k
      return XML_ROLE_ENTITY_NONE;
344
9.47k
    }
345
15.1k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346
15.1k
                            KW_ATTLIST)) {
347
10.2k
      state->handler = attlist0;
348
10.2k
      return XML_ROLE_ATTLIST_NONE;
349
10.2k
    }
350
4.94k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351
4.94k
                            KW_ELEMENT)) {
352
3.67k
      state->handler = element0;
353
3.67k
      return XML_ROLE_ELEMENT_NONE;
354
3.67k
    }
355
1.27k
    if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356
1.27k
                            KW_NOTATION)) {
357
1.23k
      state->handler = notation0;
358
1.23k
      return XML_ROLE_NOTATION_NONE;
359
1.23k
    }
360
36
    break;
361
3.97k
  case XML_TOK_PI:
362
3.97k
    return XML_ROLE_PI;
363
194
  case XML_TOK_COMMENT:
364
194
    return XML_ROLE_COMMENT;
365
1.52k
  case XML_TOK_PARAM_ENTITY_REF:
366
1.52k
    return XML_ROLE_PARAM_ENTITY_REF;
367
1.37k
  case XML_TOK_CLOSE_BRACKET:
368
1.37k
    state->handler = doctype5;
369
1.37k
    return XML_ROLE_DOCTYPE_NONE;
370
0
  case XML_TOK_NONE:
371
0
    return XML_ROLE_NONE;
372
33.4k
  }
373
96
  return common(state, tok);
374
33.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
18.9k
        const ENCODING *enc) {
418
18.9k
  UNUSED_P(ptr);
419
18.9k
  UNUSED_P(end);
420
18.9k
  UNUSED_P(enc);
421
18.9k
  switch (tok) {
422
9.47k
  case XML_TOK_PROLOG_S:
423
9.47k
    return XML_ROLE_ENTITY_NONE;
424
993
  case XML_TOK_PERCENT:
425
993
    state->handler = entity1;
426
993
    return XML_ROLE_ENTITY_NONE;
427
8.46k
  case XML_TOK_NAME:
428
8.46k
    state->handler = entity2;
429
8.46k
    return XML_ROLE_GENERAL_ENTITY_NAME;
430
18.9k
  }
431
3
  return common(state, tok);
432
18.9k
}
433
434
static int PTRCALL
435
entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436
1.98k
        const ENCODING *enc) {
437
1.98k
  UNUSED_P(ptr);
438
1.98k
  UNUSED_P(end);
439
1.98k
  UNUSED_P(enc);
440
1.98k
  switch (tok) {
441
993
  case XML_TOK_PROLOG_S:
442
993
    return XML_ROLE_ENTITY_NONE;
443
981
  case XML_TOK_NAME:
444
981
    state->handler = entity7;
445
981
    return XML_ROLE_PARAM_ENTITY_NAME;
446
1.98k
  }
447
7
  return common(state, tok);
448
1.98k
}
449
450
static int PTRCALL
451
entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452
16.8k
        const ENCODING *enc) {
453
16.8k
  switch (tok) {
454
8.45k
  case XML_TOK_PROLOG_S:
455
8.45k
    return XML_ROLE_ENTITY_NONE;
456
3.82k
  case XML_TOK_NAME:
457
3.82k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458
506
      state->handler = entity4;
459
506
      return XML_ROLE_ENTITY_NONE;
460
506
    }
461
3.31k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462
3.30k
      state->handler = entity3;
463
3.30k
      return XML_ROLE_ENTITY_NONE;
464
3.30k
    }
465
10
    break;
466
4.58k
  case XML_TOK_LITERAL:
467
4.58k
    state->handler = declClose;
468
4.58k
    state->role_none = XML_ROLE_ENTITY_NONE;
469
4.58k
    return XML_ROLE_ENTITY_VALUE;
470
16.8k
  }
471
13
  return common(state, tok);
472
16.8k
}
473
474
static int PTRCALL
475
entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476
6.61k
        const ENCODING *enc) {
477
6.61k
  UNUSED_P(ptr);
478
6.61k
  UNUSED_P(end);
479
6.61k
  UNUSED_P(enc);
480
6.61k
  switch (tok) {
481
3.30k
  case XML_TOK_PROLOG_S:
482
3.30k
    return XML_ROLE_ENTITY_NONE;
483
3.30k
  case XML_TOK_LITERAL:
484
3.30k
    state->handler = entity4;
485
3.30k
    return XML_ROLE_ENTITY_PUBLIC_ID;
486
6.61k
  }
487
1
  return common(state, tok);
488
6.61k
}
489
490
static int PTRCALL
491
entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492
7.48k
        const ENCODING *enc) {
493
7.48k
  UNUSED_P(ptr);
494
7.48k
  UNUSED_P(end);
495
7.48k
  UNUSED_P(enc);
496
7.48k
  switch (tok) {
497
3.75k
  case XML_TOK_PROLOG_S:
498
3.75k
    return XML_ROLE_ENTITY_NONE;
499
3.72k
  case XML_TOK_LITERAL:
500
3.72k
    state->handler = entity5;
501
3.72k
    return XML_ROLE_ENTITY_SYSTEM_ID;
502
7.48k
  }
503
6
  return common(state, tok);
504
7.48k
}
505
506
static int PTRCALL
507
entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508
5.55k
        const ENCODING *enc) {
509
5.55k
  switch (tok) {
510
1.83k
  case XML_TOK_PROLOG_S:
511
1.83k
    return XML_ROLE_ENTITY_NONE;
512
2.19k
  case XML_TOK_DECL_CLOSE:
513
2.19k
    setTopLevel(state);
514
2.19k
    return XML_ROLE_ENTITY_COMPLETE;
515
1.52k
  case XML_TOK_NAME:
516
1.52k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517
1.52k
      state->handler = entity6;
518
1.52k
      return XML_ROLE_ENTITY_NONE;
519
1.52k
    }
520
1
    break;
521
5.55k
  }
522
1
  return common(state, tok);
523
5.55k
}
524
525
static int PTRCALL
526
entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527
3.04k
        const ENCODING *enc) {
528
3.04k
  UNUSED_P(ptr);
529
3.04k
  UNUSED_P(end);
530
3.04k
  UNUSED_P(enc);
531
3.04k
  switch (tok) {
532
1.52k
  case XML_TOK_PROLOG_S:
533
1.52k
    return XML_ROLE_ENTITY_NONE;
534
1.51k
  case XML_TOK_NAME:
535
1.51k
    state->handler = declClose;
536
1.51k
    state->role_none = XML_ROLE_ENTITY_NONE;
537
1.51k
    return XML_ROLE_ENTITY_NOTATION_NAME;
538
3.04k
  }
539
1
  return common(state, tok);
540
3.04k
}
541
542
static int PTRCALL
543
entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544
1.95k
        const ENCODING *enc) {
545
1.95k
  switch (tok) {
546
982
  case XML_TOK_PROLOG_S:
547
982
    return XML_ROLE_ENTITY_NONE;
548
366
  case XML_TOK_NAME:
549
366
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550
278
      state->handler = entity9;
551
278
      return XML_ROLE_ENTITY_NONE;
552
278
    }
553
88
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554
84
      state->handler = entity8;
555
84
      return XML_ROLE_ENTITY_NONE;
556
84
    }
557
4
    break;
558
605
  case XML_TOK_LITERAL:
559
605
    state->handler = declClose;
560
605
    state->role_none = XML_ROLE_ENTITY_NONE;
561
605
    return XML_ROLE_ENTITY_VALUE;
562
1.95k
  }
563
7
  return common(state, tok);
564
1.95k
}
565
566
static int PTRCALL
567
entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568
158
        const ENCODING *enc) {
569
158
  UNUSED_P(ptr);
570
158
  UNUSED_P(end);
571
158
  UNUSED_P(enc);
572
158
  switch (tok) {
573
81
  case XML_TOK_PROLOG_S:
574
81
    return XML_ROLE_ENTITY_NONE;
575
76
  case XML_TOK_LITERAL:
576
76
    state->handler = entity9;
577
76
    return XML_ROLE_ENTITY_PUBLIC_ID;
578
158
  }
579
1
  return common(state, tok);
580
158
}
581
582
static int PTRCALL
583
entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584
699
        const ENCODING *enc) {
585
699
  UNUSED_P(ptr);
586
699
  UNUSED_P(end);
587
699
  UNUSED_P(enc);
588
699
  switch (tok) {
589
350
  case XML_TOK_PROLOG_S:
590
350
    return XML_ROLE_ENTITY_NONE;
591
347
  case XML_TOK_LITERAL:
592
347
    state->handler = entity10;
593
347
    return XML_ROLE_ENTITY_SYSTEM_ID;
594
699
  }
595
2
  return common(state, tok);
596
699
}
597
598
static int PTRCALL
599
entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600
608
         const ENCODING *enc) {
601
608
  UNUSED_P(ptr);
602
608
  UNUSED_P(end);
603
608
  UNUSED_P(enc);
604
608
  switch (tok) {
605
266
  case XML_TOK_PROLOG_S:
606
266
    return XML_ROLE_ENTITY_NONE;
607
340
  case XML_TOK_DECL_CLOSE:
608
340
    setTopLevel(state);
609
340
    return XML_ROLE_ENTITY_COMPLETE;
610
608
  }
611
2
  return common(state, tok);
612
608
}
613
614
static int PTRCALL
615
notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616
2.46k
          const ENCODING *enc) {
617
2.46k
  UNUSED_P(ptr);
618
2.46k
  UNUSED_P(end);
619
2.46k
  UNUSED_P(enc);
620
2.46k
  switch (tok) {
621
1.23k
  case XML_TOK_PROLOG_S:
622
1.23k
    return XML_ROLE_NOTATION_NONE;
623
1.23k
  case XML_TOK_NAME:
624
1.23k
    state->handler = notation1;
625
1.23k
    return XML_ROLE_NOTATION_NAME;
626
2.46k
  }
627
0
  return common(state, tok);
628
2.46k
}
629
630
static int PTRCALL
631
notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632
2.45k
          const ENCODING *enc) {
633
2.45k
  switch (tok) {
634
1.23k
  case XML_TOK_PROLOG_S:
635
1.23k
    return XML_ROLE_NOTATION_NONE;
636
1.22k
  case XML_TOK_NAME:
637
1.22k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638
69
      state->handler = notation3;
639
69
      return XML_ROLE_NOTATION_NONE;
640
69
    }
641
1.15k
    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642
1.15k
      state->handler = notation2;
643
1.15k
      return XML_ROLE_NOTATION_NONE;
644
1.15k
    }
645
4
    break;
646
2.45k
  }
647
5
  return common(state, tok);
648
2.45k
}
649
650
static int PTRCALL
651
notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652
2.30k
          const ENCODING *enc) {
653
2.30k
  UNUSED_P(ptr);
654
2.30k
  UNUSED_P(end);
655
2.30k
  UNUSED_P(enc);
656
2.30k
  switch (tok) {
657
1.15k
  case XML_TOK_PROLOG_S:
658
1.15k
    return XML_ROLE_NOTATION_NONE;
659
1.14k
  case XML_TOK_LITERAL:
660
1.14k
    state->handler = notation4;
661
1.14k
    return XML_ROLE_NOTATION_PUBLIC_ID;
662
2.30k
  }
663
0
  return common(state, tok);
664
2.30k
}
665
666
static int PTRCALL
667
notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668
134
          const ENCODING *enc) {
669
134
  UNUSED_P(ptr);
670
134
  UNUSED_P(end);
671
134
  UNUSED_P(enc);
672
134
  switch (tok) {
673
69
  case XML_TOK_PROLOG_S:
674
69
    return XML_ROLE_NOTATION_NONE;
675
62
  case XML_TOK_LITERAL:
676
62
    state->handler = declClose;
677
62
    state->role_none = XML_ROLE_NOTATION_NONE;
678
62
    return XML_ROLE_NOTATION_SYSTEM_ID;
679
134
  }
680
3
  return common(state, tok);
681
134
}
682
683
static int PTRCALL
684
notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685
2.06k
          const ENCODING *enc) {
686
2.06k
  UNUSED_P(ptr);
687
2.06k
  UNUSED_P(end);
688
2.06k
  UNUSED_P(enc);
689
2.06k
  switch (tok) {
690
919
  case XML_TOK_PROLOG_S:
691
919
    return XML_ROLE_NOTATION_NONE;
692
780
  case XML_TOK_LITERAL:
693
780
    state->handler = declClose;
694
780
    state->role_none = XML_ROLE_NOTATION_NONE;
695
780
    return XML_ROLE_NOTATION_SYSTEM_ID;
696
359
  case XML_TOK_DECL_CLOSE:
697
359
    setTopLevel(state);
698
359
    return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699
2.06k
  }
700
2
  return common(state, tok);
701
2.06k
}
702
703
static int PTRCALL
704
attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705
20.4k
         const ENCODING *enc) {
706
20.4k
  UNUSED_P(ptr);
707
20.4k
  UNUSED_P(end);
708
20.4k
  UNUSED_P(enc);
709
20.4k
  switch (tok) {
710
10.2k
  case XML_TOK_PROLOG_S:
711
10.2k
    return XML_ROLE_ATTLIST_NONE;
712
10.2k
  case XML_TOK_NAME:
713
10.2k
  case XML_TOK_PREFIXED_NAME:
714
10.2k
    state->handler = attlist1;
715
10.2k
    return XML_ROLE_ATTLIST_ELEMENT_NAME;
716
20.4k
  }
717
3
  return common(state, tok);
718
20.4k
}
719
720
static int PTRCALL
721
attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722
59.0k
         const ENCODING *enc) {
723
59.0k
  UNUSED_P(ptr);
724
59.0k
  UNUSED_P(end);
725
59.0k
  UNUSED_P(enc);
726
59.0k
  switch (tok) {
727
24.7k
  case XML_TOK_PROLOG_S:
728
24.7k
    return XML_ROLE_ATTLIST_NONE;
729
9.68k
  case XML_TOK_DECL_CLOSE:
730
9.68k
    setTopLevel(state);
731
9.68k
    return XML_ROLE_ATTLIST_NONE;
732
24.6k
  case XML_TOK_NAME:
733
24.6k
  case XML_TOK_PREFIXED_NAME:
734
24.6k
    state->handler = attlist2;
735
24.6k
    return XML_ROLE_ATTRIBUTE_NAME;
736
59.0k
  }
737
13
  return common(state, tok);
738
59.0k
}
739
740
static int PTRCALL
741
attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742
49.2k
         const ENCODING *enc) {
743
49.2k
  switch (tok) {
744
24.6k
  case XML_TOK_PROLOG_S:
745
24.6k
    return XML_ROLE_ATTLIST_NONE;
746
11.8k
  case XML_TOK_NAME: {
747
11.8k
    static const char *const types[] = {
748
11.8k
        KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
749
11.8k
        KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750
11.8k
    };
751
11.8k
    int i;
752
24.7k
    for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753
24.3k
      if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754
11.5k
        state->handler = attlist8;
755
11.5k
        return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756
11.5k
      }
757
11.8k
  }
758
352
    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759
316
      state->handler = attlist5;
760
316
      return XML_ROLE_ATTLIST_NONE;
761
316
    }
762
36
    break;
763
12.7k
  case XML_TOK_OPEN_PAREN:
764
12.7k
    state->handler = attlist3;
765
12.7k
    return XML_ROLE_ATTLIST_NONE;
766
49.2k
  }
767
48
  return common(state, tok);
768
49.2k
}
769
770
static int PTRCALL
771
attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772
13.9k
         const ENCODING *enc) {
773
13.9k
  UNUSED_P(ptr);
774
13.9k
  UNUSED_P(end);
775
13.9k
  UNUSED_P(enc);
776
13.9k
  switch (tok) {
777
246
  case XML_TOK_PROLOG_S:
778
246
    return XML_ROLE_ATTLIST_NONE;
779
3.87k
  case XML_TOK_NMTOKEN:
780
13.6k
  case XML_TOK_NAME:
781
13.6k
  case XML_TOK_PREFIXED_NAME:
782
13.6k
    state->handler = attlist4;
783
13.6k
    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784
13.9k
  }
785
3
  return common(state, tok);
786
13.9k
}
787
788
static int PTRCALL
789
attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790
13.9k
         const ENCODING *enc) {
791
13.9k
  UNUSED_P(ptr);
792
13.9k
  UNUSED_P(end);
793
13.9k
  UNUSED_P(enc);
794
13.9k
  switch (tok) {
795
305
  case XML_TOK_PROLOG_S:
796
305
    return XML_ROLE_ATTLIST_NONE;
797
12.6k
  case XML_TOK_CLOSE_PAREN:
798
12.6k
    state->handler = attlist8;
799
12.6k
    return XML_ROLE_ATTLIST_NONE;
800
988
  case XML_TOK_OR:
801
988
    state->handler = attlist3;
802
988
    return XML_ROLE_ATTLIST_NONE;
803
13.9k
  }
804
4
  return common(state, tok);
805
13.9k
}
806
807
static int PTRCALL
808
attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809
627
         const ENCODING *enc) {
810
627
  UNUSED_P(ptr);
811
627
  UNUSED_P(end);
812
627
  UNUSED_P(enc);
813
627
  switch (tok) {
814
318
  case XML_TOK_PROLOG_S:
815
318
    return XML_ROLE_ATTLIST_NONE;
816
308
  case XML_TOK_OPEN_PAREN:
817
308
    state->handler = attlist6;
818
308
    return XML_ROLE_ATTLIST_NONE;
819
627
  }
820
1
  return common(state, tok);
821
627
}
822
823
static int PTRCALL
824
attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825
1.29k
         const ENCODING *enc) {
826
1.29k
  UNUSED_P(ptr);
827
1.29k
  UNUSED_P(end);
828
1.29k
  UNUSED_P(enc);
829
1.29k
  switch (tok) {
830
250
  case XML_TOK_PROLOG_S:
831
250
    return XML_ROLE_ATTLIST_NONE;
832
1.04k
  case XML_TOK_NAME:
833
1.04k
    state->handler = attlist7;
834
1.04k
    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835
1.29k
  }
836
2
  return common(state, tok);
837
1.29k
}
838
839
static int PTRCALL
840
attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841
1.41k
         const ENCODING *enc) {
842
1.41k
  UNUSED_P(ptr);
843
1.41k
  UNUSED_P(end);
844
1.41k
  UNUSED_P(enc);
845
1.41k
  switch (tok) {
846
378
  case XML_TOK_PROLOG_S:
847
378
    return XML_ROLE_ATTLIST_NONE;
848
281
  case XML_TOK_CLOSE_PAREN:
849
281
    state->handler = attlist8;
850
281
    return XML_ROLE_ATTLIST_NONE;
851
746
  case XML_TOK_OR:
852
746
    state->handler = attlist6;
853
746
    return XML_ROLE_ATTLIST_NONE;
854
1.41k
  }
855
5
  return common(state, tok);
856
1.41k
}
857
858
/* default value */
859
static int PTRCALL
860
attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861
48.7k
         const ENCODING *enc) {
862
48.7k
  switch (tok) {
863
24.4k
  case XML_TOK_PROLOG_S:
864
24.4k
    return XML_ROLE_ATTLIST_NONE;
865
13.4k
  case XML_TOK_POUND_NAME:
866
13.4k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867
13.4k
                            KW_IMPLIED)) {
868
6.36k
      state->handler = attlist1;
869
6.36k
      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870
6.36k
    }
871
7.12k
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872
7.12k
                            KW_REQUIRED)) {
873
6.89k
      state->handler = attlist1;
874
6.89k
      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875
6.89k
    }
876
229
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877
229
                            KW_FIXED)) {
878
219
      state->handler = attlist9;
879
219
      return XML_ROLE_ATTLIST_NONE;
880
219
    }
881
10
    break;
882
10.8k
  case XML_TOK_LITERAL:
883
10.8k
    state->handler = attlist1;
884
10.8k
    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885
48.7k
  }
886
22
  return common(state, tok);
887
48.7k
}
888
889
static int PTRCALL
890
attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891
435
         const ENCODING *enc) {
892
435
  UNUSED_P(ptr);
893
435
  UNUSED_P(end);
894
435
  UNUSED_P(enc);
895
435
  switch (tok) {
896
220
  case XML_TOK_PROLOG_S:
897
220
    return XML_ROLE_ATTLIST_NONE;
898
211
  case XML_TOK_LITERAL:
899
211
    state->handler = attlist1;
900
211
    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901
435
  }
902
4
  return common(state, tok);
903
435
}
904
905
static int PTRCALL
906
element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907
7.34k
         const ENCODING *enc) {
908
7.34k
  UNUSED_P(ptr);
909
7.34k
  UNUSED_P(end);
910
7.34k
  UNUSED_P(enc);
911
7.34k
  switch (tok) {
912
3.67k
  case XML_TOK_PROLOG_S:
913
3.67k
    return XML_ROLE_ELEMENT_NONE;
914
3.66k
  case XML_TOK_NAME:
915
3.66k
  case XML_TOK_PREFIXED_NAME:
916
3.66k
    state->handler = element1;
917
3.66k
    return XML_ROLE_ELEMENT_NAME;
918
7.34k
  }
919
1
  return common(state, tok);
920
7.34k
}
921
922
static int PTRCALL
923
element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924
7.32k
         const ENCODING *enc) {
925
7.32k
  switch (tok) {
926
3.66k
  case XML_TOK_PROLOG_S:
927
3.66k
    return XML_ROLE_ELEMENT_NONE;
928
455
  case XML_TOK_NAME:
929
455
    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930
194
      state->handler = declClose;
931
194
      state->role_none = XML_ROLE_ELEMENT_NONE;
932
194
      return XML_ROLE_CONTENT_EMPTY;
933
194
    }
934
261
    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935
259
      state->handler = declClose;
936
259
      state->role_none = XML_ROLE_ELEMENT_NONE;
937
259
      return XML_ROLE_CONTENT_ANY;
938
259
    }
939
2
    break;
940
3.20k
  case XML_TOK_OPEN_PAREN:
941
3.20k
    state->handler = element2;
942
3.20k
    state->level = 1;
943
3.20k
    return XML_ROLE_GROUP_OPEN;
944
7.32k
  }
945
4
  return common(state, tok);
946
7.32k
}
947
948
static int PTRCALL
949
element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950
3.58k
         const ENCODING *enc) {
951
3.58k
  switch (tok) {
952
384
  case XML_TOK_PROLOG_S:
953
384
    return XML_ROLE_ELEMENT_NONE;
954
812
  case XML_TOK_POUND_NAME:
955
812
    if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956
812
                            KW_PCDATA)) {
957
810
      state->handler = element3;
958
810
      return XML_ROLE_CONTENT_PCDATA;
959
810
    }
960
2
    break;
961
516
  case XML_TOK_OPEN_PAREN:
962
516
    state->level = 2;
963
516
    state->handler = element6;
964
516
    return XML_ROLE_GROUP_OPEN;
965
1.32k
  case XML_TOK_NAME:
966
1.32k
  case XML_TOK_PREFIXED_NAME:
967
1.32k
    state->handler = element7;
968
1.32k
    return XML_ROLE_CONTENT_ELEMENT;
969
284
  case XML_TOK_NAME_QUESTION:
970
284
    state->handler = element7;
971
284
    return XML_ROLE_CONTENT_ELEMENT_OPT;
972
178
  case XML_TOK_NAME_ASTERISK:
973
178
    state->handler = element7;
974
178
    return XML_ROLE_CONTENT_ELEMENT_REP;
975
87
  case XML_TOK_NAME_PLUS:
976
87
    state->handler = element7;
977
87
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
978
3.58k
  }
979
3
  return common(state, tok);
980
3.58k
}
981
982
static int PTRCALL
983
element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984
1.15k
         const ENCODING *enc) {
985
1.15k
  UNUSED_P(ptr);
986
1.15k
  UNUSED_P(end);
987
1.15k
  UNUSED_P(enc);
988
1.15k
  switch (tok) {
989
354
  case XML_TOK_PROLOG_S:
990
354
    return XML_ROLE_ELEMENT_NONE;
991
338
  case XML_TOK_CLOSE_PAREN:
992
338
    state->handler = declClose;
993
338
    state->role_none = XML_ROLE_ELEMENT_NONE;
994
338
    return XML_ROLE_GROUP_CLOSE;
995
234
  case XML_TOK_CLOSE_PAREN_ASTERISK:
996
234
    state->handler = declClose;
997
234
    state->role_none = XML_ROLE_ELEMENT_NONE;
998
234
    return XML_ROLE_GROUP_CLOSE_REP;
999
225
  case XML_TOK_OR:
1000
225
    state->handler = element4;
1001
225
    return XML_ROLE_ELEMENT_NONE;
1002
1.15k
  }
1003
5
  return common(state, tok);
1004
1.15k
}
1005
1006
static int PTRCALL
1007
element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008
1.15k
         const ENCODING *enc) {
1009
1.15k
  UNUSED_P(ptr);
1010
1.15k
  UNUSED_P(end);
1011
1.15k
  UNUSED_P(enc);
1012
1.15k
  switch (tok) {
1013
262
  case XML_TOK_PROLOG_S:
1014
262
    return XML_ROLE_ELEMENT_NONE;
1015
893
  case XML_TOK_NAME:
1016
893
  case XML_TOK_PREFIXED_NAME:
1017
893
    state->handler = element5;
1018
893
    return XML_ROLE_CONTENT_ELEMENT;
1019
1.15k
  }
1020
4
  return common(state, tok);
1021
1.15k
}
1022
1023
static int PTRCALL
1024
element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025
1.16k
         const ENCODING *enc) {
1026
1.16k
  UNUSED_P(ptr);
1027
1.16k
  UNUSED_P(end);
1028
1.16k
  UNUSED_P(enc);
1029
1.16k
  switch (tok) {
1030
278
  case XML_TOK_PROLOG_S:
1031
278
    return XML_ROLE_ELEMENT_NONE;
1032
197
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1033
197
    state->handler = declClose;
1034
197
    state->role_none = XML_ROLE_ELEMENT_NONE;
1035
197
    return XML_ROLE_GROUP_CLOSE_REP;
1036
683
  case XML_TOK_OR:
1037
683
    state->handler = element4;
1038
683
    return XML_ROLE_ELEMENT_NONE;
1039
1.16k
  }
1040
2
  return common(state, tok);
1041
1.16k
}
1042
1043
static int PTRCALL
1044
element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045
537k
         const ENCODING *enc) {
1046
537k
  UNUSED_P(ptr);
1047
537k
  UNUSED_P(end);
1048
537k
  UNUSED_P(enc);
1049
537k
  switch (tok) {
1050
4.35k
  case XML_TOK_PROLOG_S:
1051
4.35k
    return XML_ROLE_ELEMENT_NONE;
1052
528k
  case XML_TOK_OPEN_PAREN:
1053
528k
    state->level += 1;
1054
528k
    return XML_ROLE_GROUP_OPEN;
1055
4.65k
  case XML_TOK_NAME:
1056
4.65k
  case XML_TOK_PREFIXED_NAME:
1057
4.65k
    state->handler = element7;
1058
4.65k
    return XML_ROLE_CONTENT_ELEMENT;
1059
409
  case XML_TOK_NAME_QUESTION:
1060
409
    state->handler = element7;
1061
409
    return XML_ROLE_CONTENT_ELEMENT_OPT;
1062
204
  case XML_TOK_NAME_ASTERISK:
1063
204
    state->handler = element7;
1064
204
    return XML_ROLE_CONTENT_ELEMENT_REP;
1065
88
  case XML_TOK_NAME_PLUS:
1066
88
    state->handler = element7;
1067
88
    return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068
537k
  }
1069
19
  return common(state, tok);
1070
537k
}
1071
1072
static int PTRCALL
1073
element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074
12.1k
         const ENCODING *enc) {
1075
12.1k
  UNUSED_P(ptr);
1076
12.1k
  UNUSED_P(end);
1077
12.1k
  UNUSED_P(enc);
1078
12.1k
  switch (tok) {
1079
1.59k
  case XML_TOK_PROLOG_S:
1080
1.59k
    return XML_ROLE_ELEMENT_NONE;
1081
2.48k
  case XML_TOK_CLOSE_PAREN:
1082
2.48k
    state->level -= 1;
1083
2.48k
    if (state->level == 0) {
1084
398
      state->handler = declClose;
1085
398
      state->role_none = XML_ROLE_ELEMENT_NONE;
1086
398
    }
1087
2.48k
    return XML_ROLE_GROUP_CLOSE;
1088
936
  case XML_TOK_CLOSE_PAREN_ASTERISK:
1089
936
    state->level -= 1;
1090
936
    if (state->level == 0) {
1091
452
      state->handler = declClose;
1092
452
      state->role_none = XML_ROLE_ELEMENT_NONE;
1093
452
    }
1094
936
    return XML_ROLE_GROUP_CLOSE_REP;
1095
1.22k
  case XML_TOK_CLOSE_PAREN_QUESTION:
1096
1.22k
    state->level -= 1;
1097
1.22k
    if (state->level == 0) {
1098
959
      state->handler = declClose;
1099
959
      state->role_none = XML_ROLE_ELEMENT_NONE;
1100
959
    }
1101
1.22k
    return XML_ROLE_GROUP_CLOSE_OPT;
1102
920
  case XML_TOK_CLOSE_PAREN_PLUS:
1103
920
    state->level -= 1;
1104
920
    if (state->level == 0) {
1105
382
      state->handler = declClose;
1106
382
      state->role_none = XML_ROLE_ELEMENT_NONE;
1107
382
    }
1108
920
    return XML_ROLE_GROUP_CLOSE_PLUS;
1109
1.50k
  case XML_TOK_COMMA:
1110
1.50k
    state->handler = element6;
1111
1.50k
    return XML_ROLE_GROUP_SEQUENCE;
1112
3.41k
  case XML_TOK_OR:
1113
3.41k
    state->handler = element6;
1114
3.41k
    return XML_ROLE_GROUP_CHOICE;
1115
12.1k
  }
1116
28
  return common(state, tok);
1117
12.1k
}
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
10.9k
          const ENCODING *enc) {
1179
10.9k
  UNUSED_P(ptr);
1180
10.9k
  UNUSED_P(end);
1181
10.9k
  UNUSED_P(enc);
1182
10.9k
  switch (tok) {
1183
195
  case XML_TOK_PROLOG_S:
1184
195
    return state->role_none;
1185
10.7k
  case XML_TOK_DECL_CLOSE:
1186
10.7k
    setTopLevel(state);
1187
10.7k
    return state->role_none;
1188
10.9k
  }
1189
31
  return common(state, tok);
1190
10.9k
}
1191
1192
/* This function will only be invoked if the internal logic of the
1193
 * parser has broken down.  It is used in two cases:
1194
 *
1195
 * 1: When the XML prolog has been finished.  At this point the
1196
 * processor (the parser level above these role handlers) should
1197
 * switch from prologProcessor to contentProcessor and reinitialise
1198
 * the handler function.
1199
 *
1200
 * 2: When an error has been detected (via common() below).  At this
1201
 * point again the processor should be switched to errorProcessor,
1202
 * which will never call a handler.
1203
 *
1204
 * The result of this is that error() can only be called if the
1205
 * processor switch failed to happen, which is an internal error and
1206
 * therefore we shouldn't be able to provoke it simply by using the
1207
 * library.  It is a necessary backstop, however, so we merely exclude
1208
 * it from the coverage statistics.
1209
 *
1210
 * LCOV_EXCL_START
1211
 */
1212
static int PTRCALL
1213
error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1214
0
      const ENCODING *enc) {
1215
0
  UNUSED_P(state);
1216
0
  UNUSED_P(tok);
1217
0
  UNUSED_P(ptr);
1218
0
  UNUSED_P(end);
1219
0
  UNUSED_P(enc);
1220
0
  return XML_ROLE_NONE;
1221
0
}
1222
/* LCOV_EXCL_STOP */
1223
1224
static int FASTCALL
1225
644
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
644
  UNUSED_P(tok);
1231
644
#endif
1232
644
  state->handler = error;
1233
644
  return XML_ROLE_ERROR;
1234
644
}
1235
1236
void
1237
7.48k
XmlPrologStateInit(PROLOG_STATE *state) {
1238
7.48k
  state->handler = prolog0;
1239
#ifdef XML_DTD
1240
  state->documentEntity = 1;
1241
  state->includeLevel = 0;
1242
  state->inEntityValue = 0;
1243
#endif /* XML_DTD */
1244
7.48k
}
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 */