Coverage Report

Created: 2025-10-10 06:51

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