4 / _ \\ /| '_ \ / _` | __|
5 | __// \| |_) | (_| | |_
6 \___/_/\_\ .__/ \__,_|\__|
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:
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
29 The above copyright notice and this permission notice shall be included
30 in all copies or substantial portions of the Software.
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.
41 #include <expat_config.h>
46 # include "winconfig.h"
49 #include "expat_external.h"
56 that ,| are not mixed in a model group
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'};
84 static const char KW_IGNORE[]
85 = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
87 static const char KW_IMPLIED[]
88 = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
90 static const char KW_INCLUDE[]
91 = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
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'};
110 #ifndef MIN_BYTES_PER_CHAR
111 # define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
115 # define setTopLevel(state) \
117 = ((state)->documentEntity ? internalSubset : externalSubset1))
118 #else /* not XML_DTD */
119 # define setTopLevel(state) ((state)->handler = internalSubset)
120 #endif /* not XML_DTD */
122 typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
123 const char *ptr, const char *end,
124 const ENCODING *enc);
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,
134 externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
138 static int FASTCALL common(PROLOG_STATE *state, int tok);
141 prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
142 const ENCODING *enc) {
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;
151 state->handler = prolog1;
153 case XML_TOK_COMMENT:
154 state->handler = prolog1;
155 return XML_ROLE_COMMENT;
157 return XML_ROLE_NONE;
158 case XML_TOK_DECL_OPEN:
159 if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
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;
168 return common(state, tok);
172 prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
173 const ENCODING *enc) {
175 case XML_TOK_PROLOG_S:
176 return XML_ROLE_NONE;
179 case XML_TOK_COMMENT:
180 return XML_ROLE_COMMENT;
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.
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,
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;
200 return common(state, tok);
204 prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
205 const ENCODING *enc) {
210 case XML_TOK_PROLOG_S:
211 return XML_ROLE_NONE;
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;
220 return common(state, tok);
224 doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
225 const ENCODING *enc) {
230 case XML_TOK_PROLOG_S:
231 return XML_ROLE_DOCTYPE_NONE;
233 case XML_TOK_PREFIXED_NAME:
234 state->handler = doctype1;
235 return XML_ROLE_DOCTYPE_NAME;
237 return common(state, tok);
241 doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
242 const ENCODING *enc) {
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;
253 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254 state->handler = doctype3;
255 return XML_ROLE_DOCTYPE_NONE;
257 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258 state->handler = doctype2;
259 return XML_ROLE_DOCTYPE_NONE;
263 return common(state, tok);
267 doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
268 const ENCODING *enc) {
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;
279 return common(state, tok);
283 doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
284 const ENCODING *enc) {
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;
295 return common(state, tok);
299 doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
300 const ENCODING *enc) {
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;
314 return common(state, tok);
318 doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
319 const ENCODING *enc) {
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;
330 return common(state, tok);
334 internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
335 const ENCODING *enc) {
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,
342 state->handler = entity0;
343 return XML_ROLE_ENTITY_NONE;
345 if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
347 state->handler = attlist0;
348 return XML_ROLE_ATTLIST_NONE;
350 if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
352 state->handler = element0;
353 return XML_ROLE_ELEMENT_NONE;
355 if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
357 state->handler = notation0;
358 return XML_ROLE_NOTATION_NONE;
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;
371 return XML_ROLE_NONE;
373 return common(state, tok);
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);
388 externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
389 const ENCODING *enc) {
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)
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:
404 if (state->includeLevel)
406 return XML_ROLE_NONE;
408 return internalSubset(state, tok, ptr, end, enc);
410 return common(state, tok);
416 entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
417 const ENCODING *enc) {
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;
428 state->handler = entity2;
429 return XML_ROLE_GENERAL_ENTITY_NAME;
431 return common(state, tok);
435 entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
436 const ENCODING *enc) {
441 case XML_TOK_PROLOG_S:
442 return XML_ROLE_ENTITY_NONE;
444 state->handler = entity7;
445 return XML_ROLE_PARAM_ENTITY_NAME;
447 return common(state, tok);
451 entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
452 const ENCODING *enc) {
454 case XML_TOK_PROLOG_S:
455 return XML_ROLE_ENTITY_NONE;
457 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458 state->handler = entity4;
459 return XML_ROLE_ENTITY_NONE;
461 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462 state->handler = entity3;
463 return XML_ROLE_ENTITY_NONE;
466 case XML_TOK_LITERAL:
467 state->handler = declClose;
468 state->role_none = XML_ROLE_ENTITY_NONE;
469 return XML_ROLE_ENTITY_VALUE;
471 return common(state, tok);
475 entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
476 const ENCODING *enc) {
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;
487 return common(state, tok);
491 entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
492 const ENCODING *enc) {
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;
503 return common(state, tok);
507 entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
508 const ENCODING *enc) {
510 case XML_TOK_PROLOG_S:
511 return XML_ROLE_ENTITY_NONE;
512 case XML_TOK_DECL_CLOSE:
514 return XML_ROLE_ENTITY_COMPLETE;
516 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517 state->handler = entity6;
518 return XML_ROLE_ENTITY_NONE;
522 return common(state, tok);
526 entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
527 const ENCODING *enc) {
532 case XML_TOK_PROLOG_S:
533 return XML_ROLE_ENTITY_NONE;
535 state->handler = declClose;
536 state->role_none = XML_ROLE_ENTITY_NONE;
537 return XML_ROLE_ENTITY_NOTATION_NAME;
539 return common(state, tok);
543 entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
544 const ENCODING *enc) {
546 case XML_TOK_PROLOG_S:
547 return XML_ROLE_ENTITY_NONE;
549 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550 state->handler = entity9;
551 return XML_ROLE_ENTITY_NONE;
553 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554 state->handler = entity8;
555 return XML_ROLE_ENTITY_NONE;
558 case XML_TOK_LITERAL:
559 state->handler = declClose;
560 state->role_none = XML_ROLE_ENTITY_NONE;
561 return XML_ROLE_ENTITY_VALUE;
563 return common(state, tok);
567 entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
568 const ENCODING *enc) {
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;
579 return common(state, tok);
583 entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
584 const ENCODING *enc) {
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;
595 return common(state, tok);
599 entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
600 const ENCODING *enc) {
605 case XML_TOK_PROLOG_S:
606 return XML_ROLE_ENTITY_NONE;
607 case XML_TOK_DECL_CLOSE:
609 return XML_ROLE_ENTITY_COMPLETE;
611 return common(state, tok);
615 notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
616 const ENCODING *enc) {
621 case XML_TOK_PROLOG_S:
622 return XML_ROLE_NOTATION_NONE;
624 state->handler = notation1;
625 return XML_ROLE_NOTATION_NAME;
627 return common(state, tok);
631 notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
632 const ENCODING *enc) {
634 case XML_TOK_PROLOG_S:
635 return XML_ROLE_NOTATION_NONE;
637 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638 state->handler = notation3;
639 return XML_ROLE_NOTATION_NONE;
641 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642 state->handler = notation2;
643 return XML_ROLE_NOTATION_NONE;
647 return common(state, tok);
651 notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
652 const ENCODING *enc) {
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;
663 return common(state, tok);
667 notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
668 const ENCODING *enc) {
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;
680 return common(state, tok);
684 notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
685 const ENCODING *enc) {
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:
698 return XML_ROLE_NOTATION_NO_SYSTEM_ID;
700 return common(state, tok);
704 attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
705 const ENCODING *enc) {
710 case XML_TOK_PROLOG_S:
711 return XML_ROLE_ATTLIST_NONE;
713 case XML_TOK_PREFIXED_NAME:
714 state->handler = attlist1;
715 return XML_ROLE_ATTLIST_ELEMENT_NAME;
717 return common(state, tok);
721 attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
722 const ENCODING *enc) {
727 case XML_TOK_PROLOG_S:
728 return XML_ROLE_ATTLIST_NONE;
729 case XML_TOK_DECL_CLOSE:
731 return XML_ROLE_ATTLIST_NONE;
733 case XML_TOK_PREFIXED_NAME:
734 state->handler = attlist2;
735 return XML_ROLE_ATTRIBUTE_NAME;
737 return common(state, tok);
741 attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
742 const ENCODING *enc) {
744 case XML_TOK_PROLOG_S:
745 return XML_ROLE_ATTLIST_NONE;
747 static const char *const types[] = {
748 KW_CDATA, KW_ID, KW_IDREF, KW_IDREFS,
749 KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
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;
758 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759 state->handler = attlist5;
760 return XML_ROLE_ATTLIST_NONE;
763 case XML_TOK_OPEN_PAREN:
764 state->handler = attlist3;
765 return XML_ROLE_ATTLIST_NONE;
767 return common(state, tok);
771 attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
772 const ENCODING *enc) {
777 case XML_TOK_PROLOG_S:
778 return XML_ROLE_ATTLIST_NONE;
779 case XML_TOK_NMTOKEN:
781 case XML_TOK_PREFIXED_NAME:
782 state->handler = attlist4;
783 return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
785 return common(state, tok);
789 attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
790 const ENCODING *enc) {
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;
801 state->handler = attlist3;
802 return XML_ROLE_ATTLIST_NONE;
804 return common(state, tok);
808 attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
809 const ENCODING *enc) {
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;
820 return common(state, tok);
824 attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
825 const ENCODING *enc) {
830 case XML_TOK_PROLOG_S:
831 return XML_ROLE_ATTLIST_NONE;
833 state->handler = attlist7;
834 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
836 return common(state, tok);
840 attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
841 const ENCODING *enc) {
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;
852 state->handler = attlist6;
853 return XML_ROLE_ATTLIST_NONE;
855 return common(state, tok);
860 attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
861 const ENCODING *enc) {
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,
868 state->handler = attlist1;
869 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
871 if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
873 state->handler = attlist1;
874 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
876 if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
878 state->handler = attlist9;
879 return XML_ROLE_ATTLIST_NONE;
882 case XML_TOK_LITERAL:
883 state->handler = attlist1;
884 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
886 return common(state, tok);
890 attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
891 const ENCODING *enc) {
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;
902 return common(state, tok);
906 element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
907 const ENCODING *enc) {
912 case XML_TOK_PROLOG_S:
913 return XML_ROLE_ELEMENT_NONE;
915 case XML_TOK_PREFIXED_NAME:
916 state->handler = element1;
917 return XML_ROLE_ELEMENT_NAME;
919 return common(state, tok);
923 element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
924 const ENCODING *enc) {
926 case XML_TOK_PROLOG_S:
927 return XML_ROLE_ELEMENT_NONE;
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;
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;
940 case XML_TOK_OPEN_PAREN:
941 state->handler = element2;
943 return XML_ROLE_GROUP_OPEN;
945 return common(state, tok);
949 element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
950 const ENCODING *enc) {
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,
957 state->handler = element3;
958 return XML_ROLE_CONTENT_PCDATA;
961 case XML_TOK_OPEN_PAREN:
963 state->handler = element6;
964 return XML_ROLE_GROUP_OPEN;
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;
979 return common(state, tok);
983 element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
984 const ENCODING *enc) {
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;
1000 state->handler = element4;
1001 return XML_ROLE_ELEMENT_NONE;
1003 return common(state, tok);
1007 element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1008 const ENCODING *enc) {
1013 case XML_TOK_PROLOG_S:
1014 return XML_ROLE_ELEMENT_NONE;
1016 case XML_TOK_PREFIXED_NAME:
1017 state->handler = element5;
1018 return XML_ROLE_CONTENT_ELEMENT;
1020 return common(state, tok);
1024 element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1025 const ENCODING *enc) {
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;
1037 state->handler = element4;
1038 return XML_ROLE_ELEMENT_NONE;
1040 return common(state, tok);
1044 element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1045 const ENCODING *enc) {
1050 case XML_TOK_PROLOG_S:
1051 return XML_ROLE_ELEMENT_NONE;
1052 case XML_TOK_OPEN_PAREN:
1054 return XML_ROLE_GROUP_OPEN;
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;
1069 return common(state, tok);
1073 element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1074 const ENCODING *enc) {
1079 case XML_TOK_PROLOG_S:
1080 return XML_ROLE_ELEMENT_NONE;
1081 case XML_TOK_CLOSE_PAREN:
1083 if (state->level == 0) {
1084 state->handler = declClose;
1085 state->role_none = XML_ROLE_ELEMENT_NONE;
1087 return XML_ROLE_GROUP_CLOSE;
1088 case XML_TOK_CLOSE_PAREN_ASTERISK:
1090 if (state->level == 0) {
1091 state->handler = declClose;
1092 state->role_none = XML_ROLE_ELEMENT_NONE;
1094 return XML_ROLE_GROUP_CLOSE_REP;
1095 case XML_TOK_CLOSE_PAREN_QUESTION:
1097 if (state->level == 0) {
1098 state->handler = declClose;
1099 state->role_none = XML_ROLE_ELEMENT_NONE;
1101 return XML_ROLE_GROUP_CLOSE_OPT;
1102 case XML_TOK_CLOSE_PAREN_PLUS:
1104 if (state->level == 0) {
1105 state->handler = declClose;
1106 state->role_none = XML_ROLE_ELEMENT_NONE;
1108 return XML_ROLE_GROUP_CLOSE_PLUS;
1110 state->handler = element6;
1111 return XML_ROLE_GROUP_SEQUENCE;
1113 state->handler = element6;
1114 return XML_ROLE_GROUP_CHOICE;
1116 return common(state, tok);
1122 condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1123 const ENCODING *enc) {
1125 case XML_TOK_PROLOG_S:
1126 return XML_ROLE_NONE;
1128 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1129 state->handler = condSect1;
1130 return XML_ROLE_NONE;
1132 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1133 state->handler = condSect2;
1134 return XML_ROLE_NONE;
1138 return common(state, tok);
1142 condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1143 const ENCODING *enc) {
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;
1155 return common(state, tok);
1159 condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1160 const ENCODING *enc) {
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;
1171 return common(state, tok);
1174 #endif /* XML_DTD */
1177 declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1178 const ENCODING *enc) {
1183 case XML_TOK_PROLOG_S:
1184 return state->role_none;
1185 case XML_TOK_DECL_CLOSE:
1187 return state->role_none;
1189 return common(state, tok);
1192 /* This function will only be invoked if the internal logic of the
1193 * parser has broken down. It is used in two cases:
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.
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.
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.
1213 error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1214 const ENCODING *enc) {
1220 return XML_ROLE_NONE;
1222 /* LCOV_EXCL_STOP */
1225 common(PROLOG_STATE *state, int tok) {
1227 if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1228 return XML_ROLE_INNER_PARAM_ENTITY_REF;
1232 state->handler = error;
1233 return XML_ROLE_ERROR;
1237 XmlPrologStateInit(PROLOG_STATE *state) {
1238 state->handler = prolog0;
1240 state->documentEntity = 1;
1241 state->includeLevel = 0;
1242 state->inEntityValue = 0;
1243 #endif /* XML_DTD */
1249 XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
1250 state->handler = externalSubset0;
1251 state->documentEntity = 0;
1252 state->includeLevel = 0;
1255 #endif /* XML_DTD */