Coverage Report

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