xref: /openbsd/lib/libexpat/lib/xmlrole.c (revision 2e724bc9)
1*2e724bc9Sbluhm /*
2*2e724bc9Sbluhm                             __  __            _
3*2e724bc9Sbluhm                          ___\ \/ /_ __   __ _| |_
4*2e724bc9Sbluhm                         / _ \\  /| '_ \ / _` | __|
5*2e724bc9Sbluhm                        |  __//  \| |_) | (_| | |_
6*2e724bc9Sbluhm                         \___/_/\_\ .__/ \__,_|\__|
7*2e724bc9Sbluhm                                  |_| XML parser
8*2e724bc9Sbluhm 
9*2e724bc9Sbluhm    Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10*2e724bc9Sbluhm    Copyright (c) 2000-2017 Expat development team
11*2e724bc9Sbluhm    Licensed under the MIT license:
12*2e724bc9Sbluhm 
13*2e724bc9Sbluhm    Permission is  hereby granted,  free of charge,  to any  person obtaining
14*2e724bc9Sbluhm    a  copy  of  this  software   and  associated  documentation  files  (the
15*2e724bc9Sbluhm    "Software"),  to  deal in  the  Software  without restriction,  including
16*2e724bc9Sbluhm    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
17*2e724bc9Sbluhm    distribute, sublicense, and/or sell copies of the Software, and to permit
18*2e724bc9Sbluhm    persons  to whom  the Software  is  furnished to  do so,  subject to  the
19*2e724bc9Sbluhm    following conditions:
20*2e724bc9Sbluhm 
21*2e724bc9Sbluhm    The above copyright  notice and this permission notice  shall be included
22*2e724bc9Sbluhm    in all copies or substantial portions of the Software.
23*2e724bc9Sbluhm 
24*2e724bc9Sbluhm    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
25*2e724bc9Sbluhm    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
26*2e724bc9Sbluhm    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
27*2e724bc9Sbluhm    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
28*2e724bc9Sbluhm    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
29*2e724bc9Sbluhm    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
30*2e724bc9Sbluhm    USE OR OTHER DEALINGS IN THE SOFTWARE.
311a3ddf8cSespie */
321a3ddf8cSespie 
337d36914fSalek #include <stddef.h>
347d36914fSalek 
352feb5d2aSbluhm #ifdef _WIN32
361a3ddf8cSespie #include "winconfig.h"
371a3ddf8cSespie #else
387d36914fSalek #ifdef HAVE_EXPAT_CONFIG_H
391a3ddf8cSespie #include <expat_config.h>
407d36914fSalek #endif
412feb5d2aSbluhm #endif /* ndef _WIN32 */
421a3ddf8cSespie 
437d36914fSalek #include "expat_external.h"
441a3ddf8cSespie #include "internal.h"
451a3ddf8cSespie #include "xmlrole.h"
461a3ddf8cSespie #include "ascii.h"
471a3ddf8cSespie 
481a3ddf8cSespie /* Doesn't check:
491a3ddf8cSespie 
501a3ddf8cSespie  that ,| are not mixed in a model group
511a3ddf8cSespie  content of literals
521a3ddf8cSespie 
531a3ddf8cSespie */
541a3ddf8cSespie 
551a3ddf8cSespie static const char KW_ANY[] = {
561a3ddf8cSespie     ASCII_A, ASCII_N, ASCII_Y, '\0' };
571a3ddf8cSespie static const char KW_ATTLIST[] = {
581a3ddf8cSespie     ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
591a3ddf8cSespie static const char KW_CDATA[] = {
601a3ddf8cSespie     ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
611a3ddf8cSespie static const char KW_DOCTYPE[] = {
621a3ddf8cSespie     ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
631a3ddf8cSespie static const char KW_ELEMENT[] = {
641a3ddf8cSespie     ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
651a3ddf8cSespie static const char KW_EMPTY[] = {
661a3ddf8cSespie     ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
671a3ddf8cSespie static const char KW_ENTITIES[] = {
681a3ddf8cSespie     ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
691a3ddf8cSespie     '\0' };
701a3ddf8cSespie static const char KW_ENTITY[] = {
711a3ddf8cSespie     ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
721a3ddf8cSespie static const char KW_FIXED[] = {
731a3ddf8cSespie     ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
741a3ddf8cSespie static const char KW_ID[] = {
751a3ddf8cSespie     ASCII_I, ASCII_D, '\0' };
761a3ddf8cSespie static const char KW_IDREF[] = {
771a3ddf8cSespie     ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
781a3ddf8cSespie static const char KW_IDREFS[] = {
791a3ddf8cSespie     ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
80b26ab0f8Smatthieu #ifdef XML_DTD
811a3ddf8cSespie static const char KW_IGNORE[] = {
821a3ddf8cSespie     ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
83b26ab0f8Smatthieu #endif
841a3ddf8cSespie static const char KW_IMPLIED[] = {
851a3ddf8cSespie     ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
86b26ab0f8Smatthieu #ifdef XML_DTD
871a3ddf8cSespie static const char KW_INCLUDE[] = {
881a3ddf8cSespie     ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
89b26ab0f8Smatthieu #endif
901a3ddf8cSespie static const char KW_NDATA[] = {
911a3ddf8cSespie     ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
921a3ddf8cSespie static const char KW_NMTOKEN[] = {
931a3ddf8cSespie     ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
941a3ddf8cSespie static const char KW_NMTOKENS[] = {
951a3ddf8cSespie     ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
961a3ddf8cSespie     '\0' };
971a3ddf8cSespie static const char KW_NOTATION[] =
981a3ddf8cSespie     { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
991a3ddf8cSespie       '\0' };
1001a3ddf8cSespie static const char KW_PCDATA[] = {
1011a3ddf8cSespie     ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
1021a3ddf8cSespie static const char KW_PUBLIC[] = {
1031a3ddf8cSespie     ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
1041a3ddf8cSespie static const char KW_REQUIRED[] = {
1051a3ddf8cSespie     ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
1061a3ddf8cSespie     '\0' };
1071a3ddf8cSespie static const char KW_SYSTEM[] = {
1081a3ddf8cSespie     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) \
1161a3ddf8cSespie   ((state)->handler = ((state)->documentEntity \
1171a3ddf8cSespie                        ? internalSubset \
1181a3ddf8cSespie                        : externalSubset1))
1191a3ddf8cSespie #else /* not XML_DTD */
1201a3ddf8cSespie #define setTopLevel(state) ((state)->handler = internalSubset)
1211a3ddf8cSespie #endif /* not XML_DTD */
1221a3ddf8cSespie 
1231a3ddf8cSespie typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
1241a3ddf8cSespie                                    int tok,
1251a3ddf8cSespie                                    const char *ptr,
1261a3ddf8cSespie                                    const char *end,
1271a3ddf8cSespie                                    const ENCODING *enc);
1281a3ddf8cSespie 
1291a3ddf8cSespie static PROLOG_HANDLER
1301a3ddf8cSespie   prolog0, prolog1, prolog2,
1311a3ddf8cSespie   doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
1321a3ddf8cSespie   internalSubset,
1331a3ddf8cSespie   entity0, entity1, entity2, entity3, entity4, entity5, entity6,
1341a3ddf8cSespie   entity7, entity8, entity9, entity10,
1351a3ddf8cSespie   notation0, notation1, notation2, notation3, notation4,
1361a3ddf8cSespie   attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
1371a3ddf8cSespie   attlist7, attlist8, attlist9,
1381a3ddf8cSespie   element0, element1, element2, element3, element4, element5, element6,
1391a3ddf8cSespie   element7,
1401a3ddf8cSespie #ifdef XML_DTD
1411a3ddf8cSespie   externalSubset0, externalSubset1,
1421a3ddf8cSespie   condSect0, condSect1, condSect2,
1431a3ddf8cSespie #endif /* XML_DTD */
1441a3ddf8cSespie   declClose,
1451a3ddf8cSespie   error;
1461a3ddf8cSespie 
1471a3ddf8cSespie static int FASTCALL common(PROLOG_STATE *state, int tok);
1481a3ddf8cSespie 
1491a3ddf8cSespie static int PTRCALL
1501a3ddf8cSespie prolog0(PROLOG_STATE *state,
1511a3ddf8cSespie         int tok,
1521a3ddf8cSespie         const char *ptr,
1531a3ddf8cSespie         const char *end,
1541a3ddf8cSespie         const ENCODING *enc)
1551a3ddf8cSespie {
1561a3ddf8cSespie   switch (tok) {
1571a3ddf8cSespie   case XML_TOK_PROLOG_S:
1581a3ddf8cSespie     state->handler = prolog1;
1591a3ddf8cSespie     return XML_ROLE_NONE;
1601a3ddf8cSespie   case XML_TOK_XML_DECL:
1611a3ddf8cSespie     state->handler = prolog1;
1621a3ddf8cSespie     return XML_ROLE_XML_DECL;
1631a3ddf8cSespie   case XML_TOK_PI:
1641a3ddf8cSespie     state->handler = prolog1;
1651a3ddf8cSespie     return XML_ROLE_PI;
1661a3ddf8cSespie   case XML_TOK_COMMENT:
1671a3ddf8cSespie     state->handler = prolog1;
1681a3ddf8cSespie     return XML_ROLE_COMMENT;
1691a3ddf8cSespie   case XML_TOK_BOM:
1701a3ddf8cSespie     return XML_ROLE_NONE;
1711a3ddf8cSespie   case XML_TOK_DECL_OPEN:
1721a3ddf8cSespie     if (!XmlNameMatchesAscii(enc,
1731a3ddf8cSespie                              ptr + 2 * MIN_BYTES_PER_CHAR(enc),
1741a3ddf8cSespie                              end,
1751a3ddf8cSespie                              KW_DOCTYPE))
1761a3ddf8cSespie       break;
1771a3ddf8cSespie     state->handler = doctype0;
1781a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
1791a3ddf8cSespie   case XML_TOK_INSTANCE_START:
1801a3ddf8cSespie     state->handler = error;
1811a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
1821a3ddf8cSespie   }
1831a3ddf8cSespie   return common(state, tok);
1841a3ddf8cSespie }
1851a3ddf8cSespie 
1861a3ddf8cSespie static int PTRCALL
1871a3ddf8cSespie prolog1(PROLOG_STATE *state,
1881a3ddf8cSespie         int tok,
1891a3ddf8cSespie         const char *ptr,
1901a3ddf8cSespie         const char *end,
1911a3ddf8cSespie         const ENCODING *enc)
1921a3ddf8cSespie {
1931a3ddf8cSespie   switch (tok) {
1941a3ddf8cSespie   case XML_TOK_PROLOG_S:
1951a3ddf8cSespie     return XML_ROLE_NONE;
1961a3ddf8cSespie   case XML_TOK_PI:
1971a3ddf8cSespie     return XML_ROLE_PI;
1981a3ddf8cSespie   case XML_TOK_COMMENT:
1991a3ddf8cSespie     return XML_ROLE_COMMENT;
2001a3ddf8cSespie   case XML_TOK_BOM:
2015837d4fcSbluhm     /* This case can never arise.  To reach this role function, the
2025837d4fcSbluhm      * parse must have passed through prolog0 and therefore have had
2035837d4fcSbluhm      * some form of input, even if only a space.  At that point, a
2045837d4fcSbluhm      * byte order mark is no longer a valid character (though
2055837d4fcSbluhm      * technically it should be interpreted as a non-breaking space),
2065837d4fcSbluhm      * so will be rejected by the tokenizing stages.
2075837d4fcSbluhm      */
2085837d4fcSbluhm     return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
2091a3ddf8cSespie   case XML_TOK_DECL_OPEN:
2101a3ddf8cSespie     if (!XmlNameMatchesAscii(enc,
2111a3ddf8cSespie                              ptr + 2 * MIN_BYTES_PER_CHAR(enc),
2121a3ddf8cSespie                              end,
2131a3ddf8cSespie                              KW_DOCTYPE))
2141a3ddf8cSespie       break;
2151a3ddf8cSespie     state->handler = doctype0;
2161a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2171a3ddf8cSespie   case XML_TOK_INSTANCE_START:
2181a3ddf8cSespie     state->handler = error;
2191a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
2201a3ddf8cSespie   }
2211a3ddf8cSespie   return common(state, tok);
2221a3ddf8cSespie }
2231a3ddf8cSespie 
2241a3ddf8cSespie static int PTRCALL
2251a3ddf8cSespie prolog2(PROLOG_STATE *state,
2261a3ddf8cSespie         int tok,
2272feb5d2aSbluhm         const char *UNUSED_P(ptr),
2282feb5d2aSbluhm         const char *UNUSED_P(end),
2292feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
2301a3ddf8cSespie {
2311a3ddf8cSespie   switch (tok) {
2321a3ddf8cSespie   case XML_TOK_PROLOG_S:
2331a3ddf8cSespie     return XML_ROLE_NONE;
2341a3ddf8cSespie   case XML_TOK_PI:
2351a3ddf8cSespie     return XML_ROLE_PI;
2361a3ddf8cSespie   case XML_TOK_COMMENT:
2371a3ddf8cSespie     return XML_ROLE_COMMENT;
2381a3ddf8cSespie   case XML_TOK_INSTANCE_START:
2391a3ddf8cSespie     state->handler = error;
2401a3ddf8cSespie     return XML_ROLE_INSTANCE_START;
2411a3ddf8cSespie   }
2421a3ddf8cSespie   return common(state, tok);
2431a3ddf8cSespie }
2441a3ddf8cSespie 
2451a3ddf8cSespie static int PTRCALL
2461a3ddf8cSespie doctype0(PROLOG_STATE *state,
2471a3ddf8cSespie          int tok,
2482feb5d2aSbluhm          const char *UNUSED_P(ptr),
2492feb5d2aSbluhm          const char *UNUSED_P(end),
2502feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
2511a3ddf8cSespie {
2521a3ddf8cSespie   switch (tok) {
2531a3ddf8cSespie   case XML_TOK_PROLOG_S:
2541a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2551a3ddf8cSespie   case XML_TOK_NAME:
2561a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
2571a3ddf8cSespie     state->handler = doctype1;
2581a3ddf8cSespie     return XML_ROLE_DOCTYPE_NAME;
2591a3ddf8cSespie   }
2601a3ddf8cSespie   return common(state, tok);
2611a3ddf8cSespie }
2621a3ddf8cSespie 
2631a3ddf8cSespie static int PTRCALL
2641a3ddf8cSespie doctype1(PROLOG_STATE *state,
2651a3ddf8cSespie          int tok,
2661a3ddf8cSespie          const char *ptr,
2671a3ddf8cSespie          const char *end,
2681a3ddf8cSespie          const ENCODING *enc)
2691a3ddf8cSespie {
2701a3ddf8cSespie   switch (tok) {
2711a3ddf8cSespie   case XML_TOK_PROLOG_S:
2721a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
2731a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
2741a3ddf8cSespie     state->handler = internalSubset;
2751a3ddf8cSespie     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
2761a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
2771a3ddf8cSespie     state->handler = prolog2;
2781a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
2791a3ddf8cSespie   case XML_TOK_NAME:
2801a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
2811a3ddf8cSespie       state->handler = doctype3;
2821a3ddf8cSespie       return XML_ROLE_DOCTYPE_NONE;
2831a3ddf8cSespie     }
2841a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
2851a3ddf8cSespie       state->handler = doctype2;
2861a3ddf8cSespie       return XML_ROLE_DOCTYPE_NONE;
2871a3ddf8cSespie     }
2881a3ddf8cSespie     break;
2891a3ddf8cSespie   }
2901a3ddf8cSespie   return common(state, tok);
2911a3ddf8cSespie }
2921a3ddf8cSespie 
2931a3ddf8cSespie static int PTRCALL
2941a3ddf8cSespie doctype2(PROLOG_STATE *state,
2951a3ddf8cSespie          int tok,
2962feb5d2aSbluhm          const char *UNUSED_P(ptr),
2972feb5d2aSbluhm          const char *UNUSED_P(end),
2982feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
2991a3ddf8cSespie {
3001a3ddf8cSespie   switch (tok) {
3011a3ddf8cSespie   case XML_TOK_PROLOG_S:
3021a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3031a3ddf8cSespie   case XML_TOK_LITERAL:
3041a3ddf8cSespie     state->handler = doctype3;
3051a3ddf8cSespie     return XML_ROLE_DOCTYPE_PUBLIC_ID;
3061a3ddf8cSespie   }
3071a3ddf8cSespie   return common(state, tok);
3081a3ddf8cSespie }
3091a3ddf8cSespie 
3101a3ddf8cSespie static int PTRCALL
3111a3ddf8cSespie doctype3(PROLOG_STATE *state,
3121a3ddf8cSespie          int tok,
3132feb5d2aSbluhm          const char *UNUSED_P(ptr),
3142feb5d2aSbluhm          const char *UNUSED_P(end),
3152feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
3161a3ddf8cSespie {
3171a3ddf8cSespie   switch (tok) {
3181a3ddf8cSespie   case XML_TOK_PROLOG_S:
3191a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3201a3ddf8cSespie   case XML_TOK_LITERAL:
3211a3ddf8cSespie     state->handler = doctype4;
3221a3ddf8cSespie     return XML_ROLE_DOCTYPE_SYSTEM_ID;
3231a3ddf8cSespie   }
3241a3ddf8cSespie   return common(state, tok);
3251a3ddf8cSespie }
3261a3ddf8cSespie 
3271a3ddf8cSespie static int PTRCALL
3281a3ddf8cSespie doctype4(PROLOG_STATE *state,
3291a3ddf8cSespie          int tok,
3302feb5d2aSbluhm          const char *UNUSED_P(ptr),
3312feb5d2aSbluhm          const char *UNUSED_P(end),
3322feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
3331a3ddf8cSespie {
3341a3ddf8cSespie   switch (tok) {
3351a3ddf8cSespie   case XML_TOK_PROLOG_S:
3361a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3371a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
3381a3ddf8cSespie     state->handler = internalSubset;
3391a3ddf8cSespie     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
3401a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
3411a3ddf8cSespie     state->handler = prolog2;
3421a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
3431a3ddf8cSespie   }
3441a3ddf8cSespie   return common(state, tok);
3451a3ddf8cSespie }
3461a3ddf8cSespie 
3471a3ddf8cSespie static int PTRCALL
3481a3ddf8cSespie doctype5(PROLOG_STATE *state,
3491a3ddf8cSespie          int tok,
3502feb5d2aSbluhm          const char *UNUSED_P(ptr),
3512feb5d2aSbluhm          const char *UNUSED_P(end),
3522feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
3531a3ddf8cSespie {
3541a3ddf8cSespie   switch (tok) {
3551a3ddf8cSespie   case XML_TOK_PROLOG_S:
3561a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
3571a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
3581a3ddf8cSespie     state->handler = prolog2;
3591a3ddf8cSespie     return XML_ROLE_DOCTYPE_CLOSE;
3601a3ddf8cSespie   }
3611a3ddf8cSespie   return common(state, tok);
3621a3ddf8cSespie }
3631a3ddf8cSespie 
3641a3ddf8cSespie static int PTRCALL
3651a3ddf8cSespie internalSubset(PROLOG_STATE *state,
3661a3ddf8cSespie                int tok,
3671a3ddf8cSespie                const char *ptr,
3681a3ddf8cSespie                const char *end,
3691a3ddf8cSespie                const ENCODING *enc)
3701a3ddf8cSespie {
3711a3ddf8cSespie   switch (tok) {
3721a3ddf8cSespie   case XML_TOK_PROLOG_S:
3731a3ddf8cSespie     return XML_ROLE_NONE;
3741a3ddf8cSespie   case XML_TOK_DECL_OPEN:
3751a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
3761a3ddf8cSespie                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
3771a3ddf8cSespie                             end,
3781a3ddf8cSespie                             KW_ENTITY)) {
3791a3ddf8cSespie       state->handler = entity0;
3801a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
3811a3ddf8cSespie     }
3821a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
3831a3ddf8cSespie                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
3841a3ddf8cSespie                             end,
3851a3ddf8cSespie                             KW_ATTLIST)) {
3861a3ddf8cSespie       state->handler = attlist0;
3871a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
3881a3ddf8cSespie     }
3891a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
3901a3ddf8cSespie                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
3911a3ddf8cSespie                             end,
3921a3ddf8cSespie                             KW_ELEMENT)) {
3931a3ddf8cSespie       state->handler = element0;
3941a3ddf8cSespie       return XML_ROLE_ELEMENT_NONE;
3951a3ddf8cSespie     }
3961a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
3971a3ddf8cSespie                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),
3981a3ddf8cSespie                             end,
3991a3ddf8cSespie                             KW_NOTATION)) {
4001a3ddf8cSespie       state->handler = notation0;
4011a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
4021a3ddf8cSespie     }
4031a3ddf8cSespie     break;
4041a3ddf8cSespie   case XML_TOK_PI:
4051a3ddf8cSespie     return XML_ROLE_PI;
4061a3ddf8cSespie   case XML_TOK_COMMENT:
4071a3ddf8cSespie     return XML_ROLE_COMMENT;
4081a3ddf8cSespie   case XML_TOK_PARAM_ENTITY_REF:
4091a3ddf8cSespie     return XML_ROLE_PARAM_ENTITY_REF;
4101a3ddf8cSespie   case XML_TOK_CLOSE_BRACKET:
4111a3ddf8cSespie     state->handler = doctype5;
4121a3ddf8cSespie     return XML_ROLE_DOCTYPE_NONE;
4137d36914fSalek   case XML_TOK_NONE:
4147d36914fSalek     return XML_ROLE_NONE;
4151a3ddf8cSespie   }
4161a3ddf8cSespie   return common(state, tok);
4171a3ddf8cSespie }
4181a3ddf8cSespie 
4191a3ddf8cSespie #ifdef XML_DTD
4201a3ddf8cSespie 
4211a3ddf8cSespie static int PTRCALL
4221a3ddf8cSespie externalSubset0(PROLOG_STATE *state,
4231a3ddf8cSespie                 int tok,
4241a3ddf8cSespie                 const char *ptr,
4251a3ddf8cSespie                 const char *end,
4261a3ddf8cSespie                 const ENCODING *enc)
4271a3ddf8cSespie {
4281a3ddf8cSespie   state->handler = externalSubset1;
4291a3ddf8cSespie   if (tok == XML_TOK_XML_DECL)
4301a3ddf8cSespie     return XML_ROLE_TEXT_DECL;
4311a3ddf8cSespie   return externalSubset1(state, tok, ptr, end, enc);
4321a3ddf8cSespie }
4331a3ddf8cSespie 
4341a3ddf8cSespie static int PTRCALL
4351a3ddf8cSespie externalSubset1(PROLOG_STATE *state,
4361a3ddf8cSespie                 int tok,
4371a3ddf8cSespie                 const char *ptr,
4381a3ddf8cSespie                 const char *end,
4391a3ddf8cSespie                 const ENCODING *enc)
4401a3ddf8cSespie {
4411a3ddf8cSespie   switch (tok) {
4421a3ddf8cSespie   case XML_TOK_COND_SECT_OPEN:
4431a3ddf8cSespie     state->handler = condSect0;
4441a3ddf8cSespie     return XML_ROLE_NONE;
4451a3ddf8cSespie   case XML_TOK_COND_SECT_CLOSE:
4461a3ddf8cSespie     if (state->includeLevel == 0)
4471a3ddf8cSespie       break;
4481a3ddf8cSespie     state->includeLevel -= 1;
4491a3ddf8cSespie     return XML_ROLE_NONE;
4501a3ddf8cSespie   case XML_TOK_PROLOG_S:
4511a3ddf8cSespie     return XML_ROLE_NONE;
4521a3ddf8cSespie   case XML_TOK_CLOSE_BRACKET:
4531a3ddf8cSespie     break;
4541a3ddf8cSespie   case XML_TOK_NONE:
4551a3ddf8cSespie     if (state->includeLevel)
4561a3ddf8cSespie       break;
4571a3ddf8cSespie     return XML_ROLE_NONE;
4581a3ddf8cSespie   default:
4591a3ddf8cSespie     return internalSubset(state, tok, ptr, end, enc);
4601a3ddf8cSespie   }
4611a3ddf8cSespie   return common(state, tok);
4621a3ddf8cSespie }
4631a3ddf8cSespie 
4641a3ddf8cSespie #endif /* XML_DTD */
4651a3ddf8cSespie 
4661a3ddf8cSespie static int PTRCALL
4671a3ddf8cSespie entity0(PROLOG_STATE *state,
4681a3ddf8cSespie         int tok,
4692feb5d2aSbluhm         const char *UNUSED_P(ptr),
4702feb5d2aSbluhm         const char *UNUSED_P(end),
4712feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
4721a3ddf8cSespie {
4731a3ddf8cSespie   switch (tok) {
4741a3ddf8cSespie   case XML_TOK_PROLOG_S:
4751a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4761a3ddf8cSespie   case XML_TOK_PERCENT:
4771a3ddf8cSespie     state->handler = entity1;
4781a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4791a3ddf8cSespie   case XML_TOK_NAME:
4801a3ddf8cSespie     state->handler = entity2;
4811a3ddf8cSespie     return XML_ROLE_GENERAL_ENTITY_NAME;
4821a3ddf8cSespie   }
4831a3ddf8cSespie   return common(state, tok);
4841a3ddf8cSespie }
4851a3ddf8cSespie 
4861a3ddf8cSespie static int PTRCALL
4871a3ddf8cSespie entity1(PROLOG_STATE *state,
4881a3ddf8cSespie         int tok,
4892feb5d2aSbluhm         const char *UNUSED_P(ptr),
4902feb5d2aSbluhm         const char *UNUSED_P(end),
4912feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
4921a3ddf8cSespie {
4931a3ddf8cSespie   switch (tok) {
4941a3ddf8cSespie   case XML_TOK_PROLOG_S:
4951a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
4961a3ddf8cSespie   case XML_TOK_NAME:
4971a3ddf8cSespie     state->handler = entity7;
4981a3ddf8cSespie     return XML_ROLE_PARAM_ENTITY_NAME;
4991a3ddf8cSespie   }
5001a3ddf8cSespie   return common(state, tok);
5011a3ddf8cSespie }
5021a3ddf8cSespie 
5031a3ddf8cSespie static int PTRCALL
5041a3ddf8cSespie entity2(PROLOG_STATE *state,
5051a3ddf8cSespie         int tok,
5061a3ddf8cSespie         const char *ptr,
5071a3ddf8cSespie         const char *end,
5081a3ddf8cSespie         const ENCODING *enc)
5091a3ddf8cSespie {
5101a3ddf8cSespie   switch (tok) {
5111a3ddf8cSespie   case XML_TOK_PROLOG_S:
5121a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5131a3ddf8cSespie   case XML_TOK_NAME:
5141a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
5151a3ddf8cSespie       state->handler = entity4;
5161a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5171a3ddf8cSespie     }
5181a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
5191a3ddf8cSespie       state->handler = entity3;
5201a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5211a3ddf8cSespie     }
5221a3ddf8cSespie     break;
5231a3ddf8cSespie   case XML_TOK_LITERAL:
5241a3ddf8cSespie     state->handler = declClose;
5251a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
5261a3ddf8cSespie     return XML_ROLE_ENTITY_VALUE;
5271a3ddf8cSespie   }
5281a3ddf8cSespie   return common(state, tok);
5291a3ddf8cSespie }
5301a3ddf8cSespie 
5311a3ddf8cSespie static int PTRCALL
5321a3ddf8cSespie entity3(PROLOG_STATE *state,
5331a3ddf8cSespie         int tok,
5342feb5d2aSbluhm         const char *UNUSED_P(ptr),
5352feb5d2aSbluhm         const char *UNUSED_P(end),
5362feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
5371a3ddf8cSespie {
5381a3ddf8cSespie   switch (tok) {
5391a3ddf8cSespie   case XML_TOK_PROLOG_S:
5401a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5411a3ddf8cSespie   case XML_TOK_LITERAL:
5421a3ddf8cSespie     state->handler = entity4;
5431a3ddf8cSespie     return XML_ROLE_ENTITY_PUBLIC_ID;
5441a3ddf8cSespie   }
5451a3ddf8cSespie   return common(state, tok);
5461a3ddf8cSespie }
5471a3ddf8cSespie 
5481a3ddf8cSespie static int PTRCALL
5491a3ddf8cSespie entity4(PROLOG_STATE *state,
5501a3ddf8cSespie         int tok,
5512feb5d2aSbluhm         const char *UNUSED_P(ptr),
5522feb5d2aSbluhm         const char *UNUSED_P(end),
5532feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
5541a3ddf8cSespie {
5551a3ddf8cSespie   switch (tok) {
5561a3ddf8cSespie   case XML_TOK_PROLOG_S:
5571a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5581a3ddf8cSespie   case XML_TOK_LITERAL:
5591a3ddf8cSespie     state->handler = entity5;
5601a3ddf8cSespie     return XML_ROLE_ENTITY_SYSTEM_ID;
5611a3ddf8cSespie   }
5621a3ddf8cSespie   return common(state, tok);
5631a3ddf8cSespie }
5641a3ddf8cSespie 
5651a3ddf8cSespie static int PTRCALL
5661a3ddf8cSespie entity5(PROLOG_STATE *state,
5671a3ddf8cSespie         int tok,
5681a3ddf8cSespie         const char *ptr,
5691a3ddf8cSespie         const char *end,
5701a3ddf8cSespie         const ENCODING *enc)
5711a3ddf8cSespie {
5721a3ddf8cSespie   switch (tok) {
5731a3ddf8cSespie   case XML_TOK_PROLOG_S:
5741a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5751a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
5761a3ddf8cSespie     setTopLevel(state);
5771a3ddf8cSespie     return XML_ROLE_ENTITY_COMPLETE;
5781a3ddf8cSespie   case XML_TOK_NAME:
5791a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
5801a3ddf8cSespie       state->handler = entity6;
5811a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
5821a3ddf8cSespie     }
5831a3ddf8cSespie     break;
5841a3ddf8cSespie   }
5851a3ddf8cSespie   return common(state, tok);
5861a3ddf8cSespie }
5871a3ddf8cSespie 
5881a3ddf8cSespie static int PTRCALL
5891a3ddf8cSespie entity6(PROLOG_STATE *state,
5901a3ddf8cSespie         int tok,
5912feb5d2aSbluhm         const char *UNUSED_P(ptr),
5922feb5d2aSbluhm         const char *UNUSED_P(end),
5932feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
5941a3ddf8cSespie {
5951a3ddf8cSespie   switch (tok) {
5961a3ddf8cSespie   case XML_TOK_PROLOG_S:
5971a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
5981a3ddf8cSespie   case XML_TOK_NAME:
5991a3ddf8cSespie     state->handler = declClose;
6001a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
6011a3ddf8cSespie     return XML_ROLE_ENTITY_NOTATION_NAME;
6021a3ddf8cSespie   }
6031a3ddf8cSespie   return common(state, tok);
6041a3ddf8cSespie }
6051a3ddf8cSespie 
6061a3ddf8cSespie static int PTRCALL
6071a3ddf8cSespie entity7(PROLOG_STATE *state,
6081a3ddf8cSespie         int tok,
6091a3ddf8cSespie         const char *ptr,
6101a3ddf8cSespie         const char *end,
6111a3ddf8cSespie         const ENCODING *enc)
6121a3ddf8cSespie {
6131a3ddf8cSespie   switch (tok) {
6141a3ddf8cSespie   case XML_TOK_PROLOG_S:
6151a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
6161a3ddf8cSespie   case XML_TOK_NAME:
6171a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
6181a3ddf8cSespie       state->handler = entity9;
6191a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
6201a3ddf8cSespie     }
6211a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
6221a3ddf8cSespie       state->handler = entity8;
6231a3ddf8cSespie       return XML_ROLE_ENTITY_NONE;
6241a3ddf8cSespie     }
6251a3ddf8cSespie     break;
6261a3ddf8cSespie   case XML_TOK_LITERAL:
6271a3ddf8cSespie     state->handler = declClose;
6281a3ddf8cSespie     state->role_none = XML_ROLE_ENTITY_NONE;
6291a3ddf8cSespie     return XML_ROLE_ENTITY_VALUE;
6301a3ddf8cSespie   }
6311a3ddf8cSespie   return common(state, tok);
6321a3ddf8cSespie }
6331a3ddf8cSespie 
6341a3ddf8cSespie static int PTRCALL
6351a3ddf8cSespie entity8(PROLOG_STATE *state,
6361a3ddf8cSespie         int tok,
6372feb5d2aSbluhm         const char *UNUSED_P(ptr),
6382feb5d2aSbluhm         const char *UNUSED_P(end),
6392feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
6401a3ddf8cSespie {
6411a3ddf8cSespie   switch (tok) {
6421a3ddf8cSespie   case XML_TOK_PROLOG_S:
6431a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
6441a3ddf8cSespie   case XML_TOK_LITERAL:
6451a3ddf8cSespie     state->handler = entity9;
6461a3ddf8cSespie     return XML_ROLE_ENTITY_PUBLIC_ID;
6471a3ddf8cSespie   }
6481a3ddf8cSespie   return common(state, tok);
6491a3ddf8cSespie }
6501a3ddf8cSespie 
6511a3ddf8cSespie static int PTRCALL
6521a3ddf8cSespie entity9(PROLOG_STATE *state,
6531a3ddf8cSespie         int tok,
6542feb5d2aSbluhm         const char *UNUSED_P(ptr),
6552feb5d2aSbluhm         const char *UNUSED_P(end),
6562feb5d2aSbluhm         const ENCODING *UNUSED_P(enc))
6571a3ddf8cSespie {
6581a3ddf8cSespie   switch (tok) {
6591a3ddf8cSespie   case XML_TOK_PROLOG_S:
6601a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
6611a3ddf8cSespie   case XML_TOK_LITERAL:
6621a3ddf8cSespie     state->handler = entity10;
6631a3ddf8cSespie     return XML_ROLE_ENTITY_SYSTEM_ID;
6641a3ddf8cSespie   }
6651a3ddf8cSespie   return common(state, tok);
6661a3ddf8cSespie }
6671a3ddf8cSespie 
6681a3ddf8cSespie static int PTRCALL
6691a3ddf8cSespie entity10(PROLOG_STATE *state,
6701a3ddf8cSespie          int tok,
6712feb5d2aSbluhm          const char *UNUSED_P(ptr),
6722feb5d2aSbluhm          const char *UNUSED_P(end),
6732feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
6741a3ddf8cSespie {
6751a3ddf8cSespie   switch (tok) {
6761a3ddf8cSespie   case XML_TOK_PROLOG_S:
6771a3ddf8cSespie     return XML_ROLE_ENTITY_NONE;
6781a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
6791a3ddf8cSespie     setTopLevel(state);
6801a3ddf8cSespie     return XML_ROLE_ENTITY_COMPLETE;
6811a3ddf8cSespie   }
6821a3ddf8cSespie   return common(state, tok);
6831a3ddf8cSespie }
6841a3ddf8cSespie 
6851a3ddf8cSespie static int PTRCALL
6861a3ddf8cSespie notation0(PROLOG_STATE *state,
6871a3ddf8cSespie           int tok,
6882feb5d2aSbluhm           const char *UNUSED_P(ptr),
6892feb5d2aSbluhm           const char *UNUSED_P(end),
6902feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
6911a3ddf8cSespie {
6921a3ddf8cSespie   switch (tok) {
6931a3ddf8cSespie   case XML_TOK_PROLOG_S:
6941a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
6951a3ddf8cSespie   case XML_TOK_NAME:
6961a3ddf8cSespie     state->handler = notation1;
6971a3ddf8cSespie     return XML_ROLE_NOTATION_NAME;
6981a3ddf8cSespie   }
6991a3ddf8cSespie   return common(state, tok);
7001a3ddf8cSespie }
7011a3ddf8cSespie 
7021a3ddf8cSespie static int PTRCALL
7031a3ddf8cSespie notation1(PROLOG_STATE *state,
7041a3ddf8cSespie           int tok,
7051a3ddf8cSespie           const char *ptr,
7061a3ddf8cSespie           const char *end,
7071a3ddf8cSespie           const ENCODING *enc)
7081a3ddf8cSespie {
7091a3ddf8cSespie   switch (tok) {
7101a3ddf8cSespie   case XML_TOK_PROLOG_S:
7111a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
7121a3ddf8cSespie   case XML_TOK_NAME:
7131a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
7141a3ddf8cSespie       state->handler = notation3;
7151a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
7161a3ddf8cSespie     }
7171a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
7181a3ddf8cSespie       state->handler = notation2;
7191a3ddf8cSespie       return XML_ROLE_NOTATION_NONE;
7201a3ddf8cSespie     }
7211a3ddf8cSespie     break;
7221a3ddf8cSespie   }
7231a3ddf8cSespie   return common(state, tok);
7241a3ddf8cSespie }
7251a3ddf8cSespie 
7261a3ddf8cSespie static int PTRCALL
7271a3ddf8cSespie notation2(PROLOG_STATE *state,
7281a3ddf8cSespie           int tok,
7292feb5d2aSbluhm           const char *UNUSED_P(ptr),
7302feb5d2aSbluhm           const char *UNUSED_P(end),
7312feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
7321a3ddf8cSespie {
7331a3ddf8cSespie   switch (tok) {
7341a3ddf8cSespie   case XML_TOK_PROLOG_S:
7351a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
7361a3ddf8cSespie   case XML_TOK_LITERAL:
7371a3ddf8cSespie     state->handler = notation4;
7381a3ddf8cSespie     return XML_ROLE_NOTATION_PUBLIC_ID;
7391a3ddf8cSespie   }
7401a3ddf8cSespie   return common(state, tok);
7411a3ddf8cSespie }
7421a3ddf8cSespie 
7431a3ddf8cSespie static int PTRCALL
7441a3ddf8cSespie notation3(PROLOG_STATE *state,
7451a3ddf8cSespie           int tok,
7462feb5d2aSbluhm           const char *UNUSED_P(ptr),
7472feb5d2aSbluhm           const char *UNUSED_P(end),
7482feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
7491a3ddf8cSespie {
7501a3ddf8cSespie   switch (tok) {
7511a3ddf8cSespie   case XML_TOK_PROLOG_S:
7521a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
7531a3ddf8cSespie   case XML_TOK_LITERAL:
7541a3ddf8cSespie     state->handler = declClose;
7551a3ddf8cSespie     state->role_none = XML_ROLE_NOTATION_NONE;
7561a3ddf8cSespie     return XML_ROLE_NOTATION_SYSTEM_ID;
7571a3ddf8cSespie   }
7581a3ddf8cSespie   return common(state, tok);
7591a3ddf8cSespie }
7601a3ddf8cSespie 
7611a3ddf8cSespie static int PTRCALL
7621a3ddf8cSespie notation4(PROLOG_STATE *state,
7631a3ddf8cSespie           int tok,
7642feb5d2aSbluhm           const char *UNUSED_P(ptr),
7652feb5d2aSbluhm           const char *UNUSED_P(end),
7662feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
7671a3ddf8cSespie {
7681a3ddf8cSespie   switch (tok) {
7691a3ddf8cSespie   case XML_TOK_PROLOG_S:
7701a3ddf8cSespie     return XML_ROLE_NOTATION_NONE;
7711a3ddf8cSespie   case XML_TOK_LITERAL:
7721a3ddf8cSespie     state->handler = declClose;
7731a3ddf8cSespie     state->role_none = XML_ROLE_NOTATION_NONE;
7741a3ddf8cSespie     return XML_ROLE_NOTATION_SYSTEM_ID;
7751a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
7761a3ddf8cSespie     setTopLevel(state);
7771a3ddf8cSespie     return XML_ROLE_NOTATION_NO_SYSTEM_ID;
7781a3ddf8cSespie   }
7791a3ddf8cSespie   return common(state, tok);
7801a3ddf8cSespie }
7811a3ddf8cSespie 
7821a3ddf8cSespie static int PTRCALL
7831a3ddf8cSespie attlist0(PROLOG_STATE *state,
7841a3ddf8cSespie          int tok,
7852feb5d2aSbluhm          const char *UNUSED_P(ptr),
7862feb5d2aSbluhm          const char *UNUSED_P(end),
7872feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
7881a3ddf8cSespie {
7891a3ddf8cSespie   switch (tok) {
7901a3ddf8cSespie   case XML_TOK_PROLOG_S:
7911a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
7921a3ddf8cSespie   case XML_TOK_NAME:
7931a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
7941a3ddf8cSespie     state->handler = attlist1;
7951a3ddf8cSespie     return XML_ROLE_ATTLIST_ELEMENT_NAME;
7961a3ddf8cSespie   }
7971a3ddf8cSespie   return common(state, tok);
7981a3ddf8cSespie }
7991a3ddf8cSespie 
8001a3ddf8cSespie static int PTRCALL
8011a3ddf8cSespie attlist1(PROLOG_STATE *state,
8021a3ddf8cSespie          int tok,
8032feb5d2aSbluhm          const char *UNUSED_P(ptr),
8042feb5d2aSbluhm          const char *UNUSED_P(end),
8052feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
8061a3ddf8cSespie {
8071a3ddf8cSespie   switch (tok) {
8081a3ddf8cSespie   case XML_TOK_PROLOG_S:
8091a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8101a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
8111a3ddf8cSespie     setTopLevel(state);
8121a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8131a3ddf8cSespie   case XML_TOK_NAME:
8141a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
8151a3ddf8cSespie     state->handler = attlist2;
8161a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_NAME;
8171a3ddf8cSespie   }
8181a3ddf8cSespie   return common(state, tok);
8191a3ddf8cSespie }
8201a3ddf8cSespie 
8211a3ddf8cSespie static int PTRCALL
8221a3ddf8cSespie attlist2(PROLOG_STATE *state,
8231a3ddf8cSespie          int tok,
8241a3ddf8cSespie          const char *ptr,
8251a3ddf8cSespie          const char *end,
8261a3ddf8cSespie          const ENCODING *enc)
8271a3ddf8cSespie {
8281a3ddf8cSespie   switch (tok) {
8291a3ddf8cSespie   case XML_TOK_PROLOG_S:
8301a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8311a3ddf8cSespie   case XML_TOK_NAME:
8321a3ddf8cSespie     {
8337d36914fSalek       static const char * const types[] = {
8341a3ddf8cSespie         KW_CDATA,
8351a3ddf8cSespie         KW_ID,
8361a3ddf8cSespie         KW_IDREF,
8371a3ddf8cSespie         KW_IDREFS,
8381a3ddf8cSespie         KW_ENTITY,
8391a3ddf8cSespie         KW_ENTITIES,
8401a3ddf8cSespie         KW_NMTOKEN,
8411a3ddf8cSespie         KW_NMTOKENS,
8421a3ddf8cSespie       };
8431a3ddf8cSespie       int i;
8441a3ddf8cSespie       for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
8451a3ddf8cSespie         if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
8461a3ddf8cSespie           state->handler = attlist8;
8471a3ddf8cSespie           return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
8481a3ddf8cSespie         }
8491a3ddf8cSespie     }
8501a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
8511a3ddf8cSespie       state->handler = attlist5;
8521a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
8531a3ddf8cSespie     }
8541a3ddf8cSespie     break;
8551a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
8561a3ddf8cSespie     state->handler = attlist3;
8571a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8581a3ddf8cSespie   }
8591a3ddf8cSespie   return common(state, tok);
8601a3ddf8cSespie }
8611a3ddf8cSespie 
8621a3ddf8cSespie static int PTRCALL
8631a3ddf8cSespie attlist3(PROLOG_STATE *state,
8641a3ddf8cSespie          int tok,
8652feb5d2aSbluhm          const char *UNUSED_P(ptr),
8662feb5d2aSbluhm          const char *UNUSED_P(end),
8672feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
8681a3ddf8cSespie {
8691a3ddf8cSespie   switch (tok) {
8701a3ddf8cSespie   case XML_TOK_PROLOG_S:
8711a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8721a3ddf8cSespie   case XML_TOK_NMTOKEN:
8731a3ddf8cSespie   case XML_TOK_NAME:
8741a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
8751a3ddf8cSespie     state->handler = attlist4;
8761a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
8771a3ddf8cSespie   }
8781a3ddf8cSespie   return common(state, tok);
8791a3ddf8cSespie }
8801a3ddf8cSespie 
8811a3ddf8cSespie static int PTRCALL
8821a3ddf8cSespie attlist4(PROLOG_STATE *state,
8831a3ddf8cSespie          int tok,
8842feb5d2aSbluhm          const char *UNUSED_P(ptr),
8852feb5d2aSbluhm          const char *UNUSED_P(end),
8862feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
8871a3ddf8cSespie {
8881a3ddf8cSespie   switch (tok) {
8891a3ddf8cSespie   case XML_TOK_PROLOG_S:
8901a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8911a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
8921a3ddf8cSespie     state->handler = attlist8;
8931a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8941a3ddf8cSespie   case XML_TOK_OR:
8951a3ddf8cSespie     state->handler = attlist3;
8961a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
8971a3ddf8cSespie   }
8981a3ddf8cSespie   return common(state, tok);
8991a3ddf8cSespie }
9001a3ddf8cSespie 
9011a3ddf8cSespie static int PTRCALL
9021a3ddf8cSespie attlist5(PROLOG_STATE *state,
9031a3ddf8cSespie          int tok,
9042feb5d2aSbluhm          const char *UNUSED_P(ptr),
9052feb5d2aSbluhm          const char *UNUSED_P(end),
9062feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
9071a3ddf8cSespie {
9081a3ddf8cSespie   switch (tok) {
9091a3ddf8cSespie   case XML_TOK_PROLOG_S:
9101a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9111a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
9121a3ddf8cSespie     state->handler = attlist6;
9131a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9141a3ddf8cSespie   }
9151a3ddf8cSespie   return common(state, tok);
9161a3ddf8cSespie }
9171a3ddf8cSespie 
9181a3ddf8cSespie static int PTRCALL
9191a3ddf8cSespie attlist6(PROLOG_STATE *state,
9201a3ddf8cSespie          int tok,
9212feb5d2aSbluhm          const char *UNUSED_P(ptr),
9222feb5d2aSbluhm          const char *UNUSED_P(end),
9232feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
9241a3ddf8cSespie {
9251a3ddf8cSespie   switch (tok) {
9261a3ddf8cSespie   case XML_TOK_PROLOG_S:
9271a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9281a3ddf8cSespie   case XML_TOK_NAME:
9291a3ddf8cSespie     state->handler = attlist7;
9301a3ddf8cSespie     return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
9311a3ddf8cSespie   }
9321a3ddf8cSespie   return common(state, tok);
9331a3ddf8cSespie }
9341a3ddf8cSespie 
9351a3ddf8cSespie static int PTRCALL
9361a3ddf8cSespie attlist7(PROLOG_STATE *state,
9371a3ddf8cSespie          int tok,
9382feb5d2aSbluhm          const char *UNUSED_P(ptr),
9392feb5d2aSbluhm          const char *UNUSED_P(end),
9402feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
9411a3ddf8cSespie {
9421a3ddf8cSespie   switch (tok) {
9431a3ddf8cSespie   case XML_TOK_PROLOG_S:
9441a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9451a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
9461a3ddf8cSespie     state->handler = attlist8;
9471a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9481a3ddf8cSespie   case XML_TOK_OR:
9491a3ddf8cSespie     state->handler = attlist6;
9501a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9511a3ddf8cSespie   }
9521a3ddf8cSespie   return common(state, tok);
9531a3ddf8cSespie }
9541a3ddf8cSespie 
9551a3ddf8cSespie /* default value */
9561a3ddf8cSespie static int PTRCALL
9571a3ddf8cSespie attlist8(PROLOG_STATE *state,
9581a3ddf8cSespie          int tok,
9591a3ddf8cSespie          const char *ptr,
9601a3ddf8cSespie          const char *end,
9611a3ddf8cSespie          const ENCODING *enc)
9621a3ddf8cSespie {
9631a3ddf8cSespie   switch (tok) {
9641a3ddf8cSespie   case XML_TOK_PROLOG_S:
9651a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
9661a3ddf8cSespie   case XML_TOK_POUND_NAME:
9671a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
9681a3ddf8cSespie                             ptr + MIN_BYTES_PER_CHAR(enc),
9691a3ddf8cSespie                             end,
9701a3ddf8cSespie                             KW_IMPLIED)) {
9711a3ddf8cSespie       state->handler = attlist1;
9721a3ddf8cSespie       return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
9731a3ddf8cSespie     }
9741a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
9751a3ddf8cSespie                             ptr + MIN_BYTES_PER_CHAR(enc),
9761a3ddf8cSespie                             end,
9771a3ddf8cSespie                             KW_REQUIRED)) {
9781a3ddf8cSespie       state->handler = attlist1;
9791a3ddf8cSespie       return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
9801a3ddf8cSespie     }
9811a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
9821a3ddf8cSespie                             ptr + MIN_BYTES_PER_CHAR(enc),
9831a3ddf8cSespie                             end,
9841a3ddf8cSespie                             KW_FIXED)) {
9851a3ddf8cSespie       state->handler = attlist9;
9861a3ddf8cSespie       return XML_ROLE_ATTLIST_NONE;
9871a3ddf8cSespie     }
9881a3ddf8cSespie     break;
9891a3ddf8cSespie   case XML_TOK_LITERAL:
9901a3ddf8cSespie     state->handler = attlist1;
9911a3ddf8cSespie     return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
9921a3ddf8cSespie   }
9931a3ddf8cSespie   return common(state, tok);
9941a3ddf8cSespie }
9951a3ddf8cSespie 
9961a3ddf8cSespie static int PTRCALL
9971a3ddf8cSespie attlist9(PROLOG_STATE *state,
9981a3ddf8cSespie          int tok,
9992feb5d2aSbluhm          const char *UNUSED_P(ptr),
10002feb5d2aSbluhm          const char *UNUSED_P(end),
10012feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
10021a3ddf8cSespie {
10031a3ddf8cSespie   switch (tok) {
10041a3ddf8cSespie   case XML_TOK_PROLOG_S:
10051a3ddf8cSespie     return XML_ROLE_ATTLIST_NONE;
10061a3ddf8cSespie   case XML_TOK_LITERAL:
10071a3ddf8cSespie     state->handler = attlist1;
10081a3ddf8cSespie     return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
10091a3ddf8cSespie   }
10101a3ddf8cSespie   return common(state, tok);
10111a3ddf8cSespie }
10121a3ddf8cSespie 
10131a3ddf8cSespie static int PTRCALL
10141a3ddf8cSespie element0(PROLOG_STATE *state,
10151a3ddf8cSespie          int tok,
10162feb5d2aSbluhm          const char *UNUSED_P(ptr),
10172feb5d2aSbluhm          const char *UNUSED_P(end),
10182feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
10191a3ddf8cSespie {
10201a3ddf8cSespie   switch (tok) {
10211a3ddf8cSespie   case XML_TOK_PROLOG_S:
10221a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10231a3ddf8cSespie   case XML_TOK_NAME:
10241a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
10251a3ddf8cSespie     state->handler = element1;
10261a3ddf8cSespie     return XML_ROLE_ELEMENT_NAME;
10271a3ddf8cSespie   }
10281a3ddf8cSespie   return common(state, tok);
10291a3ddf8cSespie }
10301a3ddf8cSespie 
10311a3ddf8cSespie static int PTRCALL
10321a3ddf8cSespie element1(PROLOG_STATE *state,
10331a3ddf8cSespie          int tok,
10341a3ddf8cSespie          const char *ptr,
10351a3ddf8cSespie          const char *end,
10361a3ddf8cSespie          const ENCODING *enc)
10371a3ddf8cSespie {
10381a3ddf8cSespie   switch (tok) {
10391a3ddf8cSespie   case XML_TOK_PROLOG_S:
10401a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10411a3ddf8cSespie   case XML_TOK_NAME:
10421a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
10431a3ddf8cSespie       state->handler = declClose;
10441a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
10451a3ddf8cSespie       return XML_ROLE_CONTENT_EMPTY;
10461a3ddf8cSespie     }
10471a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
10481a3ddf8cSespie       state->handler = declClose;
10491a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
10501a3ddf8cSespie       return XML_ROLE_CONTENT_ANY;
10511a3ddf8cSespie     }
10521a3ddf8cSespie     break;
10531a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
10541a3ddf8cSespie     state->handler = element2;
10551a3ddf8cSespie     state->level = 1;
10561a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
10571a3ddf8cSespie   }
10581a3ddf8cSespie   return common(state, tok);
10591a3ddf8cSespie }
10601a3ddf8cSespie 
10611a3ddf8cSespie static int PTRCALL
10621a3ddf8cSespie element2(PROLOG_STATE *state,
10631a3ddf8cSespie          int tok,
10641a3ddf8cSespie          const char *ptr,
10651a3ddf8cSespie          const char *end,
10661a3ddf8cSespie          const ENCODING *enc)
10671a3ddf8cSespie {
10681a3ddf8cSespie   switch (tok) {
10691a3ddf8cSespie   case XML_TOK_PROLOG_S:
10701a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
10711a3ddf8cSespie   case XML_TOK_POUND_NAME:
10721a3ddf8cSespie     if (XmlNameMatchesAscii(enc,
10731a3ddf8cSespie                             ptr + MIN_BYTES_PER_CHAR(enc),
10741a3ddf8cSespie                             end,
10751a3ddf8cSespie                             KW_PCDATA)) {
10761a3ddf8cSespie       state->handler = element3;
10771a3ddf8cSespie       return XML_ROLE_CONTENT_PCDATA;
10781a3ddf8cSespie     }
10791a3ddf8cSespie     break;
10801a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
10811a3ddf8cSespie     state->level = 2;
10821a3ddf8cSespie     state->handler = element6;
10831a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
10841a3ddf8cSespie   case XML_TOK_NAME:
10851a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
10861a3ddf8cSespie     state->handler = element7;
10871a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
10881a3ddf8cSespie   case XML_TOK_NAME_QUESTION:
10891a3ddf8cSespie     state->handler = element7;
10901a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_OPT;
10911a3ddf8cSespie   case XML_TOK_NAME_ASTERISK:
10921a3ddf8cSespie     state->handler = element7;
10931a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_REP;
10941a3ddf8cSespie   case XML_TOK_NAME_PLUS:
10951a3ddf8cSespie     state->handler = element7;
10961a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_PLUS;
10971a3ddf8cSespie   }
10981a3ddf8cSespie   return common(state, tok);
10991a3ddf8cSespie }
11001a3ddf8cSespie 
11011a3ddf8cSespie static int PTRCALL
11021a3ddf8cSespie element3(PROLOG_STATE *state,
11031a3ddf8cSespie          int tok,
11042feb5d2aSbluhm          const char *UNUSED_P(ptr),
11052feb5d2aSbluhm          const char *UNUSED_P(end),
11062feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
11071a3ddf8cSespie {
11081a3ddf8cSespie   switch (tok) {
11091a3ddf8cSespie   case XML_TOK_PROLOG_S:
11101a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11111a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
11121a3ddf8cSespie     state->handler = declClose;
11131a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
11141a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE;
11151a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
11161a3ddf8cSespie     state->handler = declClose;
11171a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
11181a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
11191a3ddf8cSespie   case XML_TOK_OR:
11201a3ddf8cSespie     state->handler = element4;
11211a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11221a3ddf8cSespie   }
11231a3ddf8cSespie   return common(state, tok);
11241a3ddf8cSespie }
11251a3ddf8cSespie 
11261a3ddf8cSespie static int PTRCALL
11271a3ddf8cSespie element4(PROLOG_STATE *state,
11281a3ddf8cSespie          int tok,
11292feb5d2aSbluhm          const char *UNUSED_P(ptr),
11302feb5d2aSbluhm          const char *UNUSED_P(end),
11312feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
11321a3ddf8cSespie {
11331a3ddf8cSespie   switch (tok) {
11341a3ddf8cSespie   case XML_TOK_PROLOG_S:
11351a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11361a3ddf8cSespie   case XML_TOK_NAME:
11371a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
11381a3ddf8cSespie     state->handler = element5;
11391a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
11401a3ddf8cSespie   }
11411a3ddf8cSespie   return common(state, tok);
11421a3ddf8cSespie }
11431a3ddf8cSespie 
11441a3ddf8cSespie static int PTRCALL
11451a3ddf8cSespie element5(PROLOG_STATE *state,
11461a3ddf8cSespie          int tok,
11472feb5d2aSbluhm          const char *UNUSED_P(ptr),
11482feb5d2aSbluhm          const char *UNUSED_P(end),
11492feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
11501a3ddf8cSespie {
11511a3ddf8cSespie   switch (tok) {
11521a3ddf8cSespie   case XML_TOK_PROLOG_S:
11531a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11541a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
11551a3ddf8cSespie     state->handler = declClose;
11561a3ddf8cSespie     state->role_none = XML_ROLE_ELEMENT_NONE;
11571a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
11581a3ddf8cSespie   case XML_TOK_OR:
11591a3ddf8cSespie     state->handler = element4;
11601a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11611a3ddf8cSespie   }
11621a3ddf8cSespie   return common(state, tok);
11631a3ddf8cSespie }
11641a3ddf8cSespie 
11651a3ddf8cSespie static int PTRCALL
11661a3ddf8cSespie element6(PROLOG_STATE *state,
11671a3ddf8cSespie          int tok,
11682feb5d2aSbluhm          const char *UNUSED_P(ptr),
11692feb5d2aSbluhm          const char *UNUSED_P(end),
11702feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
11711a3ddf8cSespie {
11721a3ddf8cSespie   switch (tok) {
11731a3ddf8cSespie   case XML_TOK_PROLOG_S:
11741a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
11751a3ddf8cSespie   case XML_TOK_OPEN_PAREN:
11761a3ddf8cSespie     state->level += 1;
11771a3ddf8cSespie     return XML_ROLE_GROUP_OPEN;
11781a3ddf8cSespie   case XML_TOK_NAME:
11791a3ddf8cSespie   case XML_TOK_PREFIXED_NAME:
11801a3ddf8cSespie     state->handler = element7;
11811a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT;
11821a3ddf8cSespie   case XML_TOK_NAME_QUESTION:
11831a3ddf8cSespie     state->handler = element7;
11841a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_OPT;
11851a3ddf8cSespie   case XML_TOK_NAME_ASTERISK:
11861a3ddf8cSespie     state->handler = element7;
11871a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_REP;
11881a3ddf8cSespie   case XML_TOK_NAME_PLUS:
11891a3ddf8cSespie     state->handler = element7;
11901a3ddf8cSespie     return XML_ROLE_CONTENT_ELEMENT_PLUS;
11911a3ddf8cSespie   }
11921a3ddf8cSespie   return common(state, tok);
11931a3ddf8cSespie }
11941a3ddf8cSespie 
11951a3ddf8cSespie static int PTRCALL
11961a3ddf8cSespie element7(PROLOG_STATE *state,
11971a3ddf8cSespie          int tok,
11982feb5d2aSbluhm          const char *UNUSED_P(ptr),
11992feb5d2aSbluhm          const char *UNUSED_P(end),
12002feb5d2aSbluhm          const ENCODING *UNUSED_P(enc))
12011a3ddf8cSespie {
12021a3ddf8cSespie   switch (tok) {
12031a3ddf8cSespie   case XML_TOK_PROLOG_S:
12041a3ddf8cSespie     return XML_ROLE_ELEMENT_NONE;
12051a3ddf8cSespie   case XML_TOK_CLOSE_PAREN:
12061a3ddf8cSespie     state->level -= 1;
12071a3ddf8cSespie     if (state->level == 0) {
12081a3ddf8cSespie       state->handler = declClose;
12091a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
12101a3ddf8cSespie     }
12111a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE;
12121a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_ASTERISK:
12131a3ddf8cSespie     state->level -= 1;
12141a3ddf8cSespie     if (state->level == 0) {
12151a3ddf8cSespie       state->handler = declClose;
12161a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
12171a3ddf8cSespie     }
12181a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_REP;
12191a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_QUESTION:
12201a3ddf8cSespie     state->level -= 1;
12211a3ddf8cSespie     if (state->level == 0) {
12221a3ddf8cSespie       state->handler = declClose;
12231a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
12241a3ddf8cSespie     }
12251a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_OPT;
12261a3ddf8cSespie   case XML_TOK_CLOSE_PAREN_PLUS:
12271a3ddf8cSespie     state->level -= 1;
12281a3ddf8cSespie     if (state->level == 0) {
12291a3ddf8cSespie       state->handler = declClose;
12301a3ddf8cSespie       state->role_none = XML_ROLE_ELEMENT_NONE;
12311a3ddf8cSespie     }
12321a3ddf8cSespie     return XML_ROLE_GROUP_CLOSE_PLUS;
12331a3ddf8cSespie   case XML_TOK_COMMA:
12341a3ddf8cSespie     state->handler = element6;
12351a3ddf8cSespie     return XML_ROLE_GROUP_SEQUENCE;
12361a3ddf8cSespie   case XML_TOK_OR:
12371a3ddf8cSespie     state->handler = element6;
12381a3ddf8cSespie     return XML_ROLE_GROUP_CHOICE;
12391a3ddf8cSespie   }
12401a3ddf8cSespie   return common(state, tok);
12411a3ddf8cSespie }
12421a3ddf8cSespie 
12431a3ddf8cSespie #ifdef XML_DTD
12441a3ddf8cSespie 
12451a3ddf8cSespie static int PTRCALL
12461a3ddf8cSespie condSect0(PROLOG_STATE *state,
12471a3ddf8cSespie           int tok,
12481a3ddf8cSespie           const char *ptr,
12491a3ddf8cSespie           const char *end,
12501a3ddf8cSespie           const ENCODING *enc)
12511a3ddf8cSespie {
12521a3ddf8cSespie   switch (tok) {
12531a3ddf8cSespie   case XML_TOK_PROLOG_S:
12541a3ddf8cSespie     return XML_ROLE_NONE;
12551a3ddf8cSespie   case XML_TOK_NAME:
12561a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
12571a3ddf8cSespie       state->handler = condSect1;
12581a3ddf8cSespie       return XML_ROLE_NONE;
12591a3ddf8cSespie     }
12601a3ddf8cSespie     if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
12611a3ddf8cSespie       state->handler = condSect2;
12621a3ddf8cSespie       return XML_ROLE_NONE;
12631a3ddf8cSespie     }
12641a3ddf8cSespie     break;
12651a3ddf8cSespie   }
12661a3ddf8cSespie   return common(state, tok);
12671a3ddf8cSespie }
12681a3ddf8cSespie 
12691a3ddf8cSespie static int PTRCALL
12701a3ddf8cSespie condSect1(PROLOG_STATE *state,
12711a3ddf8cSespie           int tok,
12722feb5d2aSbluhm           const char *UNUSED_P(ptr),
12732feb5d2aSbluhm           const char *UNUSED_P(end),
12742feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
12751a3ddf8cSespie {
12761a3ddf8cSespie   switch (tok) {
12771a3ddf8cSespie   case XML_TOK_PROLOG_S:
12781a3ddf8cSespie     return XML_ROLE_NONE;
12791a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
12801a3ddf8cSespie     state->handler = externalSubset1;
12811a3ddf8cSespie     state->includeLevel += 1;
12821a3ddf8cSespie     return XML_ROLE_NONE;
12831a3ddf8cSespie   }
12841a3ddf8cSespie   return common(state, tok);
12851a3ddf8cSespie }
12861a3ddf8cSespie 
12871a3ddf8cSespie static int PTRCALL
12881a3ddf8cSespie condSect2(PROLOG_STATE *state,
12891a3ddf8cSespie           int tok,
12902feb5d2aSbluhm           const char *UNUSED_P(ptr),
12912feb5d2aSbluhm           const char *UNUSED_P(end),
12922feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
12931a3ddf8cSespie {
12941a3ddf8cSespie   switch (tok) {
12951a3ddf8cSespie   case XML_TOK_PROLOG_S:
12961a3ddf8cSespie     return XML_ROLE_NONE;
12971a3ddf8cSespie   case XML_TOK_OPEN_BRACKET:
12981a3ddf8cSespie     state->handler = externalSubset1;
12991a3ddf8cSespie     return XML_ROLE_IGNORE_SECT;
13001a3ddf8cSespie   }
13011a3ddf8cSespie   return common(state, tok);
13021a3ddf8cSespie }
13031a3ddf8cSespie 
13041a3ddf8cSespie #endif /* XML_DTD */
13051a3ddf8cSespie 
13061a3ddf8cSespie static int PTRCALL
13071a3ddf8cSespie declClose(PROLOG_STATE *state,
13081a3ddf8cSespie           int tok,
13092feb5d2aSbluhm           const char *UNUSED_P(ptr),
13102feb5d2aSbluhm           const char *UNUSED_P(end),
13112feb5d2aSbluhm           const ENCODING *UNUSED_P(enc))
13121a3ddf8cSespie {
13131a3ddf8cSespie   switch (tok) {
13141a3ddf8cSespie   case XML_TOK_PROLOG_S:
13151a3ddf8cSespie     return state->role_none;
13161a3ddf8cSespie   case XML_TOK_DECL_CLOSE:
13171a3ddf8cSespie     setTopLevel(state);
13181a3ddf8cSespie     return state->role_none;
13191a3ddf8cSespie   }
13201a3ddf8cSespie   return common(state, tok);
13211a3ddf8cSespie }
13221a3ddf8cSespie 
13235837d4fcSbluhm /* This function will only be invoked if the internal logic of the
13245837d4fcSbluhm  * parser has broken down.  It is used in two cases:
13255837d4fcSbluhm  *
13265837d4fcSbluhm  * 1: When the XML prolog has been finished.  At this point the
13275837d4fcSbluhm  * processor (the parser level above these role handlers) should
13285837d4fcSbluhm  * switch from prologProcessor to contentProcessor and reinitialise
13295837d4fcSbluhm  * the handler function.
13305837d4fcSbluhm  *
13315837d4fcSbluhm  * 2: When an error has been detected (via common() below).  At this
13325837d4fcSbluhm  * point again the processor should be switched to errorProcessor,
13335837d4fcSbluhm  * which will never call a handler.
13345837d4fcSbluhm  *
13355837d4fcSbluhm  * The result of this is that error() can only be called if the
13365837d4fcSbluhm  * processor switch failed to happen, which is an internal error and
13375837d4fcSbluhm  * therefore we shouldn't be able to provoke it simply by using the
13385837d4fcSbluhm  * library.  It is a necessary backstop, however, so we merely exclude
13395837d4fcSbluhm  * it from the coverage statistics.
13405837d4fcSbluhm  *
13415837d4fcSbluhm  * LCOV_EXCL_START
13425837d4fcSbluhm  */
13431a3ddf8cSespie static int PTRCALL
13442feb5d2aSbluhm error(PROLOG_STATE *UNUSED_P(state),
13452feb5d2aSbluhm       int UNUSED_P(tok),
13462feb5d2aSbluhm       const char *UNUSED_P(ptr),
13472feb5d2aSbluhm       const char *UNUSED_P(end),
13482feb5d2aSbluhm       const ENCODING *UNUSED_P(enc))
13491a3ddf8cSespie {
13501a3ddf8cSespie   return XML_ROLE_NONE;
13511a3ddf8cSespie }
13525837d4fcSbluhm /* LCOV_EXCL_STOP */
13531a3ddf8cSespie 
13541a3ddf8cSespie static int FASTCALL
13551a3ddf8cSespie common(PROLOG_STATE *state, int tok)
13561a3ddf8cSespie {
13571a3ddf8cSespie #ifdef XML_DTD
13581a3ddf8cSespie   if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
13591a3ddf8cSespie     return XML_ROLE_INNER_PARAM_ENTITY_REF;
13601a3ddf8cSespie #endif
13611a3ddf8cSespie   state->handler = error;
13621a3ddf8cSespie   return XML_ROLE_ERROR;
13631a3ddf8cSespie }
13641a3ddf8cSespie 
13651a3ddf8cSespie void
13661a3ddf8cSespie XmlPrologStateInit(PROLOG_STATE *state)
13671a3ddf8cSespie {
13681a3ddf8cSespie   state->handler = prolog0;
13691a3ddf8cSespie #ifdef XML_DTD
13701a3ddf8cSespie   state->documentEntity = 1;
13711a3ddf8cSespie   state->includeLevel = 0;
13721a3ddf8cSespie   state->inEntityValue = 0;
13731a3ddf8cSespie #endif /* XML_DTD */
13741a3ddf8cSespie }
13751a3ddf8cSespie 
13761a3ddf8cSespie #ifdef XML_DTD
13771a3ddf8cSespie 
13781a3ddf8cSespie void
13791a3ddf8cSespie XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
13801a3ddf8cSespie {
13811a3ddf8cSespie   state->handler = externalSubset0;
13821a3ddf8cSespie   state->documentEntity = 0;
13831a3ddf8cSespie   state->includeLevel = 0;
13841a3ddf8cSespie }
13851a3ddf8cSespie 
13861a3ddf8cSespie #endif /* XML_DTD */
1387