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