xref: /netbsd-src/external/mit/expat/dist/lib/xmlrole.c (revision 0315d311127d32bec5b7d97b2ab4b7dd0718f175)
19fd04a41Smaya /*
29fd04a41Smaya                             __  __            _
39fd04a41Smaya                          ___\ \/ /_ __   __ _| |_
49fd04a41Smaya                         / _ \\  /| '_ \ / _` | __|
59fd04a41Smaya                        |  __//  \| |_) | (_| | |_
69fd04a41Smaya                         \___/_/\_\ .__/ \__,_|\__|
79fd04a41Smaya                                  |_| XML parser
89fd04a41Smaya 
99fd04a41Smaya    Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10*0315d311Schristos    Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11*0315d311Schristos    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
12*0315d311Schristos    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
13*0315d311Schristos    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14*0315d311Schristos    Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15*0315d311Schristos    Copyright (c) 2016-2021 Sebastian Pipping <sebastian@pipping.org>
16*0315d311Schristos    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
17*0315d311Schristos    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18*0315d311Schristos    Copyright (c) 2021      Dong-hee Na <donghee.na@python.org>
199fd04a41Smaya    Licensed under the MIT license:
209fd04a41Smaya 
219fd04a41Smaya    Permission is  hereby granted,  free of charge,  to any  person obtaining
229fd04a41Smaya    a  copy  of  this  software   and  associated  documentation  files  (the
239fd04a41Smaya    "Software"),  to  deal in  the  Software  without restriction,  including
249fd04a41Smaya    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
259fd04a41Smaya    distribute, sublicense, and/or sell copies of the Software, and to permit
269fd04a41Smaya    persons  to whom  the Software  is  furnished to  do so,  subject to  the
279fd04a41Smaya    following conditions:
289fd04a41Smaya 
299fd04a41Smaya    The above copyright  notice and this permission notice  shall be included
309fd04a41Smaya    in all copies or substantial portions of the Software.
319fd04a41Smaya 
329fd04a41Smaya    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
339fd04a41Smaya    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
349fd04a41Smaya    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
359fd04a41Smaya    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
369fd04a41Smaya    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
379fd04a41Smaya    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
389fd04a41Smaya    USE OR OTHER DEALINGS IN THE SOFTWARE.
39d50d1d7fStron */
40d50d1d7fStron 
41*0315d311Schristos #include <expat_config.h>
42*0315d311Schristos 
43d50d1d7fStron #include <stddef.h>
44d50d1d7fStron 
454c74f82dSchristos #ifdef _WIN32
46d50d1d7fStron #  include "winconfig.h"
47d50d1d7fStron #endif
48d50d1d7fStron 
49d50d1d7fStron #include "expat_external.h"
50d50d1d7fStron #include "internal.h"
51d50d1d7fStron #include "xmlrole.h"
52d50d1d7fStron #include "ascii.h"
53d50d1d7fStron 
54d50d1d7fStron /* Doesn't check:
55d50d1d7fStron 
56d50d1d7fStron  that ,| are not mixed in a model group
57d50d1d7fStron  content of literals
58d50d1d7fStron 
59d50d1d7fStron */
60d50d1d7fStron 
619fd04a41Smaya static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
629fd04a41Smaya static const char KW_ATTLIST[]
639fd04a41Smaya     = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
649fd04a41Smaya static const char KW_CDATA[]
659fd04a41Smaya     = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
669fd04a41Smaya static const char KW_DOCTYPE[]
679fd04a41Smaya     = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
689fd04a41Smaya static const char KW_ELEMENT[]
699fd04a41Smaya     = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
709fd04a41Smaya static const char KW_EMPTY[]
719fd04a41Smaya     = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
729fd04a41Smaya static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
739fd04a41Smaya                                    ASCII_I, ASCII_E, ASCII_S, '\0'};
749fd04a41Smaya static const char KW_ENTITY[]
759fd04a41Smaya     = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
769fd04a41Smaya static const char KW_FIXED[]
779fd04a41Smaya     = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
789fd04a41Smaya static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
799fd04a41Smaya static const char KW_IDREF[]
809fd04a41Smaya     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
819fd04a41Smaya static const char KW_IDREFS[]
829fd04a41Smaya     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83d50d1d7fStron #ifdef XML_DTD
849fd04a41Smaya static const char KW_IGNORE[]
859fd04a41Smaya     = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86d50d1d7fStron #endif
879fd04a41Smaya static const char KW_IMPLIED[]
889fd04a41Smaya     = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89d50d1d7fStron #ifdef XML_DTD
909fd04a41Smaya static const char KW_INCLUDE[]
919fd04a41Smaya     = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92d50d1d7fStron #endif
939fd04a41Smaya static const char KW_NDATA[]
949fd04a41Smaya     = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
959fd04a41Smaya static const char KW_NMTOKEN[]
969fd04a41Smaya     = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
979fd04a41Smaya static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
989fd04a41Smaya                                    ASCII_E, ASCII_N, ASCII_S, '\0'};
999fd04a41Smaya static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
1009fd04a41Smaya                                    ASCII_I, ASCII_O, ASCII_N, '\0'};
1019fd04a41Smaya static const char KW_PCDATA[]
1029fd04a41Smaya     = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
1039fd04a41Smaya static const char KW_PUBLIC[]
1049fd04a41Smaya     = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
1059fd04a41Smaya static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
1069fd04a41Smaya                                    ASCII_R, ASCII_E, ASCII_D, '\0'};
1079fd04a41Smaya static const char KW_SYSTEM[]
1089fd04a41Smaya     = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
109d50d1d7fStron 
110d50d1d7fStron #ifndef MIN_BYTES_PER_CHAR
111d50d1d7fStron #  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
112d50d1d7fStron #endif
113d50d1d7fStron 
114d50d1d7fStron #ifdef XML_DTD
115d50d1d7fStron #  define setTopLevel(state)                                                   \
1169fd04a41Smaya     ((state)->handler                                                          \
1179fd04a41Smaya      = ((state)->documentEntity ? internalSubset : externalSubset1))
118d50d1d7fStron #else /* not XML_DTD */
119d50d1d7fStron #  define setTopLevel(state) ((state)->handler = internalSubset)
120d50d1d7fStron #endif /* not XML_DTD */
121d50d1d7fStron 
1229fd04a41Smaya typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
1239fd04a41Smaya                                    const char *ptr, const char *end,
124d50d1d7fStron                                    const ENCODING *enc);
125d50d1d7fStron 
1269fd04a41Smaya static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
1279fd04a41Smaya     doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
1289fd04a41Smaya     entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
1299fd04a41Smaya     notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
1309fd04a41Smaya     attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
1319fd04a41Smaya     attlist9, element0, element1, element2, element3, element4, element5,
1329fd04a41Smaya     element6, element7,
133d50d1d7fStron #ifdef XML_DTD
1349fd04a41Smaya     externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
135d50d1d7fStron #endif /* XML_DTD */
1369fd04a41Smaya     declClose, error;
137d50d1d7fStron 
138d50d1d7fStron static int FASTCALL common(PROLOG_STATE *state, int tok);
139d50d1d7fStron 
140d50d1d7fStron static int PTRCALL
prolog0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)1419fd04a41Smaya prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1429fd04a41Smaya         const ENCODING *enc) {
143d50d1d7fStron   switch (tok) {
144d50d1d7fStron   case XML_TOK_PROLOG_S:
145d50d1d7fStron     state->handler = prolog1;
146d50d1d7fStron     return XML_ROLE_NONE;
147d50d1d7fStron   case XML_TOK_XML_DECL:
148d50d1d7fStron     state->handler = prolog1;
149d50d1d7fStron     return XML_ROLE_XML_DECL;
150d50d1d7fStron   case XML_TOK_PI:
151d50d1d7fStron     state->handler = prolog1;
152d50d1d7fStron     return XML_ROLE_PI;
153d50d1d7fStron   case XML_TOK_COMMENT:
154d50d1d7fStron     state->handler = prolog1;
155d50d1d7fStron     return XML_ROLE_COMMENT;
156d50d1d7fStron   case XML_TOK_BOM:
157d50d1d7fStron     return XML_ROLE_NONE;
158d50d1d7fStron   case XML_TOK_DECL_OPEN:
1599fd04a41Smaya     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
160d50d1d7fStron                               KW_DOCTYPE))
161d50d1d7fStron       break;
162d50d1d7fStron     state->handler = doctype0;
163d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
164d50d1d7fStron   case XML_TOK_INSTANCE_START:
165d50d1d7fStron     state->handler = error;
166d50d1d7fStron     return XML_ROLE_INSTANCE_START;
167d50d1d7fStron   }
168d50d1d7fStron   return common(state, tok);
169d50d1d7fStron }
170d50d1d7fStron 
171d50d1d7fStron static int PTRCALL
prolog1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)1729fd04a41Smaya prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1739fd04a41Smaya         const ENCODING *enc) {
174d50d1d7fStron   switch (tok) {
175d50d1d7fStron   case XML_TOK_PROLOG_S:
176d50d1d7fStron     return XML_ROLE_NONE;
177d50d1d7fStron   case XML_TOK_PI:
178d50d1d7fStron     return XML_ROLE_PI;
179d50d1d7fStron   case XML_TOK_COMMENT:
180d50d1d7fStron     return XML_ROLE_COMMENT;
181d50d1d7fStron   case XML_TOK_BOM:
1829fd04a41Smaya     /* This case can never arise.  To reach this role function, the
1839fd04a41Smaya      * parse must have passed through prolog0 and therefore have had
1849fd04a41Smaya      * some form of input, even if only a space.  At that point, a
1859fd04a41Smaya      * byte order mark is no longer a valid character (though
1869fd04a41Smaya      * technically it should be interpreted as a non-breaking space),
1879fd04a41Smaya      * so will be rejected by the tokenizing stages.
1889fd04a41Smaya      */
1899fd04a41Smaya     return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
190d50d1d7fStron   case XML_TOK_DECL_OPEN:
1919fd04a41Smaya     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
192d50d1d7fStron                               KW_DOCTYPE))
193d50d1d7fStron       break;
194d50d1d7fStron     state->handler = doctype0;
195d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
196d50d1d7fStron   case XML_TOK_INSTANCE_START:
197d50d1d7fStron     state->handler = error;
198d50d1d7fStron     return XML_ROLE_INSTANCE_START;
199d50d1d7fStron   }
200d50d1d7fStron   return common(state, tok);
201d50d1d7fStron }
202d50d1d7fStron 
203d50d1d7fStron static int PTRCALL
prolog2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2049fd04a41Smaya prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2059fd04a41Smaya         const ENCODING *enc) {
2069fd04a41Smaya   UNUSED_P(ptr);
2079fd04a41Smaya   UNUSED_P(end);
2089fd04a41Smaya   UNUSED_P(enc);
209d50d1d7fStron   switch (tok) {
210d50d1d7fStron   case XML_TOK_PROLOG_S:
211d50d1d7fStron     return XML_ROLE_NONE;
212d50d1d7fStron   case XML_TOK_PI:
213d50d1d7fStron     return XML_ROLE_PI;
214d50d1d7fStron   case XML_TOK_COMMENT:
215d50d1d7fStron     return XML_ROLE_COMMENT;
216d50d1d7fStron   case XML_TOK_INSTANCE_START:
217d50d1d7fStron     state->handler = error;
218d50d1d7fStron     return XML_ROLE_INSTANCE_START;
219d50d1d7fStron   }
220d50d1d7fStron   return common(state, tok);
221d50d1d7fStron }
222d50d1d7fStron 
223d50d1d7fStron static int PTRCALL
doctype0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2249fd04a41Smaya doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2259fd04a41Smaya          const ENCODING *enc) {
2269fd04a41Smaya   UNUSED_P(ptr);
2279fd04a41Smaya   UNUSED_P(end);
2289fd04a41Smaya   UNUSED_P(enc);
229d50d1d7fStron   switch (tok) {
230d50d1d7fStron   case XML_TOK_PROLOG_S:
231d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
232d50d1d7fStron   case XML_TOK_NAME:
233d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
234d50d1d7fStron     state->handler = doctype1;
235d50d1d7fStron     return XML_ROLE_DOCTYPE_NAME;
236d50d1d7fStron   }
237d50d1d7fStron   return common(state, tok);
238d50d1d7fStron }
239d50d1d7fStron 
240d50d1d7fStron static int PTRCALL
doctype1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2419fd04a41Smaya doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2429fd04a41Smaya          const ENCODING *enc) {
243d50d1d7fStron   switch (tok) {
244d50d1d7fStron   case XML_TOK_PROLOG_S:
245d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
246d50d1d7fStron   case XML_TOK_OPEN_BRACKET:
247d50d1d7fStron     state->handler = internalSubset;
248d50d1d7fStron     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
249d50d1d7fStron   case XML_TOK_DECL_CLOSE:
250d50d1d7fStron     state->handler = prolog2;
251d50d1d7fStron     return XML_ROLE_DOCTYPE_CLOSE;
252d50d1d7fStron   case XML_TOK_NAME:
253d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
254d50d1d7fStron       state->handler = doctype3;
255d50d1d7fStron       return XML_ROLE_DOCTYPE_NONE;
256d50d1d7fStron     }
257d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
258d50d1d7fStron       state->handler = doctype2;
259d50d1d7fStron       return XML_ROLE_DOCTYPE_NONE;
260d50d1d7fStron     }
261d50d1d7fStron     break;
262d50d1d7fStron   }
263d50d1d7fStron   return common(state, tok);
264d50d1d7fStron }
265d50d1d7fStron 
266d50d1d7fStron static int PTRCALL
doctype2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2679fd04a41Smaya doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2689fd04a41Smaya          const ENCODING *enc) {
2699fd04a41Smaya   UNUSED_P(ptr);
2709fd04a41Smaya   UNUSED_P(end);
2719fd04a41Smaya   UNUSED_P(enc);
272d50d1d7fStron   switch (tok) {
273d50d1d7fStron   case XML_TOK_PROLOG_S:
274d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
275d50d1d7fStron   case XML_TOK_LITERAL:
276d50d1d7fStron     state->handler = doctype3;
277d50d1d7fStron     return XML_ROLE_DOCTYPE_PUBLIC_ID;
278d50d1d7fStron   }
279d50d1d7fStron   return common(state, tok);
280d50d1d7fStron }
281d50d1d7fStron 
282d50d1d7fStron static int PTRCALL
doctype3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2839fd04a41Smaya doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2849fd04a41Smaya          const ENCODING *enc) {
2859fd04a41Smaya   UNUSED_P(ptr);
2869fd04a41Smaya   UNUSED_P(end);
2879fd04a41Smaya   UNUSED_P(enc);
288d50d1d7fStron   switch (tok) {
289d50d1d7fStron   case XML_TOK_PROLOG_S:
290d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
291d50d1d7fStron   case XML_TOK_LITERAL:
292d50d1d7fStron     state->handler = doctype4;
293d50d1d7fStron     return XML_ROLE_DOCTYPE_SYSTEM_ID;
294d50d1d7fStron   }
295d50d1d7fStron   return common(state, tok);
296d50d1d7fStron }
297d50d1d7fStron 
298d50d1d7fStron static int PTRCALL
doctype4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2999fd04a41Smaya doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3009fd04a41Smaya          const ENCODING *enc) {
3019fd04a41Smaya   UNUSED_P(ptr);
3029fd04a41Smaya   UNUSED_P(end);
3039fd04a41Smaya   UNUSED_P(enc);
304d50d1d7fStron   switch (tok) {
305d50d1d7fStron   case XML_TOK_PROLOG_S:
306d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
307d50d1d7fStron   case XML_TOK_OPEN_BRACKET:
308d50d1d7fStron     state->handler = internalSubset;
309d50d1d7fStron     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
310d50d1d7fStron   case XML_TOK_DECL_CLOSE:
311d50d1d7fStron     state->handler = prolog2;
312d50d1d7fStron     return XML_ROLE_DOCTYPE_CLOSE;
313d50d1d7fStron   }
314d50d1d7fStron   return common(state, tok);
315d50d1d7fStron }
316d50d1d7fStron 
317d50d1d7fStron static int PTRCALL
doctype5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3189fd04a41Smaya doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3199fd04a41Smaya          const ENCODING *enc) {
3209fd04a41Smaya   UNUSED_P(ptr);
3219fd04a41Smaya   UNUSED_P(end);
3229fd04a41Smaya   UNUSED_P(enc);
323d50d1d7fStron   switch (tok) {
324d50d1d7fStron   case XML_TOK_PROLOG_S:
325d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
326d50d1d7fStron   case XML_TOK_DECL_CLOSE:
327d50d1d7fStron     state->handler = prolog2;
328d50d1d7fStron     return XML_ROLE_DOCTYPE_CLOSE;
329d50d1d7fStron   }
330d50d1d7fStron   return common(state, tok);
331d50d1d7fStron }
332d50d1d7fStron 
333d50d1d7fStron static int PTRCALL
internalSubset(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3349fd04a41Smaya internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3359fd04a41Smaya                const ENCODING *enc) {
336d50d1d7fStron   switch (tok) {
337d50d1d7fStron   case XML_TOK_PROLOG_S:
338d50d1d7fStron     return XML_ROLE_NONE;
339d50d1d7fStron   case XML_TOK_DECL_OPEN:
3409fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
341d50d1d7fStron                             KW_ENTITY)) {
342d50d1d7fStron       state->handler = entity0;
343d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
344d50d1d7fStron     }
3459fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
346d50d1d7fStron                             KW_ATTLIST)) {
347d50d1d7fStron       state->handler = attlist0;
348d50d1d7fStron       return XML_ROLE_ATTLIST_NONE;
349d50d1d7fStron     }
3509fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
351d50d1d7fStron                             KW_ELEMENT)) {
352d50d1d7fStron       state->handler = element0;
353d50d1d7fStron       return XML_ROLE_ELEMENT_NONE;
354d50d1d7fStron     }
3559fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
356d50d1d7fStron                             KW_NOTATION)) {
357d50d1d7fStron       state->handler = notation0;
358d50d1d7fStron       return XML_ROLE_NOTATION_NONE;
359d50d1d7fStron     }
360d50d1d7fStron     break;
361d50d1d7fStron   case XML_TOK_PI:
362d50d1d7fStron     return XML_ROLE_PI;
363d50d1d7fStron   case XML_TOK_COMMENT:
364d50d1d7fStron     return XML_ROLE_COMMENT;
365d50d1d7fStron   case XML_TOK_PARAM_ENTITY_REF:
366d50d1d7fStron     return XML_ROLE_PARAM_ENTITY_REF;
367d50d1d7fStron   case XML_TOK_CLOSE_BRACKET:
368d50d1d7fStron     state->handler = doctype5;
369d50d1d7fStron     return XML_ROLE_DOCTYPE_NONE;
370d50d1d7fStron   case XML_TOK_NONE:
371d50d1d7fStron     return XML_ROLE_NONE;
372d50d1d7fStron   }
373d50d1d7fStron   return common(state, tok);
374d50d1d7fStron }
375d50d1d7fStron 
376d50d1d7fStron #ifdef XML_DTD
377d50d1d7fStron 
378d50d1d7fStron static int PTRCALL
externalSubset0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3799fd04a41Smaya externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3809fd04a41Smaya                 const ENCODING *enc) {
381d50d1d7fStron   state->handler = externalSubset1;
382d50d1d7fStron   if (tok == XML_TOK_XML_DECL)
383d50d1d7fStron     return XML_ROLE_TEXT_DECL;
384d50d1d7fStron   return externalSubset1(state, tok, ptr, end, enc);
385d50d1d7fStron }
386d50d1d7fStron 
387d50d1d7fStron static int PTRCALL
externalSubset1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3889fd04a41Smaya externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3899fd04a41Smaya                 const ENCODING *enc) {
390d50d1d7fStron   switch (tok) {
391d50d1d7fStron   case XML_TOK_COND_SECT_OPEN:
392d50d1d7fStron     state->handler = condSect0;
393d50d1d7fStron     return XML_ROLE_NONE;
394d50d1d7fStron   case XML_TOK_COND_SECT_CLOSE:
395d50d1d7fStron     if (state->includeLevel == 0)
396d50d1d7fStron       break;
397d50d1d7fStron     state->includeLevel -= 1;
398d50d1d7fStron     return XML_ROLE_NONE;
399d50d1d7fStron   case XML_TOK_PROLOG_S:
400d50d1d7fStron     return XML_ROLE_NONE;
401d50d1d7fStron   case XML_TOK_CLOSE_BRACKET:
402d50d1d7fStron     break;
403d50d1d7fStron   case XML_TOK_NONE:
404d50d1d7fStron     if (state->includeLevel)
405d50d1d7fStron       break;
406d50d1d7fStron     return XML_ROLE_NONE;
407d50d1d7fStron   default:
408d50d1d7fStron     return internalSubset(state, tok, ptr, end, enc);
409d50d1d7fStron   }
410d50d1d7fStron   return common(state, tok);
411d50d1d7fStron }
412d50d1d7fStron 
413d50d1d7fStron #endif /* XML_DTD */
414d50d1d7fStron 
415d50d1d7fStron static int PTRCALL
entity0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4169fd04a41Smaya entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4179fd04a41Smaya         const ENCODING *enc) {
4189fd04a41Smaya   UNUSED_P(ptr);
4199fd04a41Smaya   UNUSED_P(end);
4209fd04a41Smaya   UNUSED_P(enc);
421d50d1d7fStron   switch (tok) {
422d50d1d7fStron   case XML_TOK_PROLOG_S:
423d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
424d50d1d7fStron   case XML_TOK_PERCENT:
425d50d1d7fStron     state->handler = entity1;
426d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
427d50d1d7fStron   case XML_TOK_NAME:
428d50d1d7fStron     state->handler = entity2;
429d50d1d7fStron     return XML_ROLE_GENERAL_ENTITY_NAME;
430d50d1d7fStron   }
431d50d1d7fStron   return common(state, tok);
432d50d1d7fStron }
433d50d1d7fStron 
434d50d1d7fStron static int PTRCALL
entity1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4359fd04a41Smaya entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4369fd04a41Smaya         const ENCODING *enc) {
4379fd04a41Smaya   UNUSED_P(ptr);
4389fd04a41Smaya   UNUSED_P(end);
4399fd04a41Smaya   UNUSED_P(enc);
440d50d1d7fStron   switch (tok) {
441d50d1d7fStron   case XML_TOK_PROLOG_S:
442d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
443d50d1d7fStron   case XML_TOK_NAME:
444d50d1d7fStron     state->handler = entity7;
445d50d1d7fStron     return XML_ROLE_PARAM_ENTITY_NAME;
446d50d1d7fStron   }
447d50d1d7fStron   return common(state, tok);
448d50d1d7fStron }
449d50d1d7fStron 
450d50d1d7fStron static int PTRCALL
entity2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4519fd04a41Smaya entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4529fd04a41Smaya         const ENCODING *enc) {
453d50d1d7fStron   switch (tok) {
454d50d1d7fStron   case XML_TOK_PROLOG_S:
455d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
456d50d1d7fStron   case XML_TOK_NAME:
457d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
458d50d1d7fStron       state->handler = entity4;
459d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
460d50d1d7fStron     }
461d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
462d50d1d7fStron       state->handler = entity3;
463d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
464d50d1d7fStron     }
465d50d1d7fStron     break;
466d50d1d7fStron   case XML_TOK_LITERAL:
467d50d1d7fStron     state->handler = declClose;
468d50d1d7fStron     state->role_none = XML_ROLE_ENTITY_NONE;
469d50d1d7fStron     return XML_ROLE_ENTITY_VALUE;
470d50d1d7fStron   }
471d50d1d7fStron   return common(state, tok);
472d50d1d7fStron }
473d50d1d7fStron 
474d50d1d7fStron static int PTRCALL
entity3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4759fd04a41Smaya entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4769fd04a41Smaya         const ENCODING *enc) {
4779fd04a41Smaya   UNUSED_P(ptr);
4789fd04a41Smaya   UNUSED_P(end);
4799fd04a41Smaya   UNUSED_P(enc);
480d50d1d7fStron   switch (tok) {
481d50d1d7fStron   case XML_TOK_PROLOG_S:
482d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
483d50d1d7fStron   case XML_TOK_LITERAL:
484d50d1d7fStron     state->handler = entity4;
485d50d1d7fStron     return XML_ROLE_ENTITY_PUBLIC_ID;
486d50d1d7fStron   }
487d50d1d7fStron   return common(state, tok);
488d50d1d7fStron }
489d50d1d7fStron 
490d50d1d7fStron static int PTRCALL
entity4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4919fd04a41Smaya entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4929fd04a41Smaya         const ENCODING *enc) {
4939fd04a41Smaya   UNUSED_P(ptr);
4949fd04a41Smaya   UNUSED_P(end);
4959fd04a41Smaya   UNUSED_P(enc);
496d50d1d7fStron   switch (tok) {
497d50d1d7fStron   case XML_TOK_PROLOG_S:
498d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
499d50d1d7fStron   case XML_TOK_LITERAL:
500d50d1d7fStron     state->handler = entity5;
501d50d1d7fStron     return XML_ROLE_ENTITY_SYSTEM_ID;
502d50d1d7fStron   }
503d50d1d7fStron   return common(state, tok);
504d50d1d7fStron }
505d50d1d7fStron 
506d50d1d7fStron static int PTRCALL
entity5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5079fd04a41Smaya entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5089fd04a41Smaya         const ENCODING *enc) {
509d50d1d7fStron   switch (tok) {
510d50d1d7fStron   case XML_TOK_PROLOG_S:
511d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
512d50d1d7fStron   case XML_TOK_DECL_CLOSE:
513d50d1d7fStron     setTopLevel(state);
514d50d1d7fStron     return XML_ROLE_ENTITY_COMPLETE;
515d50d1d7fStron   case XML_TOK_NAME:
516d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
517d50d1d7fStron       state->handler = entity6;
518d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
519d50d1d7fStron     }
520d50d1d7fStron     break;
521d50d1d7fStron   }
522d50d1d7fStron   return common(state, tok);
523d50d1d7fStron }
524d50d1d7fStron 
525d50d1d7fStron static int PTRCALL
entity6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5269fd04a41Smaya entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5279fd04a41Smaya         const ENCODING *enc) {
5289fd04a41Smaya   UNUSED_P(ptr);
5299fd04a41Smaya   UNUSED_P(end);
5309fd04a41Smaya   UNUSED_P(enc);
531d50d1d7fStron   switch (tok) {
532d50d1d7fStron   case XML_TOK_PROLOG_S:
533d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
534d50d1d7fStron   case XML_TOK_NAME:
535d50d1d7fStron     state->handler = declClose;
536d50d1d7fStron     state->role_none = XML_ROLE_ENTITY_NONE;
537d50d1d7fStron     return XML_ROLE_ENTITY_NOTATION_NAME;
538d50d1d7fStron   }
539d50d1d7fStron   return common(state, tok);
540d50d1d7fStron }
541d50d1d7fStron 
542d50d1d7fStron static int PTRCALL
entity7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5439fd04a41Smaya entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5449fd04a41Smaya         const ENCODING *enc) {
545d50d1d7fStron   switch (tok) {
546d50d1d7fStron   case XML_TOK_PROLOG_S:
547d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
548d50d1d7fStron   case XML_TOK_NAME:
549d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
550d50d1d7fStron       state->handler = entity9;
551d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
552d50d1d7fStron     }
553d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
554d50d1d7fStron       state->handler = entity8;
555d50d1d7fStron       return XML_ROLE_ENTITY_NONE;
556d50d1d7fStron     }
557d50d1d7fStron     break;
558d50d1d7fStron   case XML_TOK_LITERAL:
559d50d1d7fStron     state->handler = declClose;
560d50d1d7fStron     state->role_none = XML_ROLE_ENTITY_NONE;
561d50d1d7fStron     return XML_ROLE_ENTITY_VALUE;
562d50d1d7fStron   }
563d50d1d7fStron   return common(state, tok);
564d50d1d7fStron }
565d50d1d7fStron 
566d50d1d7fStron static int PTRCALL
entity8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5679fd04a41Smaya entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5689fd04a41Smaya         const ENCODING *enc) {
5699fd04a41Smaya   UNUSED_P(ptr);
5709fd04a41Smaya   UNUSED_P(end);
5719fd04a41Smaya   UNUSED_P(enc);
572d50d1d7fStron   switch (tok) {
573d50d1d7fStron   case XML_TOK_PROLOG_S:
574d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
575d50d1d7fStron   case XML_TOK_LITERAL:
576d50d1d7fStron     state->handler = entity9;
577d50d1d7fStron     return XML_ROLE_ENTITY_PUBLIC_ID;
578d50d1d7fStron   }
579d50d1d7fStron   return common(state, tok);
580d50d1d7fStron }
581d50d1d7fStron 
582d50d1d7fStron static int PTRCALL
entity9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5839fd04a41Smaya entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5849fd04a41Smaya         const ENCODING *enc) {
5859fd04a41Smaya   UNUSED_P(ptr);
5869fd04a41Smaya   UNUSED_P(end);
5879fd04a41Smaya   UNUSED_P(enc);
588d50d1d7fStron   switch (tok) {
589d50d1d7fStron   case XML_TOK_PROLOG_S:
590d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
591d50d1d7fStron   case XML_TOK_LITERAL:
592d50d1d7fStron     state->handler = entity10;
593d50d1d7fStron     return XML_ROLE_ENTITY_SYSTEM_ID;
594d50d1d7fStron   }
595d50d1d7fStron   return common(state, tok);
596d50d1d7fStron }
597d50d1d7fStron 
598d50d1d7fStron static int PTRCALL
entity10(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5999fd04a41Smaya entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6009fd04a41Smaya          const ENCODING *enc) {
6019fd04a41Smaya   UNUSED_P(ptr);
6029fd04a41Smaya   UNUSED_P(end);
6039fd04a41Smaya   UNUSED_P(enc);
604d50d1d7fStron   switch (tok) {
605d50d1d7fStron   case XML_TOK_PROLOG_S:
606d50d1d7fStron     return XML_ROLE_ENTITY_NONE;
607d50d1d7fStron   case XML_TOK_DECL_CLOSE:
608d50d1d7fStron     setTopLevel(state);
609d50d1d7fStron     return XML_ROLE_ENTITY_COMPLETE;
610d50d1d7fStron   }
611d50d1d7fStron   return common(state, tok);
612d50d1d7fStron }
613d50d1d7fStron 
614d50d1d7fStron static int PTRCALL
notation0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6159fd04a41Smaya notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6169fd04a41Smaya           const ENCODING *enc) {
6179fd04a41Smaya   UNUSED_P(ptr);
6189fd04a41Smaya   UNUSED_P(end);
6199fd04a41Smaya   UNUSED_P(enc);
620d50d1d7fStron   switch (tok) {
621d50d1d7fStron   case XML_TOK_PROLOG_S:
622d50d1d7fStron     return XML_ROLE_NOTATION_NONE;
623d50d1d7fStron   case XML_TOK_NAME:
624d50d1d7fStron     state->handler = notation1;
625d50d1d7fStron     return XML_ROLE_NOTATION_NAME;
626d50d1d7fStron   }
627d50d1d7fStron   return common(state, tok);
628d50d1d7fStron }
629d50d1d7fStron 
630d50d1d7fStron static int PTRCALL
notation1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6319fd04a41Smaya notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6329fd04a41Smaya           const ENCODING *enc) {
633d50d1d7fStron   switch (tok) {
634d50d1d7fStron   case XML_TOK_PROLOG_S:
635d50d1d7fStron     return XML_ROLE_NOTATION_NONE;
636d50d1d7fStron   case XML_TOK_NAME:
637d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
638d50d1d7fStron       state->handler = notation3;
639d50d1d7fStron       return XML_ROLE_NOTATION_NONE;
640d50d1d7fStron     }
641d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
642d50d1d7fStron       state->handler = notation2;
643d50d1d7fStron       return XML_ROLE_NOTATION_NONE;
644d50d1d7fStron     }
645d50d1d7fStron     break;
646d50d1d7fStron   }
647d50d1d7fStron   return common(state, tok);
648d50d1d7fStron }
649d50d1d7fStron 
650d50d1d7fStron static int PTRCALL
notation2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6519fd04a41Smaya notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6529fd04a41Smaya           const ENCODING *enc) {
6539fd04a41Smaya   UNUSED_P(ptr);
6549fd04a41Smaya   UNUSED_P(end);
6559fd04a41Smaya   UNUSED_P(enc);
656d50d1d7fStron   switch (tok) {
657d50d1d7fStron   case XML_TOK_PROLOG_S:
658d50d1d7fStron     return XML_ROLE_NOTATION_NONE;
659d50d1d7fStron   case XML_TOK_LITERAL:
660d50d1d7fStron     state->handler = notation4;
661d50d1d7fStron     return XML_ROLE_NOTATION_PUBLIC_ID;
662d50d1d7fStron   }
663d50d1d7fStron   return common(state, tok);
664d50d1d7fStron }
665d50d1d7fStron 
666d50d1d7fStron static int PTRCALL
notation3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6679fd04a41Smaya notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6689fd04a41Smaya           const ENCODING *enc) {
6699fd04a41Smaya   UNUSED_P(ptr);
6709fd04a41Smaya   UNUSED_P(end);
6719fd04a41Smaya   UNUSED_P(enc);
672d50d1d7fStron   switch (tok) {
673d50d1d7fStron   case XML_TOK_PROLOG_S:
674d50d1d7fStron     return XML_ROLE_NOTATION_NONE;
675d50d1d7fStron   case XML_TOK_LITERAL:
676d50d1d7fStron     state->handler = declClose;
677d50d1d7fStron     state->role_none = XML_ROLE_NOTATION_NONE;
678d50d1d7fStron     return XML_ROLE_NOTATION_SYSTEM_ID;
679d50d1d7fStron   }
680d50d1d7fStron   return common(state, tok);
681d50d1d7fStron }
682d50d1d7fStron 
683d50d1d7fStron static int PTRCALL
notation4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6849fd04a41Smaya notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6859fd04a41Smaya           const ENCODING *enc) {
6869fd04a41Smaya   UNUSED_P(ptr);
6879fd04a41Smaya   UNUSED_P(end);
6889fd04a41Smaya   UNUSED_P(enc);
689d50d1d7fStron   switch (tok) {
690d50d1d7fStron   case XML_TOK_PROLOG_S:
691d50d1d7fStron     return XML_ROLE_NOTATION_NONE;
692d50d1d7fStron   case XML_TOK_LITERAL:
693d50d1d7fStron     state->handler = declClose;
694d50d1d7fStron     state->role_none = XML_ROLE_NOTATION_NONE;
695d50d1d7fStron     return XML_ROLE_NOTATION_SYSTEM_ID;
696d50d1d7fStron   case XML_TOK_DECL_CLOSE:
697d50d1d7fStron     setTopLevel(state);
698d50d1d7fStron     return XML_ROLE_NOTATION_NO_SYSTEM_ID;
699d50d1d7fStron   }
700d50d1d7fStron   return common(state, tok);
701d50d1d7fStron }
702d50d1d7fStron 
703d50d1d7fStron static int PTRCALL
attlist0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7049fd04a41Smaya attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7059fd04a41Smaya          const ENCODING *enc) {
7069fd04a41Smaya   UNUSED_P(ptr);
7079fd04a41Smaya   UNUSED_P(end);
7089fd04a41Smaya   UNUSED_P(enc);
709d50d1d7fStron   switch (tok) {
710d50d1d7fStron   case XML_TOK_PROLOG_S:
711d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
712d50d1d7fStron   case XML_TOK_NAME:
713d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
714d50d1d7fStron     state->handler = attlist1;
715d50d1d7fStron     return XML_ROLE_ATTLIST_ELEMENT_NAME;
716d50d1d7fStron   }
717d50d1d7fStron   return common(state, tok);
718d50d1d7fStron }
719d50d1d7fStron 
720d50d1d7fStron static int PTRCALL
attlist1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7219fd04a41Smaya attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7229fd04a41Smaya          const ENCODING *enc) {
7239fd04a41Smaya   UNUSED_P(ptr);
7249fd04a41Smaya   UNUSED_P(end);
7259fd04a41Smaya   UNUSED_P(enc);
726d50d1d7fStron   switch (tok) {
727d50d1d7fStron   case XML_TOK_PROLOG_S:
728d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
729d50d1d7fStron   case XML_TOK_DECL_CLOSE:
730d50d1d7fStron     setTopLevel(state);
731d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
732d50d1d7fStron   case XML_TOK_NAME:
733d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
734d50d1d7fStron     state->handler = attlist2;
735d50d1d7fStron     return XML_ROLE_ATTRIBUTE_NAME;
736d50d1d7fStron   }
737d50d1d7fStron   return common(state, tok);
738d50d1d7fStron }
739d50d1d7fStron 
740d50d1d7fStron static int PTRCALL
attlist2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7419fd04a41Smaya attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7429fd04a41Smaya          const ENCODING *enc) {
743d50d1d7fStron   switch (tok) {
744d50d1d7fStron   case XML_TOK_PROLOG_S:
745d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
7469fd04a41Smaya   case XML_TOK_NAME: {
747d50d1d7fStron     static const char *const types[] = {
7489fd04a41Smaya         KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
7499fd04a41Smaya         KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
750d50d1d7fStron     };
751d50d1d7fStron     int i;
752d50d1d7fStron     for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
753d50d1d7fStron       if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
754d50d1d7fStron         state->handler = attlist8;
755d50d1d7fStron         return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
756d50d1d7fStron       }
757d50d1d7fStron   }
758d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
759d50d1d7fStron       state->handler = attlist5;
760d50d1d7fStron       return XML_ROLE_ATTLIST_NONE;
761d50d1d7fStron     }
762d50d1d7fStron     break;
763d50d1d7fStron   case XML_TOK_OPEN_PAREN:
764d50d1d7fStron     state->handler = attlist3;
765d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
766d50d1d7fStron   }
767d50d1d7fStron   return common(state, tok);
768d50d1d7fStron }
769d50d1d7fStron 
770d50d1d7fStron static int PTRCALL
attlist3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7719fd04a41Smaya attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7729fd04a41Smaya          const ENCODING *enc) {
7739fd04a41Smaya   UNUSED_P(ptr);
7749fd04a41Smaya   UNUSED_P(end);
7759fd04a41Smaya   UNUSED_P(enc);
776d50d1d7fStron   switch (tok) {
777d50d1d7fStron   case XML_TOK_PROLOG_S:
778d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
779d50d1d7fStron   case XML_TOK_NMTOKEN:
780d50d1d7fStron   case XML_TOK_NAME:
781d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
782d50d1d7fStron     state->handler = attlist4;
783d50d1d7fStron     return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
784d50d1d7fStron   }
785d50d1d7fStron   return common(state, tok);
786d50d1d7fStron }
787d50d1d7fStron 
788d50d1d7fStron static int PTRCALL
attlist4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7899fd04a41Smaya attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7909fd04a41Smaya          const ENCODING *enc) {
7919fd04a41Smaya   UNUSED_P(ptr);
7929fd04a41Smaya   UNUSED_P(end);
7939fd04a41Smaya   UNUSED_P(enc);
794d50d1d7fStron   switch (tok) {
795d50d1d7fStron   case XML_TOK_PROLOG_S:
796d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
797d50d1d7fStron   case XML_TOK_CLOSE_PAREN:
798d50d1d7fStron     state->handler = attlist8;
799d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
800d50d1d7fStron   case XML_TOK_OR:
801d50d1d7fStron     state->handler = attlist3;
802d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
803d50d1d7fStron   }
804d50d1d7fStron   return common(state, tok);
805d50d1d7fStron }
806d50d1d7fStron 
807d50d1d7fStron static int PTRCALL
attlist5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8089fd04a41Smaya attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8099fd04a41Smaya          const ENCODING *enc) {
8109fd04a41Smaya   UNUSED_P(ptr);
8119fd04a41Smaya   UNUSED_P(end);
8129fd04a41Smaya   UNUSED_P(enc);
813d50d1d7fStron   switch (tok) {
814d50d1d7fStron   case XML_TOK_PROLOG_S:
815d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
816d50d1d7fStron   case XML_TOK_OPEN_PAREN:
817d50d1d7fStron     state->handler = attlist6;
818d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
819d50d1d7fStron   }
820d50d1d7fStron   return common(state, tok);
821d50d1d7fStron }
822d50d1d7fStron 
823d50d1d7fStron static int PTRCALL
attlist6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8249fd04a41Smaya attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8259fd04a41Smaya          const ENCODING *enc) {
8269fd04a41Smaya   UNUSED_P(ptr);
8279fd04a41Smaya   UNUSED_P(end);
8289fd04a41Smaya   UNUSED_P(enc);
829d50d1d7fStron   switch (tok) {
830d50d1d7fStron   case XML_TOK_PROLOG_S:
831d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
832d50d1d7fStron   case XML_TOK_NAME:
833d50d1d7fStron     state->handler = attlist7;
834d50d1d7fStron     return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
835d50d1d7fStron   }
836d50d1d7fStron   return common(state, tok);
837d50d1d7fStron }
838d50d1d7fStron 
839d50d1d7fStron static int PTRCALL
attlist7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8409fd04a41Smaya attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8419fd04a41Smaya          const ENCODING *enc) {
8429fd04a41Smaya   UNUSED_P(ptr);
8439fd04a41Smaya   UNUSED_P(end);
8449fd04a41Smaya   UNUSED_P(enc);
845d50d1d7fStron   switch (tok) {
846d50d1d7fStron   case XML_TOK_PROLOG_S:
847d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
848d50d1d7fStron   case XML_TOK_CLOSE_PAREN:
849d50d1d7fStron     state->handler = attlist8;
850d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
851d50d1d7fStron   case XML_TOK_OR:
852d50d1d7fStron     state->handler = attlist6;
853d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
854d50d1d7fStron   }
855d50d1d7fStron   return common(state, tok);
856d50d1d7fStron }
857d50d1d7fStron 
858d50d1d7fStron /* default value */
859d50d1d7fStron static int PTRCALL
attlist8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8609fd04a41Smaya attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8619fd04a41Smaya          const ENCODING *enc) {
862d50d1d7fStron   switch (tok) {
863d50d1d7fStron   case XML_TOK_PROLOG_S:
864d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
865d50d1d7fStron   case XML_TOK_POUND_NAME:
8669fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
867d50d1d7fStron                             KW_IMPLIED)) {
868d50d1d7fStron       state->handler = attlist1;
869d50d1d7fStron       return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
870d50d1d7fStron     }
8719fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
872d50d1d7fStron                             KW_REQUIRED)) {
873d50d1d7fStron       state->handler = attlist1;
874d50d1d7fStron       return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
875d50d1d7fStron     }
8769fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
877d50d1d7fStron                             KW_FIXED)) {
878d50d1d7fStron       state->handler = attlist9;
879d50d1d7fStron       return XML_ROLE_ATTLIST_NONE;
880d50d1d7fStron     }
881d50d1d7fStron     break;
882d50d1d7fStron   case XML_TOK_LITERAL:
883d50d1d7fStron     state->handler = attlist1;
884d50d1d7fStron     return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
885d50d1d7fStron   }
886d50d1d7fStron   return common(state, tok);
887d50d1d7fStron }
888d50d1d7fStron 
889d50d1d7fStron static int PTRCALL
attlist9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8909fd04a41Smaya attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8919fd04a41Smaya          const ENCODING *enc) {
8929fd04a41Smaya   UNUSED_P(ptr);
8939fd04a41Smaya   UNUSED_P(end);
8949fd04a41Smaya   UNUSED_P(enc);
895d50d1d7fStron   switch (tok) {
896d50d1d7fStron   case XML_TOK_PROLOG_S:
897d50d1d7fStron     return XML_ROLE_ATTLIST_NONE;
898d50d1d7fStron   case XML_TOK_LITERAL:
899d50d1d7fStron     state->handler = attlist1;
900d50d1d7fStron     return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
901d50d1d7fStron   }
902d50d1d7fStron   return common(state, tok);
903d50d1d7fStron }
904d50d1d7fStron 
905d50d1d7fStron static int PTRCALL
element0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9069fd04a41Smaya element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9079fd04a41Smaya          const ENCODING *enc) {
9089fd04a41Smaya   UNUSED_P(ptr);
9099fd04a41Smaya   UNUSED_P(end);
9109fd04a41Smaya   UNUSED_P(enc);
911d50d1d7fStron   switch (tok) {
912d50d1d7fStron   case XML_TOK_PROLOG_S:
913d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
914d50d1d7fStron   case XML_TOK_NAME:
915d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
916d50d1d7fStron     state->handler = element1;
917d50d1d7fStron     return XML_ROLE_ELEMENT_NAME;
918d50d1d7fStron   }
919d50d1d7fStron   return common(state, tok);
920d50d1d7fStron }
921d50d1d7fStron 
922d50d1d7fStron static int PTRCALL
element1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9239fd04a41Smaya element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9249fd04a41Smaya          const ENCODING *enc) {
925d50d1d7fStron   switch (tok) {
926d50d1d7fStron   case XML_TOK_PROLOG_S:
927d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
928d50d1d7fStron   case XML_TOK_NAME:
929d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
930d50d1d7fStron       state->handler = declClose;
931d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
932d50d1d7fStron       return XML_ROLE_CONTENT_EMPTY;
933d50d1d7fStron     }
934d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
935d50d1d7fStron       state->handler = declClose;
936d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
937d50d1d7fStron       return XML_ROLE_CONTENT_ANY;
938d50d1d7fStron     }
939d50d1d7fStron     break;
940d50d1d7fStron   case XML_TOK_OPEN_PAREN:
941d50d1d7fStron     state->handler = element2;
942d50d1d7fStron     state->level = 1;
943d50d1d7fStron     return XML_ROLE_GROUP_OPEN;
944d50d1d7fStron   }
945d50d1d7fStron   return common(state, tok);
946d50d1d7fStron }
947d50d1d7fStron 
948d50d1d7fStron static int PTRCALL
element2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9499fd04a41Smaya element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9509fd04a41Smaya          const ENCODING *enc) {
951d50d1d7fStron   switch (tok) {
952d50d1d7fStron   case XML_TOK_PROLOG_S:
953d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
954d50d1d7fStron   case XML_TOK_POUND_NAME:
9559fd04a41Smaya     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
956d50d1d7fStron                             KW_PCDATA)) {
957d50d1d7fStron       state->handler = element3;
958d50d1d7fStron       return XML_ROLE_CONTENT_PCDATA;
959d50d1d7fStron     }
960d50d1d7fStron     break;
961d50d1d7fStron   case XML_TOK_OPEN_PAREN:
962d50d1d7fStron     state->level = 2;
963d50d1d7fStron     state->handler = element6;
964d50d1d7fStron     return XML_ROLE_GROUP_OPEN;
965d50d1d7fStron   case XML_TOK_NAME:
966d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
967d50d1d7fStron     state->handler = element7;
968d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT;
969d50d1d7fStron   case XML_TOK_NAME_QUESTION:
970d50d1d7fStron     state->handler = element7;
971d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_OPT;
972d50d1d7fStron   case XML_TOK_NAME_ASTERISK:
973d50d1d7fStron     state->handler = element7;
974d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_REP;
975d50d1d7fStron   case XML_TOK_NAME_PLUS:
976d50d1d7fStron     state->handler = element7;
977d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_PLUS;
978d50d1d7fStron   }
979d50d1d7fStron   return common(state, tok);
980d50d1d7fStron }
981d50d1d7fStron 
982d50d1d7fStron static int PTRCALL
element3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9839fd04a41Smaya element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9849fd04a41Smaya          const ENCODING *enc) {
9859fd04a41Smaya   UNUSED_P(ptr);
9869fd04a41Smaya   UNUSED_P(end);
9879fd04a41Smaya   UNUSED_P(enc);
988d50d1d7fStron   switch (tok) {
989d50d1d7fStron   case XML_TOK_PROLOG_S:
990d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
991d50d1d7fStron   case XML_TOK_CLOSE_PAREN:
992d50d1d7fStron     state->handler = declClose;
993d50d1d7fStron     state->role_none = XML_ROLE_ELEMENT_NONE;
994d50d1d7fStron     return XML_ROLE_GROUP_CLOSE;
995d50d1d7fStron   case XML_TOK_CLOSE_PAREN_ASTERISK:
996d50d1d7fStron     state->handler = declClose;
997d50d1d7fStron     state->role_none = XML_ROLE_ELEMENT_NONE;
998d50d1d7fStron     return XML_ROLE_GROUP_CLOSE_REP;
999d50d1d7fStron   case XML_TOK_OR:
1000d50d1d7fStron     state->handler = element4;
1001d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1002d50d1d7fStron   }
1003d50d1d7fStron   return common(state, tok);
1004d50d1d7fStron }
1005d50d1d7fStron 
1006d50d1d7fStron static int PTRCALL
element4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10079fd04a41Smaya element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10089fd04a41Smaya          const ENCODING *enc) {
10099fd04a41Smaya   UNUSED_P(ptr);
10109fd04a41Smaya   UNUSED_P(end);
10119fd04a41Smaya   UNUSED_P(enc);
1012d50d1d7fStron   switch (tok) {
1013d50d1d7fStron   case XML_TOK_PROLOG_S:
1014d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1015d50d1d7fStron   case XML_TOK_NAME:
1016d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
1017d50d1d7fStron     state->handler = element5;
1018d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT;
1019d50d1d7fStron   }
1020d50d1d7fStron   return common(state, tok);
1021d50d1d7fStron }
1022d50d1d7fStron 
1023d50d1d7fStron static int PTRCALL
element5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10249fd04a41Smaya element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10259fd04a41Smaya          const ENCODING *enc) {
10269fd04a41Smaya   UNUSED_P(ptr);
10279fd04a41Smaya   UNUSED_P(end);
10289fd04a41Smaya   UNUSED_P(enc);
1029d50d1d7fStron   switch (tok) {
1030d50d1d7fStron   case XML_TOK_PROLOG_S:
1031d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1032d50d1d7fStron   case XML_TOK_CLOSE_PAREN_ASTERISK:
1033d50d1d7fStron     state->handler = declClose;
1034d50d1d7fStron     state->role_none = XML_ROLE_ELEMENT_NONE;
1035d50d1d7fStron     return XML_ROLE_GROUP_CLOSE_REP;
1036d50d1d7fStron   case XML_TOK_OR:
1037d50d1d7fStron     state->handler = element4;
1038d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1039d50d1d7fStron   }
1040d50d1d7fStron   return common(state, tok);
1041d50d1d7fStron }
1042d50d1d7fStron 
1043d50d1d7fStron static int PTRCALL
element6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10449fd04a41Smaya element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10459fd04a41Smaya          const ENCODING *enc) {
10469fd04a41Smaya   UNUSED_P(ptr);
10479fd04a41Smaya   UNUSED_P(end);
10489fd04a41Smaya   UNUSED_P(enc);
1049d50d1d7fStron   switch (tok) {
1050d50d1d7fStron   case XML_TOK_PROLOG_S:
1051d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1052d50d1d7fStron   case XML_TOK_OPEN_PAREN:
1053d50d1d7fStron     state->level += 1;
1054d50d1d7fStron     return XML_ROLE_GROUP_OPEN;
1055d50d1d7fStron   case XML_TOK_NAME:
1056d50d1d7fStron   case XML_TOK_PREFIXED_NAME:
1057d50d1d7fStron     state->handler = element7;
1058d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT;
1059d50d1d7fStron   case XML_TOK_NAME_QUESTION:
1060d50d1d7fStron     state->handler = element7;
1061d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_OPT;
1062d50d1d7fStron   case XML_TOK_NAME_ASTERISK:
1063d50d1d7fStron     state->handler = element7;
1064d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_REP;
1065d50d1d7fStron   case XML_TOK_NAME_PLUS:
1066d50d1d7fStron     state->handler = element7;
1067d50d1d7fStron     return XML_ROLE_CONTENT_ELEMENT_PLUS;
1068d50d1d7fStron   }
1069d50d1d7fStron   return common(state, tok);
1070d50d1d7fStron }
1071d50d1d7fStron 
1072d50d1d7fStron static int PTRCALL
element7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10739fd04a41Smaya element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10749fd04a41Smaya          const ENCODING *enc) {
10759fd04a41Smaya   UNUSED_P(ptr);
10769fd04a41Smaya   UNUSED_P(end);
10779fd04a41Smaya   UNUSED_P(enc);
1078d50d1d7fStron   switch (tok) {
1079d50d1d7fStron   case XML_TOK_PROLOG_S:
1080d50d1d7fStron     return XML_ROLE_ELEMENT_NONE;
1081d50d1d7fStron   case XML_TOK_CLOSE_PAREN:
1082d50d1d7fStron     state->level -= 1;
1083d50d1d7fStron     if (state->level == 0) {
1084d50d1d7fStron       state->handler = declClose;
1085d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
1086d50d1d7fStron     }
1087d50d1d7fStron     return XML_ROLE_GROUP_CLOSE;
1088d50d1d7fStron   case XML_TOK_CLOSE_PAREN_ASTERISK:
1089d50d1d7fStron     state->level -= 1;
1090d50d1d7fStron     if (state->level == 0) {
1091d50d1d7fStron       state->handler = declClose;
1092d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
1093d50d1d7fStron     }
1094d50d1d7fStron     return XML_ROLE_GROUP_CLOSE_REP;
1095d50d1d7fStron   case XML_TOK_CLOSE_PAREN_QUESTION:
1096d50d1d7fStron     state->level -= 1;
1097d50d1d7fStron     if (state->level == 0) {
1098d50d1d7fStron       state->handler = declClose;
1099d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
1100d50d1d7fStron     }
1101d50d1d7fStron     return XML_ROLE_GROUP_CLOSE_OPT;
1102d50d1d7fStron   case XML_TOK_CLOSE_PAREN_PLUS:
1103d50d1d7fStron     state->level -= 1;
1104d50d1d7fStron     if (state->level == 0) {
1105d50d1d7fStron       state->handler = declClose;
1106d50d1d7fStron       state->role_none = XML_ROLE_ELEMENT_NONE;
1107d50d1d7fStron     }
1108d50d1d7fStron     return XML_ROLE_GROUP_CLOSE_PLUS;
1109d50d1d7fStron   case XML_TOK_COMMA:
1110d50d1d7fStron     state->handler = element6;
1111d50d1d7fStron     return XML_ROLE_GROUP_SEQUENCE;
1112d50d1d7fStron   case XML_TOK_OR:
1113d50d1d7fStron     state->handler = element6;
1114d50d1d7fStron     return XML_ROLE_GROUP_CHOICE;
1115d50d1d7fStron   }
1116d50d1d7fStron   return common(state, tok);
1117d50d1d7fStron }
1118d50d1d7fStron 
1119d50d1d7fStron #ifdef XML_DTD
1120d50d1d7fStron 
1121d50d1d7fStron static int PTRCALL
condSect0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11229fd04a41Smaya condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11239fd04a41Smaya           const ENCODING *enc) {
1124d50d1d7fStron   switch (tok) {
1125d50d1d7fStron   case XML_TOK_PROLOG_S:
1126d50d1d7fStron     return XML_ROLE_NONE;
1127d50d1d7fStron   case XML_TOK_NAME:
1128d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
1129d50d1d7fStron       state->handler = condSect1;
1130d50d1d7fStron       return XML_ROLE_NONE;
1131d50d1d7fStron     }
1132d50d1d7fStron     if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
1133d50d1d7fStron       state->handler = condSect2;
1134d50d1d7fStron       return XML_ROLE_NONE;
1135d50d1d7fStron     }
1136d50d1d7fStron     break;
1137d50d1d7fStron   }
1138d50d1d7fStron   return common(state, tok);
1139d50d1d7fStron }
1140d50d1d7fStron 
1141d50d1d7fStron static int PTRCALL
condSect1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11429fd04a41Smaya condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11439fd04a41Smaya           const ENCODING *enc) {
11449fd04a41Smaya   UNUSED_P(ptr);
11459fd04a41Smaya   UNUSED_P(end);
11469fd04a41Smaya   UNUSED_P(enc);
1147d50d1d7fStron   switch (tok) {
1148d50d1d7fStron   case XML_TOK_PROLOG_S:
1149d50d1d7fStron     return XML_ROLE_NONE;
1150d50d1d7fStron   case XML_TOK_OPEN_BRACKET:
1151d50d1d7fStron     state->handler = externalSubset1;
1152d50d1d7fStron     state->includeLevel += 1;
1153d50d1d7fStron     return XML_ROLE_NONE;
1154d50d1d7fStron   }
1155d50d1d7fStron   return common(state, tok);
1156d50d1d7fStron }
1157d50d1d7fStron 
1158d50d1d7fStron static int PTRCALL
condSect2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11599fd04a41Smaya condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11609fd04a41Smaya           const ENCODING *enc) {
11619fd04a41Smaya   UNUSED_P(ptr);
11629fd04a41Smaya   UNUSED_P(end);
11639fd04a41Smaya   UNUSED_P(enc);
1164d50d1d7fStron   switch (tok) {
1165d50d1d7fStron   case XML_TOK_PROLOG_S:
1166d50d1d7fStron     return XML_ROLE_NONE;
1167d50d1d7fStron   case XML_TOK_OPEN_BRACKET:
1168d50d1d7fStron     state->handler = externalSubset1;
1169d50d1d7fStron     return XML_ROLE_IGNORE_SECT;
1170d50d1d7fStron   }
1171d50d1d7fStron   return common(state, tok);
1172d50d1d7fStron }
1173d50d1d7fStron 
1174d50d1d7fStron #endif /* XML_DTD */
1175d50d1d7fStron 
1176d50d1d7fStron static int PTRCALL
declClose(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11779fd04a41Smaya declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11789fd04a41Smaya           const ENCODING *enc) {
11799fd04a41Smaya   UNUSED_P(ptr);
11809fd04a41Smaya   UNUSED_P(end);
11819fd04a41Smaya   UNUSED_P(enc);
1182d50d1d7fStron   switch (tok) {
1183d50d1d7fStron   case XML_TOK_PROLOG_S:
1184d50d1d7fStron     return state->role_none;
1185d50d1d7fStron   case XML_TOK_DECL_CLOSE:
1186d50d1d7fStron     setTopLevel(state);
1187d50d1d7fStron     return state->role_none;
1188d50d1d7fStron   }
1189d50d1d7fStron   return common(state, tok);
1190d50d1d7fStron }
1191d50d1d7fStron 
11929fd04a41Smaya /* This function will only be invoked if the internal logic of the
11939fd04a41Smaya  * parser has broken down.  It is used in two cases:
11949fd04a41Smaya  *
11959fd04a41Smaya  * 1: When the XML prolog has been finished.  At this point the
11969fd04a41Smaya  * processor (the parser level above these role handlers) should
11979fd04a41Smaya  * switch from prologProcessor to contentProcessor and reinitialise
11989fd04a41Smaya  * the handler function.
11999fd04a41Smaya  *
12009fd04a41Smaya  * 2: When an error has been detected (via common() below).  At this
12019fd04a41Smaya  * point again the processor should be switched to errorProcessor,
12029fd04a41Smaya  * which will never call a handler.
12039fd04a41Smaya  *
12049fd04a41Smaya  * The result of this is that error() can only be called if the
12059fd04a41Smaya  * processor switch failed to happen, which is an internal error and
12069fd04a41Smaya  * therefore we shouldn't be able to provoke it simply by using the
12079fd04a41Smaya  * library.  It is a necessary backstop, however, so we merely exclude
12089fd04a41Smaya  * it from the coverage statistics.
12099fd04a41Smaya  *
12109fd04a41Smaya  * LCOV_EXCL_START
12119fd04a41Smaya  */
1212d50d1d7fStron static int PTRCALL
error(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)12139fd04a41Smaya error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
12149fd04a41Smaya       const ENCODING *enc) {
12159fd04a41Smaya   UNUSED_P(state);
12169fd04a41Smaya   UNUSED_P(tok);
12179fd04a41Smaya   UNUSED_P(ptr);
12189fd04a41Smaya   UNUSED_P(end);
12199fd04a41Smaya   UNUSED_P(enc);
1220d50d1d7fStron   return XML_ROLE_NONE;
1221d50d1d7fStron }
12229fd04a41Smaya /* LCOV_EXCL_STOP */
1223d50d1d7fStron 
1224d50d1d7fStron static int FASTCALL
common(PROLOG_STATE * state,int tok)12259fd04a41Smaya common(PROLOG_STATE *state, int tok) {
1226d50d1d7fStron #ifdef XML_DTD
1227d50d1d7fStron   if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
1228d50d1d7fStron     return XML_ROLE_INNER_PARAM_ENTITY_REF;
1229*0315d311Schristos #else
1230*0315d311Schristos   UNUSED_P(tok);
1231d50d1d7fStron #endif
1232d50d1d7fStron   state->handler = error;
1233d50d1d7fStron   return XML_ROLE_ERROR;
1234d50d1d7fStron }
1235d50d1d7fStron 
1236d50d1d7fStron void
XmlPrologStateInit(PROLOG_STATE * state)12379fd04a41Smaya XmlPrologStateInit(PROLOG_STATE *state) {
1238d50d1d7fStron   state->handler = prolog0;
1239d50d1d7fStron #ifdef XML_DTD
1240d50d1d7fStron   state->documentEntity = 1;
1241d50d1d7fStron   state->includeLevel = 0;
1242d50d1d7fStron   state->inEntityValue = 0;
1243d50d1d7fStron #endif /* XML_DTD */
1244d50d1d7fStron }
1245d50d1d7fStron 
1246d50d1d7fStron #ifdef XML_DTD
1247d50d1d7fStron 
1248d50d1d7fStron void
XmlPrologStateInitExternalEntity(PROLOG_STATE * state)12499fd04a41Smaya XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
1250d50d1d7fStron   state->handler = externalSubset0;
1251d50d1d7fStron   state->documentEntity = 0;
1252d50d1d7fStron   state->includeLevel = 0;
1253d50d1d7fStron }
1254d50d1d7fStron 
1255d50d1d7fStron #endif /* XML_DTD */
1256