xref: /openbsd/lib/libexpat/lib/xmlrole.c (revision bd8f1dc3)
12e724bc9Sbluhm /*
22e724bc9Sbluhm                             __  __            _
32e724bc9Sbluhm                          ___\ \/ /_ __   __ _| |_
42e724bc9Sbluhm                         / _ \\  /| '_ \ / _` | __|
52e724bc9Sbluhm                        |  __//  \| |_) | (_| | |_
62e724bc9Sbluhm                         \___/_/\_\ .__/ \__,_|\__|
72e724bc9Sbluhm                                  |_| XML parser
82e724bc9Sbluhm 
92e724bc9Sbluhm    Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
1008819b41Sbluhm    Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
1108819b41Sbluhm    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
1208819b41Sbluhm    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
1308819b41Sbluhm    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14253fd6bfSbluhm    Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15*bd8f1dc3Sbluhm    Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
1608819b41Sbluhm    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
1708819b41Sbluhm    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18*bd8f1dc3Sbluhm    Copyright (c) 2021      Donghee Na <donghee.na@python.org>
192e724bc9Sbluhm    Licensed under the MIT license:
202e724bc9Sbluhm 
212e724bc9Sbluhm    Permission is  hereby granted,  free of charge,  to any  person obtaining
222e724bc9Sbluhm    a  copy  of  this  software   and  associated  documentation  files  (the
232e724bc9Sbluhm    "Software"),  to  deal in  the  Software  without restriction,  including
242e724bc9Sbluhm    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
252e724bc9Sbluhm    distribute, sublicense, and/or sell copies of the Software, and to permit
262e724bc9Sbluhm    persons  to whom  the Software  is  furnished to  do so,  subject to  the
272e724bc9Sbluhm    following conditions:
282e724bc9Sbluhm 
292e724bc9Sbluhm    The above copyright  notice and this permission notice  shall be included
302e724bc9Sbluhm    in all copies or substantial portions of the Software.
312e724bc9Sbluhm 
322e724bc9Sbluhm    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
332e724bc9Sbluhm    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
342e724bc9Sbluhm    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
352e724bc9Sbluhm    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
362e724bc9Sbluhm    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
372e724bc9Sbluhm    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
382e724bc9Sbluhm    USE OR OTHER DEALINGS IN THE SOFTWARE.
391a3ddf8cSespie */
401a3ddf8cSespie 
41*bd8f1dc3Sbluhm #include "expat_config.h"
422c19dcf8Sbluhm 
437d36914fSalek #include <stddef.h>
447d36914fSalek 
452feb5d2aSbluhm #ifdef _WIN32
461a3ddf8cSespie #  include "winconfig.h"
477d36914fSalek #endif
4808819b41Sbluhm 
497d36914fSalek #include "expat_external.h"
501a3ddf8cSespie #include "internal.h"
511a3ddf8cSespie #include "xmlrole.h"
521a3ddf8cSespie #include "ascii.h"
531a3ddf8cSespie 
541a3ddf8cSespie /* Doesn't check:
551a3ddf8cSespie 
561a3ddf8cSespie  that ,| are not mixed in a model group
571a3ddf8cSespie  content of literals
581a3ddf8cSespie 
591a3ddf8cSespie */
601a3ddf8cSespie 
6128ce3119Sbluhm static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
6228ce3119Sbluhm static const char KW_ATTLIST[]
6328ce3119Sbluhm     = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
6428ce3119Sbluhm static const char KW_CDATA[]
6528ce3119Sbluhm     = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
6628ce3119Sbluhm static const char KW_DOCTYPE[]
6728ce3119Sbluhm     = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
6828ce3119Sbluhm static const char KW_ELEMENT[]
6928ce3119Sbluhm     = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
7028ce3119Sbluhm static const char KW_EMPTY[]
7128ce3119Sbluhm     = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
7228ce3119Sbluhm static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
7328ce3119Sbluhm                                    ASCII_I, ASCII_E, ASCII_S, '\0'};
7428ce3119Sbluhm static const char KW_ENTITY[]
7528ce3119Sbluhm     = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
7628ce3119Sbluhm static const char KW_FIXED[]
7728ce3119Sbluhm     = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
7828ce3119Sbluhm static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
7928ce3119Sbluhm static const char KW_IDREF[]
8028ce3119Sbluhm     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
8128ce3119Sbluhm static const char KW_IDREFS[]
8228ce3119Sbluhm     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83b26ab0f8Smatthieu #ifdef XML_DTD
8428ce3119Sbluhm static const char KW_IGNORE[]
8528ce3119Sbluhm     = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86b26ab0f8Smatthieu #endif
8728ce3119Sbluhm static const char KW_IMPLIED[]
8828ce3119Sbluhm     = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89b26ab0f8Smatthieu #ifdef XML_DTD
9028ce3119Sbluhm static const char KW_INCLUDE[]
9128ce3119Sbluhm     = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92b26ab0f8Smatthieu #endif
9328ce3119Sbluhm static const char KW_NDATA[]
9428ce3119Sbluhm     = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
9528ce3119Sbluhm static const char KW_NMTOKEN[]
9628ce3119Sbluhm     = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
9728ce3119Sbluhm static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
9828ce3119Sbluhm                                    ASCII_E, ASCII_N, ASCII_S, '\0'};
9928ce3119Sbluhm static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
10028ce3119Sbluhm                                    ASCII_I, ASCII_O, ASCII_N, '\0'};
10128ce3119Sbluhm static const char KW_PCDATA[]
10228ce3119Sbluhm     = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
10328ce3119Sbluhm static const char KW_PUBLIC[]
10428ce3119Sbluhm     = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
10528ce3119Sbluhm static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
10628ce3119Sbluhm                                    ASCII_R, ASCII_E, ASCII_D, '\0'};
10728ce3119Sbluhm static const char KW_SYSTEM[]
10828ce3119Sbluhm     = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
1091a3ddf8cSespie 
1101a3ddf8cSespie #ifndef MIN_BYTES_PER_CHAR
1111a3ddf8cSespie #  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
1121a3ddf8cSespie #endif
1131a3ddf8cSespie 
1141a3ddf8cSespie #ifdef XML_DTD
1151a3ddf8cSespie #  define setTopLevel(state)                                                   \
11628ce3119Sbluhm     ((state)->handler                                                          \
11728ce3119Sbluhm      = ((state)->documentEntity ? internalSubset : externalSubset1))
1181a3ddf8cSespie #else /* not XML_DTD */
1191a3ddf8cSespie #  define setTopLevel(state) ((state)->handler = internalSubset)
1201a3ddf8cSespie #endif /* not XML_DTD */
1211a3ddf8cSespie 
12228ce3119Sbluhm typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
12328ce3119Sbluhm                                    const char *ptr, const char *end,
1241a3ddf8cSespie                                    const ENCODING *enc);
1251a3ddf8cSespie 
12628ce3119Sbluhm static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
12728ce3119Sbluhm     doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
12828ce3119Sbluhm     entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
12928ce3119Sbluhm     notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
13028ce3119Sbluhm     attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
13128ce3119Sbluhm     attlist9, element0, element1, element2, element3, element4, element5,
13228ce3119Sbluhm     element6, element7,
1331a3ddf8cSespie #ifdef XML_DTD
13428ce3119Sbluhm     externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
1351a3ddf8cSespie #endif /* XML_DTD */
13628ce3119Sbluhm     declClose, error;
1371a3ddf8cSespie 
1381a3ddf8cSespie static int FASTCALL common(PROLOG_STATE *state, int tok);
1391a3ddf8cSespie 
1401a3ddf8cSespie static int PTRCALL
prolog0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)14128ce3119Sbluhm prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
14228ce3119Sbluhm         const ENCODING *enc) {
1431a3ddf8cSespie   switch (tok) {
1441a3ddf8cSespie   case XML_TOK_PROLOG_S:
1451a3ddf8cSespie     state->handler = prolog1;
1461a3ddf8cSespie     return XML_ROLE_NONE;
1471a3ddf8cSespie   case XML_TOK_XML_DECL:
1481a3ddf8cSespie     state->handler = prolog1;
1491a3ddf8cSespie     return XML_ROLE_XML_DECL;
1501a3ddf8cSespie   case XML_TOK_PI:
1511a3ddf8cSespie     state->handler = prolog1;
1521a3ddf8cSespie     return XML_ROLE_PI;
1531a3ddf8cSespie   case XML_TOK_COMMENT:
1541a3ddf8cSespie     state->handler = prolog1;
1551a3ddf8cSespie     return XML_ROLE_COMMENT;
1561a3ddf8cSespie   case XML_TOK_BOM:
1571a3ddf8cSespie     return XML_ROLE_NONE;
1581a3ddf8cSespie   case XML_TOK_DECL_OPEN:
15928ce3119Sbluhm     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
1601a3ddf8cSespie                               KW_DOCTYPE))
1611a3ddf8cSespie       break;
1621a3ddf8cSespie     state->handler = doctype0;
1631a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
1641a3ddf8cSespie   case XML_TOK_INSTANCE_START:
1651a3ddf8cSespie     state->handler = error;
1661a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
1671a3ddf8cSespie   }
1681a3ddf8cSespie   return common(state, tok);
1691a3ddf8cSespie }
1701a3ddf8cSespie 
1711a3ddf8cSespie static int PTRCALL
prolog1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)17228ce3119Sbluhm prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
17328ce3119Sbluhm         const ENCODING *enc) {
1741a3ddf8cSespie   switch (tok) {
1751a3ddf8cSespie   case XML_TOK_PROLOG_S:
1761a3ddf8cSespie     return XML_ROLE_NONE;
1771a3ddf8cSespie   case XML_TOK_PI:
1781a3ddf8cSespie     return XML_ROLE_PI;
1791a3ddf8cSespie   case XML_TOK_COMMENT:
1801a3ddf8cSespie     return XML_ROLE_COMMENT;
1811a3ddf8cSespie   case XML_TOK_BOM:
1825837d4fcSbluhm     /* This case can never arise.  To reach this role function, the
1835837d4fcSbluhm      * parse must have passed through prolog0 and therefore have had
1845837d4fcSbluhm      * some form of input, even if only a space.  At that point, a
1855837d4fcSbluhm      * byte order mark is no longer a valid character (though
1865837d4fcSbluhm      * technically it should be interpreted as a non-breaking space),
1875837d4fcSbluhm      * so will be rejected by the tokenizing stages.
1885837d4fcSbluhm      */
1895837d4fcSbluhm     return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
1901a3ddf8cSespie   case XML_TOK_DECL_OPEN:
19128ce3119Sbluhm     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
1921a3ddf8cSespie                               KW_DOCTYPE))
1931a3ddf8cSespie       break;
1941a3ddf8cSespie     state->handler = doctype0;
1951a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
1961a3ddf8cSespie   case XML_TOK_INSTANCE_START:
1971a3ddf8cSespie     state->handler = error;
1981a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
1991a3ddf8cSespie   }
2001a3ddf8cSespie   return common(state, tok);
2011a3ddf8cSespie }
2021a3ddf8cSespie 
2031a3ddf8cSespie static int PTRCALL
prolog2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)20428ce3119Sbluhm prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
20528ce3119Sbluhm         const ENCODING *enc) {
20628ce3119Sbluhm   UNUSED_P(ptr);
20728ce3119Sbluhm   UNUSED_P(end);
20828ce3119Sbluhm   UNUSED_P(enc);
2091a3ddf8cSespie   switch (tok) {
2101a3ddf8cSespie   case XML_TOK_PROLOG_S:
2111a3ddf8cSespie     return XML_ROLE_NONE;
2121a3ddf8cSespie   case XML_TOK_PI:
2131a3ddf8cSespie     return XML_ROLE_PI;
2141a3ddf8cSespie   case XML_TOK_COMMENT:
2151a3ddf8cSespie     return XML_ROLE_COMMENT;
2161a3ddf8cSespie   case XML_TOK_INSTANCE_START:
2171a3ddf8cSespie     state->handler = error;
2181a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
2191a3ddf8cSespie   }
2201a3ddf8cSespie   return common(state, tok);
2211a3ddf8cSespie }
2221a3ddf8cSespie 
2231a3ddf8cSespie static int PTRCALL
doctype0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)22428ce3119Sbluhm doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
22528ce3119Sbluhm          const ENCODING *enc) {
22628ce3119Sbluhm   UNUSED_P(ptr);
22728ce3119Sbluhm   UNUSED_P(end);
22828ce3119Sbluhm   UNUSED_P(enc);
2291a3ddf8cSespie   switch (tok) {
2301a3ddf8cSespie   case XML_TOK_PROLOG_S:
2311a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2321a3ddf8cSespie   case XML_TOK_NAME:
2331a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
2341a3ddf8cSespie     state->handler = doctype1;
2351a3ddf8cSespie     return XML_ROLE_DOCTYPE_NAME;
2361a3ddf8cSespie   }
2371a3ddf8cSespie   return common(state, tok);
2381a3ddf8cSespie }
2391a3ddf8cSespie 
2401a3ddf8cSespie static int PTRCALL
doctype1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)24128ce3119Sbluhm doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
24228ce3119Sbluhm          const ENCODING *enc) {
2431a3ddf8cSespie   switch (tok) {
2441a3ddf8cSespie   case XML_TOK_PROLOG_S:
2451a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2461a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
2471a3ddf8cSespie     state->handler = internalSubset;
2481a3ddf8cSespie     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
2491a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
2501a3ddf8cSespie     state->handler = prolog2;
2511a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
2521a3ddf8cSespie   case XML_TOK_NAME:
2531a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
2541a3ddf8cSespie       state->handler = doctype3;
2551a3ddf8cSespie       return XML_ROLE_DOCTYPE_NONE;
2561a3ddf8cSespie     }
2571a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
2581a3ddf8cSespie       state->handler = doctype2;
2591a3ddf8cSespie       return XML_ROLE_DOCTYPE_NONE;
2601a3ddf8cSespie     }
2611a3ddf8cSespie     break;
2621a3ddf8cSespie   }
2631a3ddf8cSespie   return common(state, tok);
2641a3ddf8cSespie }
2651a3ddf8cSespie 
2661a3ddf8cSespie static int PTRCALL
doctype2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)26728ce3119Sbluhm doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
26828ce3119Sbluhm          const ENCODING *enc) {
26928ce3119Sbluhm   UNUSED_P(ptr);
27028ce3119Sbluhm   UNUSED_P(end);
27128ce3119Sbluhm   UNUSED_P(enc);
2721a3ddf8cSespie   switch (tok) {
2731a3ddf8cSespie   case XML_TOK_PROLOG_S:
2741a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2751a3ddf8cSespie   case XML_TOK_LITERAL:
2761a3ddf8cSespie     state->handler = doctype3;
2771a3ddf8cSespie     return XML_ROLE_DOCTYPE_PUBLIC_ID;
2781a3ddf8cSespie   }
2791a3ddf8cSespie   return common(state, tok);
2801a3ddf8cSespie }
2811a3ddf8cSespie 
2821a3ddf8cSespie static int PTRCALL
doctype3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)28328ce3119Sbluhm doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
28428ce3119Sbluhm          const ENCODING *enc) {
28528ce3119Sbluhm   UNUSED_P(ptr);
28628ce3119Sbluhm   UNUSED_P(end);
28728ce3119Sbluhm   UNUSED_P(enc);
2881a3ddf8cSespie   switch (tok) {
2891a3ddf8cSespie   case XML_TOK_PROLOG_S:
2901a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2911a3ddf8cSespie   case XML_TOK_LITERAL:
2921a3ddf8cSespie     state->handler = doctype4;
2931a3ddf8cSespie     return XML_ROLE_DOCTYPE_SYSTEM_ID;
2941a3ddf8cSespie   }
2951a3ddf8cSespie   return common(state, tok);
2961a3ddf8cSespie }
2971a3ddf8cSespie 
2981a3ddf8cSespie static int PTRCALL
doctype4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)29928ce3119Sbluhm doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
30028ce3119Sbluhm          const ENCODING *enc) {
30128ce3119Sbluhm   UNUSED_P(ptr);
30228ce3119Sbluhm   UNUSED_P(end);
30328ce3119Sbluhm   UNUSED_P(enc);
3041a3ddf8cSespie   switch (tok) {
3051a3ddf8cSespie   case XML_TOK_PROLOG_S:
3061a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3071a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
3081a3ddf8cSespie     state->handler = internalSubset;
3091a3ddf8cSespie     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
3101a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
3111a3ddf8cSespie     state->handler = prolog2;
3121a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
3131a3ddf8cSespie   }
3141a3ddf8cSespie   return common(state, tok);
3151a3ddf8cSespie }
3161a3ddf8cSespie 
3171a3ddf8cSespie static int PTRCALL
doctype5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)31828ce3119Sbluhm doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
31928ce3119Sbluhm          const ENCODING *enc) {
32028ce3119Sbluhm   UNUSED_P(ptr);
32128ce3119Sbluhm   UNUSED_P(end);
32228ce3119Sbluhm   UNUSED_P(enc);
3231a3ddf8cSespie   switch (tok) {
3241a3ddf8cSespie   case XML_TOK_PROLOG_S:
3251a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3261a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
3271a3ddf8cSespie     state->handler = prolog2;
3281a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
3291a3ddf8cSespie   }
3301a3ddf8cSespie   return common(state, tok);
3311a3ddf8cSespie }
3321a3ddf8cSespie 
3331a3ddf8cSespie static int PTRCALL
internalSubset(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)33428ce3119Sbluhm internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
33528ce3119Sbluhm                const ENCODING *enc) {
3361a3ddf8cSespie   switch (tok) {
3371a3ddf8cSespie   case XML_TOK_PROLOG_S:
3381a3ddf8cSespie     return XML_ROLE_NONE;
3391a3ddf8cSespie   case XML_TOK_DECL_OPEN:
34028ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3411a3ddf8cSespie                             KW_ENTITY)) {
3421a3ddf8cSespie       state->handler = entity0;
3431a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
3441a3ddf8cSespie     }
34528ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3461a3ddf8cSespie                             KW_ATTLIST)) {
3471a3ddf8cSespie       state->handler = attlist0;
3481a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
3491a3ddf8cSespie     }
35028ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3511a3ddf8cSespie                             KW_ELEMENT)) {
3521a3ddf8cSespie       state->handler = element0;
3531a3ddf8cSespie       return XML_ROLE_ELEMENT_NONE;
3541a3ddf8cSespie     }
35528ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3561a3ddf8cSespie                             KW_NOTATION)) {
3571a3ddf8cSespie       state->handler = notation0;
3581a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
3591a3ddf8cSespie     }
3601a3ddf8cSespie     break;
3611a3ddf8cSespie   case XML_TOK_PI:
3621a3ddf8cSespie     return XML_ROLE_PI;
3631a3ddf8cSespie   case XML_TOK_COMMENT:
3641a3ddf8cSespie     return XML_ROLE_COMMENT;
3651a3ddf8cSespie   case XML_TOK_PARAM_ENTITY_REF:
3661a3ddf8cSespie     return XML_ROLE_PARAM_ENTITY_REF;
3671a3ddf8cSespie   case XML_TOK_CLOSE_BRACKET:
3681a3ddf8cSespie     state->handler = doctype5;
3691a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3707d36914fSalek   case XML_TOK_NONE:
3717d36914fSalek     return XML_ROLE_NONE;
3721a3ddf8cSespie   }
3731a3ddf8cSespie   return common(state, tok);
3741a3ddf8cSespie }
3751a3ddf8cSespie 
3761a3ddf8cSespie #ifdef XML_DTD
3771a3ddf8cSespie 
3781a3ddf8cSespie static int PTRCALL
externalSubset0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)37928ce3119Sbluhm externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
38028ce3119Sbluhm                 const ENCODING *enc) {
3811a3ddf8cSespie   state->handler = externalSubset1;
3821a3ddf8cSespie   if (tok == XML_TOK_XML_DECL)
3831a3ddf8cSespie     return XML_ROLE_TEXT_DECL;
3841a3ddf8cSespie   return externalSubset1(state, tok, ptr, end, enc);
3851a3ddf8cSespie }
3861a3ddf8cSespie 
3871a3ddf8cSespie static int PTRCALL
externalSubset1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)38828ce3119Sbluhm externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
38928ce3119Sbluhm                 const ENCODING *enc) {
3901a3ddf8cSespie   switch (tok) {
3911a3ddf8cSespie   case XML_TOK_COND_SECT_OPEN:
3921a3ddf8cSespie     state->handler = condSect0;
3931a3ddf8cSespie     return XML_ROLE_NONE;
3941a3ddf8cSespie   case XML_TOK_COND_SECT_CLOSE:
3951a3ddf8cSespie     if (state->includeLevel == 0)
3961a3ddf8cSespie       break;
3971a3ddf8cSespie     state->includeLevel -= 1;
3981a3ddf8cSespie     return XML_ROLE_NONE;
3991a3ddf8cSespie   case XML_TOK_PROLOG_S:
4001a3ddf8cSespie     return XML_ROLE_NONE;
4011a3ddf8cSespie   case XML_TOK_CLOSE_BRACKET:
4021a3ddf8cSespie     break;
4031a3ddf8cSespie   case XML_TOK_NONE:
4041a3ddf8cSespie     if (state->includeLevel)
4051a3ddf8cSespie       break;
4061a3ddf8cSespie     return XML_ROLE_NONE;
4071a3ddf8cSespie   default:
4081a3ddf8cSespie     return internalSubset(state, tok, ptr, end, enc);
4091a3ddf8cSespie   }
4101a3ddf8cSespie   return common(state, tok);
4111a3ddf8cSespie }
4121a3ddf8cSespie 
4131a3ddf8cSespie #endif /* XML_DTD */
4141a3ddf8cSespie 
4151a3ddf8cSespie static int PTRCALL
entity0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)41628ce3119Sbluhm entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
41728ce3119Sbluhm         const ENCODING *enc) {
41828ce3119Sbluhm   UNUSED_P(ptr);
41928ce3119Sbluhm   UNUSED_P(end);
42028ce3119Sbluhm   UNUSED_P(enc);
4211a3ddf8cSespie   switch (tok) {
4221a3ddf8cSespie   case XML_TOK_PROLOG_S:
4231a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4241a3ddf8cSespie   case XML_TOK_PERCENT:
4251a3ddf8cSespie     state->handler = entity1;
4261a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4271a3ddf8cSespie   case XML_TOK_NAME:
4281a3ddf8cSespie     state->handler = entity2;
4291a3ddf8cSespie     return XML_ROLE_GENERAL_ENTITY_NAME;
4301a3ddf8cSespie   }
4311a3ddf8cSespie   return common(state, tok);
4321a3ddf8cSespie }
4331a3ddf8cSespie 
4341a3ddf8cSespie static int PTRCALL
entity1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)43528ce3119Sbluhm entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
43628ce3119Sbluhm         const ENCODING *enc) {
43728ce3119Sbluhm   UNUSED_P(ptr);
43828ce3119Sbluhm   UNUSED_P(end);
43928ce3119Sbluhm   UNUSED_P(enc);
4401a3ddf8cSespie   switch (tok) {
4411a3ddf8cSespie   case XML_TOK_PROLOG_S:
4421a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4431a3ddf8cSespie   case XML_TOK_NAME:
4441a3ddf8cSespie     state->handler = entity7;
4451a3ddf8cSespie     return XML_ROLE_PARAM_ENTITY_NAME;
4461a3ddf8cSespie   }
4471a3ddf8cSespie   return common(state, tok);
4481a3ddf8cSespie }
4491a3ddf8cSespie 
4501a3ddf8cSespie static int PTRCALL
entity2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)45128ce3119Sbluhm entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
45228ce3119Sbluhm         const ENCODING *enc) {
4531a3ddf8cSespie   switch (tok) {
4541a3ddf8cSespie   case XML_TOK_PROLOG_S:
4551a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4561a3ddf8cSespie   case XML_TOK_NAME:
4571a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
4581a3ddf8cSespie       state->handler = entity4;
4591a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
4601a3ddf8cSespie     }
4611a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
4621a3ddf8cSespie       state->handler = entity3;
4631a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
4641a3ddf8cSespie     }
4651a3ddf8cSespie     break;
4661a3ddf8cSespie   case XML_TOK_LITERAL:
4671a3ddf8cSespie     state->handler = declClose;
4681a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
4691a3ddf8cSespie     return XML_ROLE_ENTITY_VALUE;
4701a3ddf8cSespie   }
4711a3ddf8cSespie   return common(state, tok);
4721a3ddf8cSespie }
4731a3ddf8cSespie 
4741a3ddf8cSespie static int PTRCALL
entity3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)47528ce3119Sbluhm entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
47628ce3119Sbluhm         const ENCODING *enc) {
47728ce3119Sbluhm   UNUSED_P(ptr);
47828ce3119Sbluhm   UNUSED_P(end);
47928ce3119Sbluhm   UNUSED_P(enc);
4801a3ddf8cSespie   switch (tok) {
4811a3ddf8cSespie   case XML_TOK_PROLOG_S:
4821a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4831a3ddf8cSespie   case XML_TOK_LITERAL:
4841a3ddf8cSespie     state->handler = entity4;
4851a3ddf8cSespie     return XML_ROLE_ENTITY_PUBLIC_ID;
4861a3ddf8cSespie   }
4871a3ddf8cSespie   return common(state, tok);
4881a3ddf8cSespie }
4891a3ddf8cSespie 
4901a3ddf8cSespie static int PTRCALL
entity4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)49128ce3119Sbluhm entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
49228ce3119Sbluhm         const ENCODING *enc) {
49328ce3119Sbluhm   UNUSED_P(ptr);
49428ce3119Sbluhm   UNUSED_P(end);
49528ce3119Sbluhm   UNUSED_P(enc);
4961a3ddf8cSespie   switch (tok) {
4971a3ddf8cSespie   case XML_TOK_PROLOG_S:
4981a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4991a3ddf8cSespie   case XML_TOK_LITERAL:
5001a3ddf8cSespie     state->handler = entity5;
5011a3ddf8cSespie     return XML_ROLE_ENTITY_SYSTEM_ID;
5021a3ddf8cSespie   }
5031a3ddf8cSespie   return common(state, tok);
5041a3ddf8cSespie }
5051a3ddf8cSespie 
5061a3ddf8cSespie static int PTRCALL
entity5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)50728ce3119Sbluhm entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
50828ce3119Sbluhm         const ENCODING *enc) {
5091a3ddf8cSespie   switch (tok) {
5101a3ddf8cSespie   case XML_TOK_PROLOG_S:
5111a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5121a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
5131a3ddf8cSespie     setTopLevel(state);
5141a3ddf8cSespie     return XML_ROLE_ENTITY_COMPLETE;
5151a3ddf8cSespie   case XML_TOK_NAME:
5161a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
5171a3ddf8cSespie       state->handler = entity6;
5181a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5191a3ddf8cSespie     }
5201a3ddf8cSespie     break;
5211a3ddf8cSespie   }
5221a3ddf8cSespie   return common(state, tok);
5231a3ddf8cSespie }
5241a3ddf8cSespie 
5251a3ddf8cSespie static int PTRCALL
entity6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)52628ce3119Sbluhm entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
52728ce3119Sbluhm         const ENCODING *enc) {
52828ce3119Sbluhm   UNUSED_P(ptr);
52928ce3119Sbluhm   UNUSED_P(end);
53028ce3119Sbluhm   UNUSED_P(enc);
5311a3ddf8cSespie   switch (tok) {
5321a3ddf8cSespie   case XML_TOK_PROLOG_S:
5331a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5341a3ddf8cSespie   case XML_TOK_NAME:
5351a3ddf8cSespie     state->handler = declClose;
5361a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
5371a3ddf8cSespie     return XML_ROLE_ENTITY_NOTATION_NAME;
5381a3ddf8cSespie   }
5391a3ddf8cSespie   return common(state, tok);
5401a3ddf8cSespie }
5411a3ddf8cSespie 
5421a3ddf8cSespie static int PTRCALL
entity7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)54328ce3119Sbluhm entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
54428ce3119Sbluhm         const ENCODING *enc) {
5451a3ddf8cSespie   switch (tok) {
5461a3ddf8cSespie   case XML_TOK_PROLOG_S:
5471a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5481a3ddf8cSespie   case XML_TOK_NAME:
5491a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
5501a3ddf8cSespie       state->handler = entity9;
5511a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5521a3ddf8cSespie     }
5531a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
5541a3ddf8cSespie       state->handler = entity8;
5551a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5561a3ddf8cSespie     }
5571a3ddf8cSespie     break;
5581a3ddf8cSespie   case XML_TOK_LITERAL:
5591a3ddf8cSespie     state->handler = declClose;
5601a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
5611a3ddf8cSespie     return XML_ROLE_ENTITY_VALUE;
5621a3ddf8cSespie   }
5631a3ddf8cSespie   return common(state, tok);
5641a3ddf8cSespie }
5651a3ddf8cSespie 
5661a3ddf8cSespie static int PTRCALL
entity8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)56728ce3119Sbluhm entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
56828ce3119Sbluhm         const ENCODING *enc) {
56928ce3119Sbluhm   UNUSED_P(ptr);
57028ce3119Sbluhm   UNUSED_P(end);
57128ce3119Sbluhm   UNUSED_P(enc);
5721a3ddf8cSespie   switch (tok) {
5731a3ddf8cSespie   case XML_TOK_PROLOG_S:
5741a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5751a3ddf8cSespie   case XML_TOK_LITERAL:
5761a3ddf8cSespie     state->handler = entity9;
5771a3ddf8cSespie     return XML_ROLE_ENTITY_PUBLIC_ID;
5781a3ddf8cSespie   }
5791a3ddf8cSespie   return common(state, tok);
5801a3ddf8cSespie }
5811a3ddf8cSespie 
5821a3ddf8cSespie static int PTRCALL
entity9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)58328ce3119Sbluhm entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
58428ce3119Sbluhm         const ENCODING *enc) {
58528ce3119Sbluhm   UNUSED_P(ptr);
58628ce3119Sbluhm   UNUSED_P(end);
58728ce3119Sbluhm   UNUSED_P(enc);
5881a3ddf8cSespie   switch (tok) {
5891a3ddf8cSespie   case XML_TOK_PROLOG_S:
5901a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5911a3ddf8cSespie   case XML_TOK_LITERAL:
5921a3ddf8cSespie     state->handler = entity10;
5931a3ddf8cSespie     return XML_ROLE_ENTITY_SYSTEM_ID;
5941a3ddf8cSespie   }
5951a3ddf8cSespie   return common(state, tok);
5961a3ddf8cSespie }
5971a3ddf8cSespie 
5981a3ddf8cSespie static int PTRCALL
entity10(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)59928ce3119Sbluhm entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
60028ce3119Sbluhm          const ENCODING *enc) {
60128ce3119Sbluhm   UNUSED_P(ptr);
60228ce3119Sbluhm   UNUSED_P(end);
60328ce3119Sbluhm   UNUSED_P(enc);
6041a3ddf8cSespie   switch (tok) {
6051a3ddf8cSespie   case XML_TOK_PROLOG_S:
6061a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
6071a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
6081a3ddf8cSespie     setTopLevel(state);
6091a3ddf8cSespie     return XML_ROLE_ENTITY_COMPLETE;
6101a3ddf8cSespie   }
6111a3ddf8cSespie   return common(state, tok);
6121a3ddf8cSespie }
6131a3ddf8cSespie 
6141a3ddf8cSespie static int PTRCALL
notation0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)61528ce3119Sbluhm notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
61628ce3119Sbluhm           const ENCODING *enc) {
61728ce3119Sbluhm   UNUSED_P(ptr);
61828ce3119Sbluhm   UNUSED_P(end);
61928ce3119Sbluhm   UNUSED_P(enc);
6201a3ddf8cSespie   switch (tok) {
6211a3ddf8cSespie   case XML_TOK_PROLOG_S:
6221a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6231a3ddf8cSespie   case XML_TOK_NAME:
6241a3ddf8cSespie     state->handler = notation1;
6251a3ddf8cSespie     return XML_ROLE_NOTATION_NAME;
6261a3ddf8cSespie   }
6271a3ddf8cSespie   return common(state, tok);
6281a3ddf8cSespie }
6291a3ddf8cSespie 
6301a3ddf8cSespie static int PTRCALL
notation1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)63128ce3119Sbluhm notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
63228ce3119Sbluhm           const ENCODING *enc) {
6331a3ddf8cSespie   switch (tok) {
6341a3ddf8cSespie   case XML_TOK_PROLOG_S:
6351a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6361a3ddf8cSespie   case XML_TOK_NAME:
6371a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
6381a3ddf8cSespie       state->handler = notation3;
6391a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
6401a3ddf8cSespie     }
6411a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
6421a3ddf8cSespie       state->handler = notation2;
6431a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
6441a3ddf8cSespie     }
6451a3ddf8cSespie     break;
6461a3ddf8cSespie   }
6471a3ddf8cSespie   return common(state, tok);
6481a3ddf8cSespie }
6491a3ddf8cSespie 
6501a3ddf8cSespie static int PTRCALL
notation2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)65128ce3119Sbluhm notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
65228ce3119Sbluhm           const ENCODING *enc) {
65328ce3119Sbluhm   UNUSED_P(ptr);
65428ce3119Sbluhm   UNUSED_P(end);
65528ce3119Sbluhm   UNUSED_P(enc);
6561a3ddf8cSespie   switch (tok) {
6571a3ddf8cSespie   case XML_TOK_PROLOG_S:
6581a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6591a3ddf8cSespie   case XML_TOK_LITERAL:
6601a3ddf8cSespie     state->handler = notation4;
6611a3ddf8cSespie     return XML_ROLE_NOTATION_PUBLIC_ID;
6621a3ddf8cSespie   }
6631a3ddf8cSespie   return common(state, tok);
6641a3ddf8cSespie }
6651a3ddf8cSespie 
6661a3ddf8cSespie static int PTRCALL
notation3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)66728ce3119Sbluhm notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
66828ce3119Sbluhm           const ENCODING *enc) {
66928ce3119Sbluhm   UNUSED_P(ptr);
67028ce3119Sbluhm   UNUSED_P(end);
67128ce3119Sbluhm   UNUSED_P(enc);
6721a3ddf8cSespie   switch (tok) {
6731a3ddf8cSespie   case XML_TOK_PROLOG_S:
6741a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6751a3ddf8cSespie   case XML_TOK_LITERAL:
6761a3ddf8cSespie     state->handler = declClose;
6771a3ddf8cSespie     state->role_none = XML_ROLE_NOTATION_NONE;
6781a3ddf8cSespie     return XML_ROLE_NOTATION_SYSTEM_ID;
6791a3ddf8cSespie   }
6801a3ddf8cSespie   return common(state, tok);
6811a3ddf8cSespie }
6821a3ddf8cSespie 
6831a3ddf8cSespie static int PTRCALL
notation4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)68428ce3119Sbluhm notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
68528ce3119Sbluhm           const ENCODING *enc) {
68628ce3119Sbluhm   UNUSED_P(ptr);
68728ce3119Sbluhm   UNUSED_P(end);
68828ce3119Sbluhm   UNUSED_P(enc);
6891a3ddf8cSespie   switch (tok) {
6901a3ddf8cSespie   case XML_TOK_PROLOG_S:
6911a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6921a3ddf8cSespie   case XML_TOK_LITERAL:
6931a3ddf8cSespie     state->handler = declClose;
6941a3ddf8cSespie     state->role_none = XML_ROLE_NOTATION_NONE;
6951a3ddf8cSespie     return XML_ROLE_NOTATION_SYSTEM_ID;
6961a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
6971a3ddf8cSespie     setTopLevel(state);
6981a3ddf8cSespie     return XML_ROLE_NOTATION_NO_SYSTEM_ID;
6991a3ddf8cSespie   }
7001a3ddf8cSespie   return common(state, tok);
7011a3ddf8cSespie }
7021a3ddf8cSespie 
7031a3ddf8cSespie static int PTRCALL
attlist0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)70428ce3119Sbluhm attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
70528ce3119Sbluhm          const ENCODING *enc) {
70628ce3119Sbluhm   UNUSED_P(ptr);
70728ce3119Sbluhm   UNUSED_P(end);
70828ce3119Sbluhm   UNUSED_P(enc);
7091a3ddf8cSespie   switch (tok) {
7101a3ddf8cSespie   case XML_TOK_PROLOG_S:
7111a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7121a3ddf8cSespie   case XML_TOK_NAME:
7131a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
7141a3ddf8cSespie     state->handler = attlist1;
7151a3ddf8cSespie     return XML_ROLE_ATTLIST_ELEMENT_NAME;
7161a3ddf8cSespie   }
7171a3ddf8cSespie   return common(state, tok);
7181a3ddf8cSespie }
7191a3ddf8cSespie 
7201a3ddf8cSespie static int PTRCALL
attlist1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)72128ce3119Sbluhm attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
72228ce3119Sbluhm          const ENCODING *enc) {
72328ce3119Sbluhm   UNUSED_P(ptr);
72428ce3119Sbluhm   UNUSED_P(end);
72528ce3119Sbluhm   UNUSED_P(enc);
7261a3ddf8cSespie   switch (tok) {
7271a3ddf8cSespie   case XML_TOK_PROLOG_S:
7281a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7291a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
7301a3ddf8cSespie     setTopLevel(state);
7311a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7321a3ddf8cSespie   case XML_TOK_NAME:
7331a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
7341a3ddf8cSespie     state->handler = attlist2;
7351a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_NAME;
7361a3ddf8cSespie   }
7371a3ddf8cSespie   return common(state, tok);
7381a3ddf8cSespie }
7391a3ddf8cSespie 
7401a3ddf8cSespie static int PTRCALL
attlist2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)74128ce3119Sbluhm attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
74228ce3119Sbluhm          const ENCODING *enc) {
7431a3ddf8cSespie   switch (tok) {
7441a3ddf8cSespie   case XML_TOK_PROLOG_S:
7451a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
74628ce3119Sbluhm   case XML_TOK_NAME: {
7477d36914fSalek     static const char *const types[] = {
74828ce3119Sbluhm         KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
74928ce3119Sbluhm         KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
7501a3ddf8cSespie     };
7511a3ddf8cSespie     int i;
7521a3ddf8cSespie     for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
7531a3ddf8cSespie       if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
7541a3ddf8cSespie         state->handler = attlist8;
7551a3ddf8cSespie         return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
7561a3ddf8cSespie       }
7571a3ddf8cSespie   }
7581a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
7591a3ddf8cSespie       state->handler = attlist5;
7601a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
7611a3ddf8cSespie     }
7621a3ddf8cSespie     break;
7631a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
7641a3ddf8cSespie     state->handler = attlist3;
7651a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7661a3ddf8cSespie   }
7671a3ddf8cSespie   return common(state, tok);
7681a3ddf8cSespie }
7691a3ddf8cSespie 
7701a3ddf8cSespie static int PTRCALL
attlist3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)77128ce3119Sbluhm attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
77228ce3119Sbluhm          const ENCODING *enc) {
77328ce3119Sbluhm   UNUSED_P(ptr);
77428ce3119Sbluhm   UNUSED_P(end);
77528ce3119Sbluhm   UNUSED_P(enc);
7761a3ddf8cSespie   switch (tok) {
7771a3ddf8cSespie   case XML_TOK_PROLOG_S:
7781a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7791a3ddf8cSespie   case XML_TOK_NMTOKEN:
7801a3ddf8cSespie   case XML_TOK_NAME:
7811a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
7821a3ddf8cSespie     state->handler = attlist4;
7831a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
7841a3ddf8cSespie   }
7851a3ddf8cSespie   return common(state, tok);
7861a3ddf8cSespie }
7871a3ddf8cSespie 
7881a3ddf8cSespie static int PTRCALL
attlist4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)78928ce3119Sbluhm attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
79028ce3119Sbluhm          const ENCODING *enc) {
79128ce3119Sbluhm   UNUSED_P(ptr);
79228ce3119Sbluhm   UNUSED_P(end);
79328ce3119Sbluhm   UNUSED_P(enc);
7941a3ddf8cSespie   switch (tok) {
7951a3ddf8cSespie   case XML_TOK_PROLOG_S:
7961a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7971a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
7981a3ddf8cSespie     state->handler = attlist8;
7991a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8001a3ddf8cSespie   case XML_TOK_OR:
8011a3ddf8cSespie     state->handler = attlist3;
8021a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8031a3ddf8cSespie   }
8041a3ddf8cSespie   return common(state, tok);
8051a3ddf8cSespie }
8061a3ddf8cSespie 
8071a3ddf8cSespie static int PTRCALL
attlist5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)80828ce3119Sbluhm attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
80928ce3119Sbluhm          const ENCODING *enc) {
81028ce3119Sbluhm   UNUSED_P(ptr);
81128ce3119Sbluhm   UNUSED_P(end);
81228ce3119Sbluhm   UNUSED_P(enc);
8131a3ddf8cSespie   switch (tok) {
8141a3ddf8cSespie   case XML_TOK_PROLOG_S:
8151a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8161a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
8171a3ddf8cSespie     state->handler = attlist6;
8181a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8191a3ddf8cSespie   }
8201a3ddf8cSespie   return common(state, tok);
8211a3ddf8cSespie }
8221a3ddf8cSespie 
8231a3ddf8cSespie static int PTRCALL
attlist6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)82428ce3119Sbluhm attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
82528ce3119Sbluhm          const ENCODING *enc) {
82628ce3119Sbluhm   UNUSED_P(ptr);
82728ce3119Sbluhm   UNUSED_P(end);
82828ce3119Sbluhm   UNUSED_P(enc);
8291a3ddf8cSespie   switch (tok) {
8301a3ddf8cSespie   case XML_TOK_PROLOG_S:
8311a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8321a3ddf8cSespie   case XML_TOK_NAME:
8331a3ddf8cSespie     state->handler = attlist7;
8341a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
8351a3ddf8cSespie   }
8361a3ddf8cSespie   return common(state, tok);
8371a3ddf8cSespie }
8381a3ddf8cSespie 
8391a3ddf8cSespie static int PTRCALL
attlist7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)84028ce3119Sbluhm attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
84128ce3119Sbluhm          const ENCODING *enc) {
84228ce3119Sbluhm   UNUSED_P(ptr);
84328ce3119Sbluhm   UNUSED_P(end);
84428ce3119Sbluhm   UNUSED_P(enc);
8451a3ddf8cSespie   switch (tok) {
8461a3ddf8cSespie   case XML_TOK_PROLOG_S:
8471a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8481a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
8491a3ddf8cSespie     state->handler = attlist8;
8501a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8511a3ddf8cSespie   case XML_TOK_OR:
8521a3ddf8cSespie     state->handler = attlist6;
8531a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8541a3ddf8cSespie   }
8551a3ddf8cSespie   return common(state, tok);
8561a3ddf8cSespie }
8571a3ddf8cSespie 
8581a3ddf8cSespie /* default value */
8591a3ddf8cSespie static int PTRCALL
attlist8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)86028ce3119Sbluhm attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
86128ce3119Sbluhm          const ENCODING *enc) {
8621a3ddf8cSespie   switch (tok) {
8631a3ddf8cSespie   case XML_TOK_PROLOG_S:
8641a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8651a3ddf8cSespie   case XML_TOK_POUND_NAME:
86628ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8671a3ddf8cSespie                             KW_IMPLIED)) {
8681a3ddf8cSespie       state->handler = attlist1;
8691a3ddf8cSespie       return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
8701a3ddf8cSespie     }
87128ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8721a3ddf8cSespie                             KW_REQUIRED)) {
8731a3ddf8cSespie       state->handler = attlist1;
8741a3ddf8cSespie       return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
8751a3ddf8cSespie     }
87628ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8771a3ddf8cSespie                             KW_FIXED)) {
8781a3ddf8cSespie       state->handler = attlist9;
8791a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
8801a3ddf8cSespie     }
8811a3ddf8cSespie     break;
8821a3ddf8cSespie   case XML_TOK_LITERAL:
8831a3ddf8cSespie     state->handler = attlist1;
8841a3ddf8cSespie     return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
8851a3ddf8cSespie   }
8861a3ddf8cSespie   return common(state, tok);
8871a3ddf8cSespie }
8881a3ddf8cSespie 
8891a3ddf8cSespie static int PTRCALL
attlist9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)89028ce3119Sbluhm attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
89128ce3119Sbluhm          const ENCODING *enc) {
89228ce3119Sbluhm   UNUSED_P(ptr);
89328ce3119Sbluhm   UNUSED_P(end);
89428ce3119Sbluhm   UNUSED_P(enc);
8951a3ddf8cSespie   switch (tok) {
8961a3ddf8cSespie   case XML_TOK_PROLOG_S:
8971a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8981a3ddf8cSespie   case XML_TOK_LITERAL:
8991a3ddf8cSespie     state->handler = attlist1;
9001a3ddf8cSespie     return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
9011a3ddf8cSespie   }
9021a3ddf8cSespie   return common(state, tok);
9031a3ddf8cSespie }
9041a3ddf8cSespie 
9051a3ddf8cSespie static int PTRCALL
element0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)90628ce3119Sbluhm element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
90728ce3119Sbluhm          const ENCODING *enc) {
90828ce3119Sbluhm   UNUSED_P(ptr);
90928ce3119Sbluhm   UNUSED_P(end);
91028ce3119Sbluhm   UNUSED_P(enc);
9111a3ddf8cSespie   switch (tok) {
9121a3ddf8cSespie   case XML_TOK_PROLOG_S:
9131a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
9141a3ddf8cSespie   case XML_TOK_NAME:
9151a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
9161a3ddf8cSespie     state->handler = element1;
9171a3ddf8cSespie     return XML_ROLE_ELEMENT_NAME;
9181a3ddf8cSespie   }
9191a3ddf8cSespie   return common(state, tok);
9201a3ddf8cSespie }
9211a3ddf8cSespie 
9221a3ddf8cSespie static int PTRCALL
element1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)92328ce3119Sbluhm element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
92428ce3119Sbluhm          const ENCODING *enc) {
9251a3ddf8cSespie   switch (tok) {
9261a3ddf8cSespie   case XML_TOK_PROLOG_S:
9271a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
9281a3ddf8cSespie   case XML_TOK_NAME:
9291a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
9301a3ddf8cSespie       state->handler = declClose;
9311a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
9321a3ddf8cSespie       return XML_ROLE_CONTENT_EMPTY;
9331a3ddf8cSespie     }
9341a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
9351a3ddf8cSespie       state->handler = declClose;
9361a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
9371a3ddf8cSespie       return XML_ROLE_CONTENT_ANY;
9381a3ddf8cSespie     }
9391a3ddf8cSespie     break;
9401a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
9411a3ddf8cSespie     state->handler = element2;
9421a3ddf8cSespie     state->level = 1;
9431a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
9441a3ddf8cSespie   }
9451a3ddf8cSespie   return common(state, tok);
9461a3ddf8cSespie }
9471a3ddf8cSespie 
9481a3ddf8cSespie static int PTRCALL
element2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)94928ce3119Sbluhm element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
95028ce3119Sbluhm          const ENCODING *enc) {
9511a3ddf8cSespie   switch (tok) {
9521a3ddf8cSespie   case XML_TOK_PROLOG_S:
9531a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
9541a3ddf8cSespie   case XML_TOK_POUND_NAME:
95528ce3119Sbluhm     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
9561a3ddf8cSespie                             KW_PCDATA)) {
9571a3ddf8cSespie       state->handler = element3;
9581a3ddf8cSespie       return XML_ROLE_CONTENT_PCDATA;
9591a3ddf8cSespie     }
9601a3ddf8cSespie     break;
9611a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
9621a3ddf8cSespie     state->level = 2;
9631a3ddf8cSespie     state->handler = element6;
9641a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
9651a3ddf8cSespie   case XML_TOK_NAME:
9661a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
9671a3ddf8cSespie     state->handler = element7;
9681a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
9691a3ddf8cSespie   case XML_TOK_NAME_QUESTION:
9701a3ddf8cSespie     state->handler = element7;
9711a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_OPT;
9721a3ddf8cSespie   case XML_TOK_NAME_ASTERISK:
9731a3ddf8cSespie     state->handler = element7;
9741a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_REP;
9751a3ddf8cSespie   case XML_TOK_NAME_PLUS:
9761a3ddf8cSespie     state->handler = element7;
9771a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_PLUS;
9781a3ddf8cSespie   }
9791a3ddf8cSespie   return common(state, tok);
9801a3ddf8cSespie }
9811a3ddf8cSespie 
9821a3ddf8cSespie static int PTRCALL
element3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)98328ce3119Sbluhm element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
98428ce3119Sbluhm          const ENCODING *enc) {
98528ce3119Sbluhm   UNUSED_P(ptr);
98628ce3119Sbluhm   UNUSED_P(end);
98728ce3119Sbluhm   UNUSED_P(enc);
9881a3ddf8cSespie   switch (tok) {
9891a3ddf8cSespie   case XML_TOK_PROLOG_S:
9901a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
9911a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
9921a3ddf8cSespie     state->handler = declClose;
9931a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
9941a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE;
9951a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
9961a3ddf8cSespie     state->handler = declClose;
9971a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
9981a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
9991a3ddf8cSespie   case XML_TOK_OR:
10001a3ddf8cSespie     state->handler = element4;
10011a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10021a3ddf8cSespie   }
10031a3ddf8cSespie   return common(state, tok);
10041a3ddf8cSespie }
10051a3ddf8cSespie 
10061a3ddf8cSespie static int PTRCALL
element4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)100728ce3119Sbluhm element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
100828ce3119Sbluhm          const ENCODING *enc) {
100928ce3119Sbluhm   UNUSED_P(ptr);
101028ce3119Sbluhm   UNUSED_P(end);
101128ce3119Sbluhm   UNUSED_P(enc);
10121a3ddf8cSespie   switch (tok) {
10131a3ddf8cSespie   case XML_TOK_PROLOG_S:
10141a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10151a3ddf8cSespie   case XML_TOK_NAME:
10161a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
10171a3ddf8cSespie     state->handler = element5;
10181a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
10191a3ddf8cSespie   }
10201a3ddf8cSespie   return common(state, tok);
10211a3ddf8cSespie }
10221a3ddf8cSespie 
10231a3ddf8cSespie static int PTRCALL
element5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)102428ce3119Sbluhm element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
102528ce3119Sbluhm          const ENCODING *enc) {
102628ce3119Sbluhm   UNUSED_P(ptr);
102728ce3119Sbluhm   UNUSED_P(end);
102828ce3119Sbluhm   UNUSED_P(enc);
10291a3ddf8cSespie   switch (tok) {
10301a3ddf8cSespie   case XML_TOK_PROLOG_S:
10311a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10321a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
10331a3ddf8cSespie     state->handler = declClose;
10341a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
10351a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
10361a3ddf8cSespie   case XML_TOK_OR:
10371a3ddf8cSespie     state->handler = element4;
10381a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10391a3ddf8cSespie   }
10401a3ddf8cSespie   return common(state, tok);
10411a3ddf8cSespie }
10421a3ddf8cSespie 
10431a3ddf8cSespie static int PTRCALL
element6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)104428ce3119Sbluhm element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
104528ce3119Sbluhm          const ENCODING *enc) {
104628ce3119Sbluhm   UNUSED_P(ptr);
104728ce3119Sbluhm   UNUSED_P(end);
104828ce3119Sbluhm   UNUSED_P(enc);
10491a3ddf8cSespie   switch (tok) {
10501a3ddf8cSespie   case XML_TOK_PROLOG_S:
10511a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10521a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
10531a3ddf8cSespie     state->level += 1;
10541a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
10551a3ddf8cSespie   case XML_TOK_NAME:
10561a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
10571a3ddf8cSespie     state->handler = element7;
10581a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
10591a3ddf8cSespie   case XML_TOK_NAME_QUESTION:
10601a3ddf8cSespie     state->handler = element7;
10611a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_OPT;
10621a3ddf8cSespie   case XML_TOK_NAME_ASTERISK:
10631a3ddf8cSespie     state->handler = element7;
10641a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_REP;
10651a3ddf8cSespie   case XML_TOK_NAME_PLUS:
10661a3ddf8cSespie     state->handler = element7;
10671a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_PLUS;
10681a3ddf8cSespie   }
10691a3ddf8cSespie   return common(state, tok);
10701a3ddf8cSespie }
10711a3ddf8cSespie 
10721a3ddf8cSespie static int PTRCALL
element7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)107328ce3119Sbluhm element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
107428ce3119Sbluhm          const ENCODING *enc) {
107528ce3119Sbluhm   UNUSED_P(ptr);
107628ce3119Sbluhm   UNUSED_P(end);
107728ce3119Sbluhm   UNUSED_P(enc);
10781a3ddf8cSespie   switch (tok) {
10791a3ddf8cSespie   case XML_TOK_PROLOG_S:
10801a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10811a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
10821a3ddf8cSespie     state->level -= 1;
10831a3ddf8cSespie     if (state->level == 0) {
10841a3ddf8cSespie       state->handler = declClose;
10851a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
10861a3ddf8cSespie     }
10871a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE;
10881a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
10891a3ddf8cSespie     state->level -= 1;
10901a3ddf8cSespie     if (state->level == 0) {
10911a3ddf8cSespie       state->handler = declClose;
10921a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
10931a3ddf8cSespie     }
10941a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
10951a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_QUESTION:
10961a3ddf8cSespie     state->level -= 1;
10971a3ddf8cSespie     if (state->level == 0) {
10981a3ddf8cSespie       state->handler = declClose;
10991a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
11001a3ddf8cSespie     }
11011a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_OPT;
11021a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_PLUS:
11031a3ddf8cSespie     state->level -= 1;
11041a3ddf8cSespie     if (state->level == 0) {
11051a3ddf8cSespie       state->handler = declClose;
11061a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
11071a3ddf8cSespie     }
11081a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_PLUS;
11091a3ddf8cSespie   case XML_TOK_COMMA:
11101a3ddf8cSespie     state->handler = element6;
11111a3ddf8cSespie     return XML_ROLE_GROUP_SEQUENCE;
11121a3ddf8cSespie   case XML_TOK_OR:
11131a3ddf8cSespie     state->handler = element6;
11141a3ddf8cSespie     return XML_ROLE_GROUP_CHOICE;
11151a3ddf8cSespie   }
11161a3ddf8cSespie   return common(state, tok);
11171a3ddf8cSespie }
11181a3ddf8cSespie 
11191a3ddf8cSespie #ifdef XML_DTD
11201a3ddf8cSespie 
11211a3ddf8cSespie static int PTRCALL
condSect0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)112228ce3119Sbluhm condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
112328ce3119Sbluhm           const ENCODING *enc) {
11241a3ddf8cSespie   switch (tok) {
11251a3ddf8cSespie   case XML_TOK_PROLOG_S:
11261a3ddf8cSespie     return XML_ROLE_NONE;
11271a3ddf8cSespie   case XML_TOK_NAME:
11281a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
11291a3ddf8cSespie       state->handler = condSect1;
11301a3ddf8cSespie       return XML_ROLE_NONE;
11311a3ddf8cSespie     }
11321a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
11331a3ddf8cSespie       state->handler = condSect2;
11341a3ddf8cSespie       return XML_ROLE_NONE;
11351a3ddf8cSespie     }
11361a3ddf8cSespie     break;
11371a3ddf8cSespie   }
11381a3ddf8cSespie   return common(state, tok);
11391a3ddf8cSespie }
11401a3ddf8cSespie 
11411a3ddf8cSespie static int PTRCALL
condSect1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)114228ce3119Sbluhm condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
114328ce3119Sbluhm           const ENCODING *enc) {
114428ce3119Sbluhm   UNUSED_P(ptr);
114528ce3119Sbluhm   UNUSED_P(end);
114628ce3119Sbluhm   UNUSED_P(enc);
11471a3ddf8cSespie   switch (tok) {
11481a3ddf8cSespie   case XML_TOK_PROLOG_S:
11491a3ddf8cSespie     return XML_ROLE_NONE;
11501a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
11511a3ddf8cSespie     state->handler = externalSubset1;
11521a3ddf8cSespie     state->includeLevel += 1;
11531a3ddf8cSespie     return XML_ROLE_NONE;
11541a3ddf8cSespie   }
11551a3ddf8cSespie   return common(state, tok);
11561a3ddf8cSespie }
11571a3ddf8cSespie 
11581a3ddf8cSespie static int PTRCALL
condSect2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)115928ce3119Sbluhm condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
116028ce3119Sbluhm           const ENCODING *enc) {
116128ce3119Sbluhm   UNUSED_P(ptr);
116228ce3119Sbluhm   UNUSED_P(end);
116328ce3119Sbluhm   UNUSED_P(enc);
11641a3ddf8cSespie   switch (tok) {
11651a3ddf8cSespie   case XML_TOK_PROLOG_S:
11661a3ddf8cSespie     return XML_ROLE_NONE;
11671a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
11681a3ddf8cSespie     state->handler = externalSubset1;
11691a3ddf8cSespie     return XML_ROLE_IGNORE_SECT;
11701a3ddf8cSespie   }
11711a3ddf8cSespie   return common(state, tok);
11721a3ddf8cSespie }
11731a3ddf8cSespie 
11741a3ddf8cSespie #endif /* XML_DTD */
11751a3ddf8cSespie 
11761a3ddf8cSespie static int PTRCALL
declClose(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)117728ce3119Sbluhm declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
117828ce3119Sbluhm           const ENCODING *enc) {
117928ce3119Sbluhm   UNUSED_P(ptr);
118028ce3119Sbluhm   UNUSED_P(end);
118128ce3119Sbluhm   UNUSED_P(enc);
11821a3ddf8cSespie   switch (tok) {
11831a3ddf8cSespie   case XML_TOK_PROLOG_S:
11841a3ddf8cSespie     return state->role_none;
11851a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
11861a3ddf8cSespie     setTopLevel(state);
11871a3ddf8cSespie     return state->role_none;
11881a3ddf8cSespie   }
11891a3ddf8cSespie   return common(state, tok);
11901a3ddf8cSespie }
11911a3ddf8cSespie 
11925837d4fcSbluhm /* This function will only be invoked if the internal logic of the
11935837d4fcSbluhm  * parser has broken down.  It is used in two cases:
11945837d4fcSbluhm  *
11955837d4fcSbluhm  * 1: When the XML prolog has been finished.  At this point the
11965837d4fcSbluhm  * processor (the parser level above these role handlers) should
11975837d4fcSbluhm  * switch from prologProcessor to contentProcessor and reinitialise
11985837d4fcSbluhm  * the handler function.
11995837d4fcSbluhm  *
12005837d4fcSbluhm  * 2: When an error has been detected (via common() below).  At this
12015837d4fcSbluhm  * point again the processor should be switched to errorProcessor,
12025837d4fcSbluhm  * which will never call a handler.
12035837d4fcSbluhm  *
12045837d4fcSbluhm  * The result of this is that error() can only be called if the
12055837d4fcSbluhm  * processor switch failed to happen, which is an internal error and
12065837d4fcSbluhm  * therefore we shouldn't be able to provoke it simply by using the
12075837d4fcSbluhm  * library.  It is a necessary backstop, however, so we merely exclude
12085837d4fcSbluhm  * it from the coverage statistics.
12095837d4fcSbluhm  *
12105837d4fcSbluhm  * LCOV_EXCL_START
12115837d4fcSbluhm  */
12121a3ddf8cSespie static int PTRCALL
error(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)121328ce3119Sbluhm error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
121428ce3119Sbluhm       const ENCODING *enc) {
121528ce3119Sbluhm   UNUSED_P(state);
121628ce3119Sbluhm   UNUSED_P(tok);
121728ce3119Sbluhm   UNUSED_P(ptr);
121828ce3119Sbluhm   UNUSED_P(end);
121928ce3119Sbluhm   UNUSED_P(enc);
12201a3ddf8cSespie   return XML_ROLE_NONE;
12211a3ddf8cSespie }
12225837d4fcSbluhm /* LCOV_EXCL_STOP */
12231a3ddf8cSespie 
12241a3ddf8cSespie static int FASTCALL
common(PROLOG_STATE * state,int tok)122528ce3119Sbluhm common(PROLOG_STATE *state, int tok) {
12261a3ddf8cSespie #ifdef XML_DTD
12271a3ddf8cSespie   if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
12281a3ddf8cSespie     return XML_ROLE_INNER_PARAM_ENTITY_REF;
12292a4a206eSbluhm #else
12302a4a206eSbluhm   UNUSED_P(tok);
12311a3ddf8cSespie #endif
12321a3ddf8cSespie   state->handler = error;
12331a3ddf8cSespie   return XML_ROLE_ERROR;
12341a3ddf8cSespie }
12351a3ddf8cSespie 
12361a3ddf8cSespie void
XmlPrologStateInit(PROLOG_STATE * state)123728ce3119Sbluhm XmlPrologStateInit(PROLOG_STATE *state) {
12381a3ddf8cSespie   state->handler = prolog0;
12391a3ddf8cSespie #ifdef XML_DTD
12401a3ddf8cSespie   state->documentEntity = 1;
12411a3ddf8cSespie   state->includeLevel = 0;
12421a3ddf8cSespie   state->inEntityValue = 0;
12431a3ddf8cSespie #endif /* XML_DTD */
12441a3ddf8cSespie }
12451a3ddf8cSespie 
12461a3ddf8cSespie #ifdef XML_DTD
12471a3ddf8cSespie 
12481a3ddf8cSespie void
XmlPrologStateInitExternalEntity(PROLOG_STATE * state)124928ce3119Sbluhm XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
12501a3ddf8cSespie   state->handler = externalSubset0;
12511a3ddf8cSespie   state->documentEntity = 0;
12521a3ddf8cSespie   state->includeLevel = 0;
12531a3ddf8cSespie }
12541a3ddf8cSespie 
12551a3ddf8cSespie #endif /* XML_DTD */
1256