Coverage Report

Created: 2025-07-07 10:01

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