xref: /freebsd/contrib/expat/lib/xmlrole.c (revision 4543ef516683042d46f3bd3bb8a4f3f746e00499)
10a48773fSEric van Gyzen /*
20a48773fSEric van Gyzen                             __  __            _
30a48773fSEric van Gyzen                          ___\ \/ /_ __   __ _| |_
40a48773fSEric van Gyzen                         / _ \\  /| '_ \ / _` | __|
50a48773fSEric van Gyzen                        |  __//  \| |_) | (_| | |_
60a48773fSEric van Gyzen                         \___/_/\_\ .__/ \__,_|\__|
70a48773fSEric van Gyzen                                  |_| XML parser
80a48773fSEric van Gyzen 
90a48773fSEric van Gyzen    Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
10cc68614dSXin LI    Copyright (c) 2000      Clark Cooper <coopercc@users.sourceforge.net>
11cc68614dSXin LI    Copyright (c) 2002      Greg Stein <gstein@users.sourceforge.net>
12cc68614dSXin LI    Copyright (c) 2002-2006 Karl Waclawek <karl@waclawek.net>
13cc68614dSXin LI    Copyright (c) 2002-2003 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
14ac69e5d4SEric van Gyzen    Copyright (c) 2005-2009 Steven Solie <steven@solie.ca>
15*4543ef51SXin LI    Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
16cc68614dSXin LI    Copyright (c) 2017      Rhodri James <rhodri@wildebeest.org.uk>
17cc68614dSXin LI    Copyright (c) 2019      David Loffredo <loffredo@steptools.com>
18*4543ef51SXin LI    Copyright (c) 2021      Donghee Na <donghee.na@python.org>
190a48773fSEric van Gyzen    Licensed under the MIT license:
200a48773fSEric van Gyzen 
210a48773fSEric van Gyzen    Permission is  hereby granted,  free of charge,  to any  person obtaining
220a48773fSEric van Gyzen    a  copy  of  this  software   and  associated  documentation  files  (the
230a48773fSEric van Gyzen    "Software"),  to  deal in  the  Software  without restriction,  including
240a48773fSEric van Gyzen    without  limitation the  rights  to use,  copy,  modify, merge,  publish,
250a48773fSEric van Gyzen    distribute, sublicense, and/or sell copies of the Software, and to permit
260a48773fSEric van Gyzen    persons  to whom  the Software  is  furnished to  do so,  subject to  the
270a48773fSEric van Gyzen    following conditions:
280a48773fSEric van Gyzen 
290a48773fSEric van Gyzen    The above copyright  notice and this permission notice  shall be included
300a48773fSEric van Gyzen    in all copies or substantial portions of the Software.
310a48773fSEric van Gyzen 
320a48773fSEric van Gyzen    THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
330a48773fSEric van Gyzen    EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
340a48773fSEric van Gyzen    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
350a48773fSEric van Gyzen    NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
360a48773fSEric van Gyzen    DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
370a48773fSEric van Gyzen    OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
380a48773fSEric van Gyzen    USE OR OTHER DEALINGS IN THE SOFTWARE.
395bb6a25fSPoul-Henning Kamp */
405bb6a25fSPoul-Henning Kamp 
41*4543ef51SXin LI #include "expat_config.h"
42cc68614dSXin LI 
43220ed979SColeman Kane #include <stddef.h>
44220ed979SColeman Kane 
450a48773fSEric van Gyzen #ifdef _WIN32
465bb6a25fSPoul-Henning Kamp #  include "winconfig.h"
47220ed979SColeman Kane #endif
485bb6a25fSPoul-Henning Kamp 
49220ed979SColeman Kane #include "expat_external.h"
505bb6a25fSPoul-Henning Kamp #include "internal.h"
515bb6a25fSPoul-Henning Kamp #include "xmlrole.h"
525bb6a25fSPoul-Henning Kamp #include "ascii.h"
535bb6a25fSPoul-Henning Kamp 
545bb6a25fSPoul-Henning Kamp /* Doesn't check:
555bb6a25fSPoul-Henning Kamp 
565bb6a25fSPoul-Henning Kamp  that ,| are not mixed in a model group
575bb6a25fSPoul-Henning Kamp  content of literals
585bb6a25fSPoul-Henning Kamp 
595bb6a25fSPoul-Henning Kamp */
605bb6a25fSPoul-Henning Kamp 
616b2c1e49SXin LI static const char KW_ANY[] = {ASCII_A, ASCII_N, ASCII_Y, '\0'};
626b2c1e49SXin LI static const char KW_ATTLIST[]
636b2c1e49SXin LI     = {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'};
646b2c1e49SXin LI static const char KW_CDATA[]
656b2c1e49SXin LI     = {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
666b2c1e49SXin LI static const char KW_DOCTYPE[]
676b2c1e49SXin LI     = {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'};
686b2c1e49SXin LI static const char KW_ELEMENT[]
696b2c1e49SXin LI     = {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'};
706b2c1e49SXin LI static const char KW_EMPTY[]
716b2c1e49SXin LI     = {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'};
726b2c1e49SXin LI static const char KW_ENTITIES[] = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T,
736b2c1e49SXin LI                                    ASCII_I, ASCII_E, ASCII_S, '\0'};
746b2c1e49SXin LI static const char KW_ENTITY[]
756b2c1e49SXin LI     = {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'};
766b2c1e49SXin LI static const char KW_FIXED[]
776b2c1e49SXin LI     = {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'};
786b2c1e49SXin LI static const char KW_ID[] = {ASCII_I, ASCII_D, '\0'};
796b2c1e49SXin LI static const char KW_IDREF[]
806b2c1e49SXin LI     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'};
816b2c1e49SXin LI static const char KW_IDREFS[]
826b2c1e49SXin LI     = {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'};
83220ed979SColeman Kane #ifdef XML_DTD
846b2c1e49SXin LI static const char KW_IGNORE[]
856b2c1e49SXin LI     = {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'};
86220ed979SColeman Kane #endif
876b2c1e49SXin LI static const char KW_IMPLIED[]
886b2c1e49SXin LI     = {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'};
89220ed979SColeman Kane #ifdef XML_DTD
906b2c1e49SXin LI static const char KW_INCLUDE[]
916b2c1e49SXin LI     = {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'};
92220ed979SColeman Kane #endif
936b2c1e49SXin LI static const char KW_NDATA[]
946b2c1e49SXin LI     = {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
956b2c1e49SXin LI static const char KW_NMTOKEN[]
966b2c1e49SXin LI     = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'};
976b2c1e49SXin LI static const char KW_NMTOKENS[] = {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K,
986b2c1e49SXin LI                                    ASCII_E, ASCII_N, ASCII_S, '\0'};
996b2c1e49SXin LI static const char KW_NOTATION[] = {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T,
1006b2c1e49SXin LI                                    ASCII_I, ASCII_O, ASCII_N, '\0'};
1016b2c1e49SXin LI static const char KW_PCDATA[]
1026b2c1e49SXin LI     = {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'};
1036b2c1e49SXin LI static const char KW_PUBLIC[]
1046b2c1e49SXin LI     = {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'};
1056b2c1e49SXin LI static const char KW_REQUIRED[] = {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I,
1066b2c1e49SXin LI                                    ASCII_R, ASCII_E, ASCII_D, '\0'};
1076b2c1e49SXin LI static const char KW_SYSTEM[]
1086b2c1e49SXin LI     = {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'};
1095bb6a25fSPoul-Henning Kamp 
1105bb6a25fSPoul-Henning Kamp #ifndef MIN_BYTES_PER_CHAR
1115bb6a25fSPoul-Henning Kamp #  define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
1125bb6a25fSPoul-Henning Kamp #endif
1135bb6a25fSPoul-Henning Kamp 
1145bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
1155bb6a25fSPoul-Henning Kamp #  define setTopLevel(state)                                                   \
1166b2c1e49SXin LI     ((state)->handler                                                          \
1176b2c1e49SXin LI      = ((state)->documentEntity ? internalSubset : externalSubset1))
1185bb6a25fSPoul-Henning Kamp #else /* not XML_DTD */
1195bb6a25fSPoul-Henning Kamp #  define setTopLevel(state) ((state)->handler = internalSubset)
1205bb6a25fSPoul-Henning Kamp #endif /* not XML_DTD */
1215bb6a25fSPoul-Henning Kamp 
1226b2c1e49SXin LI typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, int tok,
1236b2c1e49SXin LI                                    const char *ptr, const char *end,
1245bb6a25fSPoul-Henning Kamp                                    const ENCODING *enc);
1255bb6a25fSPoul-Henning Kamp 
1266b2c1e49SXin LI static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2,
1276b2c1e49SXin LI     doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2,
1286b2c1e49SXin LI     entity3, entity4, entity5, entity6, entity7, entity8, entity9, entity10,
1296b2c1e49SXin LI     notation0, notation1, notation2, notation3, notation4, attlist0, attlist1,
1306b2c1e49SXin LI     attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8,
1316b2c1e49SXin LI     attlist9, element0, element1, element2, element3, element4, element5,
1326b2c1e49SXin LI     element6, element7,
1335bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
1346b2c1e49SXin LI     externalSubset0, externalSubset1, condSect0, condSect1, condSect2,
1355bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */
1366b2c1e49SXin LI     declClose, error;
1375bb6a25fSPoul-Henning Kamp 
1385bb6a25fSPoul-Henning Kamp static int FASTCALL common(PROLOG_STATE *state, int tok);
1395bb6a25fSPoul-Henning Kamp 
140220ed979SColeman Kane static int PTRCALL
prolog0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)1416b2c1e49SXin LI prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1426b2c1e49SXin LI         const ENCODING *enc) {
1435bb6a25fSPoul-Henning Kamp   switch (tok) {
1445bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
1455bb6a25fSPoul-Henning Kamp     state->handler = prolog1;
1465bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
1475bb6a25fSPoul-Henning Kamp   case XML_TOK_XML_DECL:
1485bb6a25fSPoul-Henning Kamp     state->handler = prolog1;
1495bb6a25fSPoul-Henning Kamp     return XML_ROLE_XML_DECL;
1505bb6a25fSPoul-Henning Kamp   case XML_TOK_PI:
1515bb6a25fSPoul-Henning Kamp     state->handler = prolog1;
1525bb6a25fSPoul-Henning Kamp     return XML_ROLE_PI;
1535bb6a25fSPoul-Henning Kamp   case XML_TOK_COMMENT:
1545bb6a25fSPoul-Henning Kamp     state->handler = prolog1;
1555bb6a25fSPoul-Henning Kamp     return XML_ROLE_COMMENT;
1565bb6a25fSPoul-Henning Kamp   case XML_TOK_BOM:
1575bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
1585bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_OPEN:
1596b2c1e49SXin LI     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
1605bb6a25fSPoul-Henning Kamp                               KW_DOCTYPE))
1615bb6a25fSPoul-Henning Kamp       break;
1625bb6a25fSPoul-Henning Kamp     state->handler = doctype0;
1635bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
1645bb6a25fSPoul-Henning Kamp   case XML_TOK_INSTANCE_START:
1655bb6a25fSPoul-Henning Kamp     state->handler = error;
1665bb6a25fSPoul-Henning Kamp     return XML_ROLE_INSTANCE_START;
1675bb6a25fSPoul-Henning Kamp   }
1685bb6a25fSPoul-Henning Kamp   return common(state, tok);
1695bb6a25fSPoul-Henning Kamp }
1705bb6a25fSPoul-Henning Kamp 
171220ed979SColeman Kane static int PTRCALL
prolog1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)1726b2c1e49SXin LI prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
1736b2c1e49SXin LI         const ENCODING *enc) {
1745bb6a25fSPoul-Henning Kamp   switch (tok) {
1755bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
1765bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
1775bb6a25fSPoul-Henning Kamp   case XML_TOK_PI:
1785bb6a25fSPoul-Henning Kamp     return XML_ROLE_PI;
1795bb6a25fSPoul-Henning Kamp   case XML_TOK_COMMENT:
1805bb6a25fSPoul-Henning Kamp     return XML_ROLE_COMMENT;
1815bb6a25fSPoul-Henning Kamp   case XML_TOK_BOM:
1820a48773fSEric van Gyzen     /* This case can never arise.  To reach this role function, the
1830a48773fSEric van Gyzen      * parse must have passed through prolog0 and therefore have had
1840a48773fSEric van Gyzen      * some form of input, even if only a space.  At that point, a
1850a48773fSEric van Gyzen      * byte order mark is no longer a valid character (though
1860a48773fSEric van Gyzen      * technically it should be interpreted as a non-breaking space),
1870a48773fSEric van Gyzen      * so will be rejected by the tokenizing stages.
1880a48773fSEric van Gyzen      */
1890a48773fSEric van Gyzen     return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
1905bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_OPEN:
1916b2c1e49SXin LI     if (! XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
1925bb6a25fSPoul-Henning Kamp                               KW_DOCTYPE))
1935bb6a25fSPoul-Henning Kamp       break;
1945bb6a25fSPoul-Henning Kamp     state->handler = doctype0;
1955bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
1965bb6a25fSPoul-Henning Kamp   case XML_TOK_INSTANCE_START:
1975bb6a25fSPoul-Henning Kamp     state->handler = error;
1985bb6a25fSPoul-Henning Kamp     return XML_ROLE_INSTANCE_START;
1995bb6a25fSPoul-Henning Kamp   }
2005bb6a25fSPoul-Henning Kamp   return common(state, tok);
2015bb6a25fSPoul-Henning Kamp }
2025bb6a25fSPoul-Henning Kamp 
203220ed979SColeman Kane static int PTRCALL
prolog2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2046b2c1e49SXin LI prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2056b2c1e49SXin LI         const ENCODING *enc) {
2066b2c1e49SXin LI   UNUSED_P(ptr);
2076b2c1e49SXin LI   UNUSED_P(end);
2086b2c1e49SXin LI   UNUSED_P(enc);
2095bb6a25fSPoul-Henning Kamp   switch (tok) {
2105bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
2115bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
2125bb6a25fSPoul-Henning Kamp   case XML_TOK_PI:
2135bb6a25fSPoul-Henning Kamp     return XML_ROLE_PI;
2145bb6a25fSPoul-Henning Kamp   case XML_TOK_COMMENT:
2155bb6a25fSPoul-Henning Kamp     return XML_ROLE_COMMENT;
2165bb6a25fSPoul-Henning Kamp   case XML_TOK_INSTANCE_START:
2175bb6a25fSPoul-Henning Kamp     state->handler = error;
2185bb6a25fSPoul-Henning Kamp     return XML_ROLE_INSTANCE_START;
2195bb6a25fSPoul-Henning Kamp   }
2205bb6a25fSPoul-Henning Kamp   return common(state, tok);
2215bb6a25fSPoul-Henning Kamp }
2225bb6a25fSPoul-Henning Kamp 
223220ed979SColeman Kane static int PTRCALL
doctype0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2246b2c1e49SXin LI doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2256b2c1e49SXin LI          const ENCODING *enc) {
2266b2c1e49SXin LI   UNUSED_P(ptr);
2276b2c1e49SXin LI   UNUSED_P(end);
2286b2c1e49SXin LI   UNUSED_P(enc);
2295bb6a25fSPoul-Henning Kamp   switch (tok) {
2305bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
2315bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
2325bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
2335bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
2345bb6a25fSPoul-Henning Kamp     state->handler = doctype1;
2355bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NAME;
2365bb6a25fSPoul-Henning Kamp   }
2375bb6a25fSPoul-Henning Kamp   return common(state, tok);
2385bb6a25fSPoul-Henning Kamp }
2395bb6a25fSPoul-Henning Kamp 
240220ed979SColeman Kane static int PTRCALL
doctype1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2416b2c1e49SXin LI doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2426b2c1e49SXin LI          const ENCODING *enc) {
2435bb6a25fSPoul-Henning Kamp   switch (tok) {
2445bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
2455bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
2465bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_BRACKET:
2475bb6a25fSPoul-Henning Kamp     state->handler = internalSubset;
2485bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
2495bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
2505bb6a25fSPoul-Henning Kamp     state->handler = prolog2;
2515bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_CLOSE;
2525bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
2535bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
2545bb6a25fSPoul-Henning Kamp       state->handler = doctype3;
2555bb6a25fSPoul-Henning Kamp       return XML_ROLE_DOCTYPE_NONE;
2565bb6a25fSPoul-Henning Kamp     }
2575bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
2585bb6a25fSPoul-Henning Kamp       state->handler = doctype2;
2595bb6a25fSPoul-Henning Kamp       return XML_ROLE_DOCTYPE_NONE;
2605bb6a25fSPoul-Henning Kamp     }
2615bb6a25fSPoul-Henning Kamp     break;
2625bb6a25fSPoul-Henning Kamp   }
2635bb6a25fSPoul-Henning Kamp   return common(state, tok);
2645bb6a25fSPoul-Henning Kamp }
2655bb6a25fSPoul-Henning Kamp 
266220ed979SColeman Kane static int PTRCALL
doctype2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2676b2c1e49SXin LI doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2686b2c1e49SXin LI          const ENCODING *enc) {
2696b2c1e49SXin LI   UNUSED_P(ptr);
2706b2c1e49SXin LI   UNUSED_P(end);
2716b2c1e49SXin LI   UNUSED_P(enc);
2725bb6a25fSPoul-Henning Kamp   switch (tok) {
2735bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
2745bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
2755bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
2765bb6a25fSPoul-Henning Kamp     state->handler = doctype3;
2775bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_PUBLIC_ID;
2785bb6a25fSPoul-Henning Kamp   }
2795bb6a25fSPoul-Henning Kamp   return common(state, tok);
2805bb6a25fSPoul-Henning Kamp }
2815bb6a25fSPoul-Henning Kamp 
282220ed979SColeman Kane static int PTRCALL
doctype3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2836b2c1e49SXin LI doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
2846b2c1e49SXin LI          const ENCODING *enc) {
2856b2c1e49SXin LI   UNUSED_P(ptr);
2866b2c1e49SXin LI   UNUSED_P(end);
2876b2c1e49SXin LI   UNUSED_P(enc);
2885bb6a25fSPoul-Henning Kamp   switch (tok) {
2895bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
2905bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
2915bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
2925bb6a25fSPoul-Henning Kamp     state->handler = doctype4;
2935bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_SYSTEM_ID;
2945bb6a25fSPoul-Henning Kamp   }
2955bb6a25fSPoul-Henning Kamp   return common(state, tok);
2965bb6a25fSPoul-Henning Kamp }
2975bb6a25fSPoul-Henning Kamp 
298220ed979SColeman Kane static int PTRCALL
doctype4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)2996b2c1e49SXin LI doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3006b2c1e49SXin LI          const ENCODING *enc) {
3016b2c1e49SXin LI   UNUSED_P(ptr);
3026b2c1e49SXin LI   UNUSED_P(end);
3036b2c1e49SXin LI   UNUSED_P(enc);
3045bb6a25fSPoul-Henning Kamp   switch (tok) {
3055bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
3065bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
3075bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_BRACKET:
3085bb6a25fSPoul-Henning Kamp     state->handler = internalSubset;
3095bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
3105bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
3115bb6a25fSPoul-Henning Kamp     state->handler = prolog2;
3125bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_CLOSE;
3135bb6a25fSPoul-Henning Kamp   }
3145bb6a25fSPoul-Henning Kamp   return common(state, tok);
3155bb6a25fSPoul-Henning Kamp }
3165bb6a25fSPoul-Henning Kamp 
317220ed979SColeman Kane static int PTRCALL
doctype5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3186b2c1e49SXin LI doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3196b2c1e49SXin LI          const ENCODING *enc) {
3206b2c1e49SXin LI   UNUSED_P(ptr);
3216b2c1e49SXin LI   UNUSED_P(end);
3226b2c1e49SXin LI   UNUSED_P(enc);
3235bb6a25fSPoul-Henning Kamp   switch (tok) {
3245bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
3255bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
3265bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
3275bb6a25fSPoul-Henning Kamp     state->handler = prolog2;
3285bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_CLOSE;
3295bb6a25fSPoul-Henning Kamp   }
3305bb6a25fSPoul-Henning Kamp   return common(state, tok);
3315bb6a25fSPoul-Henning Kamp }
3325bb6a25fSPoul-Henning Kamp 
333220ed979SColeman Kane static int PTRCALL
internalSubset(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3346b2c1e49SXin LI internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3356b2c1e49SXin LI                const ENCODING *enc) {
3365bb6a25fSPoul-Henning Kamp   switch (tok) {
3375bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
3385bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
3395bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_OPEN:
3406b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3415bb6a25fSPoul-Henning Kamp                             KW_ENTITY)) {
3425bb6a25fSPoul-Henning Kamp       state->handler = entity0;
3435bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
3445bb6a25fSPoul-Henning Kamp     }
3456b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3465bb6a25fSPoul-Henning Kamp                             KW_ATTLIST)) {
3475bb6a25fSPoul-Henning Kamp       state->handler = attlist0;
3485bb6a25fSPoul-Henning Kamp       return XML_ROLE_ATTLIST_NONE;
3495bb6a25fSPoul-Henning Kamp     }
3506b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3515bb6a25fSPoul-Henning Kamp                             KW_ELEMENT)) {
3525bb6a25fSPoul-Henning Kamp       state->handler = element0;
3535bb6a25fSPoul-Henning Kamp       return XML_ROLE_ELEMENT_NONE;
3545bb6a25fSPoul-Henning Kamp     }
3556b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end,
3565bb6a25fSPoul-Henning Kamp                             KW_NOTATION)) {
3575bb6a25fSPoul-Henning Kamp       state->handler = notation0;
3585bb6a25fSPoul-Henning Kamp       return XML_ROLE_NOTATION_NONE;
3595bb6a25fSPoul-Henning Kamp     }
3605bb6a25fSPoul-Henning Kamp     break;
3615bb6a25fSPoul-Henning Kamp   case XML_TOK_PI:
3625bb6a25fSPoul-Henning Kamp     return XML_ROLE_PI;
3635bb6a25fSPoul-Henning Kamp   case XML_TOK_COMMENT:
3645bb6a25fSPoul-Henning Kamp     return XML_ROLE_COMMENT;
3655bb6a25fSPoul-Henning Kamp   case XML_TOK_PARAM_ENTITY_REF:
3665bb6a25fSPoul-Henning Kamp     return XML_ROLE_PARAM_ENTITY_REF;
3675bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_BRACKET:
3685bb6a25fSPoul-Henning Kamp     state->handler = doctype5;
3695bb6a25fSPoul-Henning Kamp     return XML_ROLE_DOCTYPE_NONE;
370220ed979SColeman Kane   case XML_TOK_NONE:
371220ed979SColeman Kane     return XML_ROLE_NONE;
3725bb6a25fSPoul-Henning Kamp   }
3735bb6a25fSPoul-Henning Kamp   return common(state, tok);
3745bb6a25fSPoul-Henning Kamp }
3755bb6a25fSPoul-Henning Kamp 
3765bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
3775bb6a25fSPoul-Henning Kamp 
378220ed979SColeman Kane static int PTRCALL
externalSubset0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3796b2c1e49SXin LI externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3806b2c1e49SXin LI                 const ENCODING *enc) {
3815bb6a25fSPoul-Henning Kamp   state->handler = externalSubset1;
3825bb6a25fSPoul-Henning Kamp   if (tok == XML_TOK_XML_DECL)
3835bb6a25fSPoul-Henning Kamp     return XML_ROLE_TEXT_DECL;
3845bb6a25fSPoul-Henning Kamp   return externalSubset1(state, tok, ptr, end, enc);
3855bb6a25fSPoul-Henning Kamp }
3865bb6a25fSPoul-Henning Kamp 
387220ed979SColeman Kane static int PTRCALL
externalSubset1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)3886b2c1e49SXin LI externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
3896b2c1e49SXin LI                 const ENCODING *enc) {
3905bb6a25fSPoul-Henning Kamp   switch (tok) {
3915bb6a25fSPoul-Henning Kamp   case XML_TOK_COND_SECT_OPEN:
3925bb6a25fSPoul-Henning Kamp     state->handler = condSect0;
3935bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
3945bb6a25fSPoul-Henning Kamp   case XML_TOK_COND_SECT_CLOSE:
3955bb6a25fSPoul-Henning Kamp     if (state->includeLevel == 0)
3965bb6a25fSPoul-Henning Kamp       break;
3975bb6a25fSPoul-Henning Kamp     state->includeLevel -= 1;
3985bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
3995bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4005bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
4015bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_BRACKET:
4025bb6a25fSPoul-Henning Kamp     break;
4035bb6a25fSPoul-Henning Kamp   case XML_TOK_NONE:
4045bb6a25fSPoul-Henning Kamp     if (state->includeLevel)
4055bb6a25fSPoul-Henning Kamp       break;
4065bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
4075bb6a25fSPoul-Henning Kamp   default:
4085bb6a25fSPoul-Henning Kamp     return internalSubset(state, tok, ptr, end, enc);
4095bb6a25fSPoul-Henning Kamp   }
4105bb6a25fSPoul-Henning Kamp   return common(state, tok);
4115bb6a25fSPoul-Henning Kamp }
4125bb6a25fSPoul-Henning Kamp 
4135bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */
4145bb6a25fSPoul-Henning Kamp 
415220ed979SColeman Kane static int PTRCALL
entity0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4166b2c1e49SXin LI entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4176b2c1e49SXin LI         const ENCODING *enc) {
4186b2c1e49SXin LI   UNUSED_P(ptr);
4196b2c1e49SXin LI   UNUSED_P(end);
4206b2c1e49SXin LI   UNUSED_P(enc);
4215bb6a25fSPoul-Henning Kamp   switch (tok) {
4225bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4235bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4245bb6a25fSPoul-Henning Kamp   case XML_TOK_PERCENT:
4255bb6a25fSPoul-Henning Kamp     state->handler = entity1;
4265bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4275bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
4285bb6a25fSPoul-Henning Kamp     state->handler = entity2;
4295bb6a25fSPoul-Henning Kamp     return XML_ROLE_GENERAL_ENTITY_NAME;
4305bb6a25fSPoul-Henning Kamp   }
4315bb6a25fSPoul-Henning Kamp   return common(state, tok);
4325bb6a25fSPoul-Henning Kamp }
4335bb6a25fSPoul-Henning Kamp 
434220ed979SColeman Kane static int PTRCALL
entity1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4356b2c1e49SXin LI entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4366b2c1e49SXin LI         const ENCODING *enc) {
4376b2c1e49SXin LI   UNUSED_P(ptr);
4386b2c1e49SXin LI   UNUSED_P(end);
4396b2c1e49SXin LI   UNUSED_P(enc);
4405bb6a25fSPoul-Henning Kamp   switch (tok) {
4415bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4425bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4435bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
4445bb6a25fSPoul-Henning Kamp     state->handler = entity7;
4455bb6a25fSPoul-Henning Kamp     return XML_ROLE_PARAM_ENTITY_NAME;
4465bb6a25fSPoul-Henning Kamp   }
4475bb6a25fSPoul-Henning Kamp   return common(state, tok);
4485bb6a25fSPoul-Henning Kamp }
4495bb6a25fSPoul-Henning Kamp 
450220ed979SColeman Kane static int PTRCALL
entity2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4516b2c1e49SXin LI entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4526b2c1e49SXin LI         const ENCODING *enc) {
4535bb6a25fSPoul-Henning Kamp   switch (tok) {
4545bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4555bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4565bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
4575bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
4585bb6a25fSPoul-Henning Kamp       state->handler = entity4;
4595bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
4605bb6a25fSPoul-Henning Kamp     }
4615bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
4625bb6a25fSPoul-Henning Kamp       state->handler = entity3;
4635bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
4645bb6a25fSPoul-Henning Kamp     }
4655bb6a25fSPoul-Henning Kamp     break;
4665bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
4675bb6a25fSPoul-Henning Kamp     state->handler = declClose;
4685bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ENTITY_NONE;
4695bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_VALUE;
4705bb6a25fSPoul-Henning Kamp   }
4715bb6a25fSPoul-Henning Kamp   return common(state, tok);
4725bb6a25fSPoul-Henning Kamp }
4735bb6a25fSPoul-Henning Kamp 
474220ed979SColeman Kane static int PTRCALL
entity3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4756b2c1e49SXin LI entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4766b2c1e49SXin LI         const ENCODING *enc) {
4776b2c1e49SXin LI   UNUSED_P(ptr);
4786b2c1e49SXin LI   UNUSED_P(end);
4796b2c1e49SXin LI   UNUSED_P(enc);
4805bb6a25fSPoul-Henning Kamp   switch (tok) {
4815bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4825bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4835bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
4845bb6a25fSPoul-Henning Kamp     state->handler = entity4;
4855bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_PUBLIC_ID;
4865bb6a25fSPoul-Henning Kamp   }
4875bb6a25fSPoul-Henning Kamp   return common(state, tok);
4885bb6a25fSPoul-Henning Kamp }
4895bb6a25fSPoul-Henning Kamp 
490220ed979SColeman Kane static int PTRCALL
entity4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)4916b2c1e49SXin LI entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
4926b2c1e49SXin LI         const ENCODING *enc) {
4936b2c1e49SXin LI   UNUSED_P(ptr);
4946b2c1e49SXin LI   UNUSED_P(end);
4956b2c1e49SXin LI   UNUSED_P(enc);
4965bb6a25fSPoul-Henning Kamp   switch (tok) {
4975bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
4985bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
4995bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
5005bb6a25fSPoul-Henning Kamp     state->handler = entity5;
5015bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_SYSTEM_ID;
5025bb6a25fSPoul-Henning Kamp   }
5035bb6a25fSPoul-Henning Kamp   return common(state, tok);
5045bb6a25fSPoul-Henning Kamp }
5055bb6a25fSPoul-Henning Kamp 
506220ed979SColeman Kane static int PTRCALL
entity5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5076b2c1e49SXin LI entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5086b2c1e49SXin LI         const ENCODING *enc) {
5095bb6a25fSPoul-Henning Kamp   switch (tok) {
5105bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
5115bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
5125bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
5135bb6a25fSPoul-Henning Kamp     setTopLevel(state);
5145bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_COMPLETE;
5155bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
5165bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
5175bb6a25fSPoul-Henning Kamp       state->handler = entity6;
5185bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
5195bb6a25fSPoul-Henning Kamp     }
5205bb6a25fSPoul-Henning Kamp     break;
5215bb6a25fSPoul-Henning Kamp   }
5225bb6a25fSPoul-Henning Kamp   return common(state, tok);
5235bb6a25fSPoul-Henning Kamp }
5245bb6a25fSPoul-Henning Kamp 
525220ed979SColeman Kane static int PTRCALL
entity6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5266b2c1e49SXin LI entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5276b2c1e49SXin LI         const ENCODING *enc) {
5286b2c1e49SXin LI   UNUSED_P(ptr);
5296b2c1e49SXin LI   UNUSED_P(end);
5306b2c1e49SXin LI   UNUSED_P(enc);
5315bb6a25fSPoul-Henning Kamp   switch (tok) {
5325bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
5335bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
5345bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
5355bb6a25fSPoul-Henning Kamp     state->handler = declClose;
5365bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ENTITY_NONE;
5375bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NOTATION_NAME;
5385bb6a25fSPoul-Henning Kamp   }
5395bb6a25fSPoul-Henning Kamp   return common(state, tok);
5405bb6a25fSPoul-Henning Kamp }
5415bb6a25fSPoul-Henning Kamp 
542220ed979SColeman Kane static int PTRCALL
entity7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5436b2c1e49SXin LI entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5446b2c1e49SXin LI         const ENCODING *enc) {
5455bb6a25fSPoul-Henning Kamp   switch (tok) {
5465bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
5475bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
5485bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
5495bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
5505bb6a25fSPoul-Henning Kamp       state->handler = entity9;
5515bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
5525bb6a25fSPoul-Henning Kamp     }
5535bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
5545bb6a25fSPoul-Henning Kamp       state->handler = entity8;
5555bb6a25fSPoul-Henning Kamp       return XML_ROLE_ENTITY_NONE;
5565bb6a25fSPoul-Henning Kamp     }
5575bb6a25fSPoul-Henning Kamp     break;
5585bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
5595bb6a25fSPoul-Henning Kamp     state->handler = declClose;
5605bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ENTITY_NONE;
5615bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_VALUE;
5625bb6a25fSPoul-Henning Kamp   }
5635bb6a25fSPoul-Henning Kamp   return common(state, tok);
5645bb6a25fSPoul-Henning Kamp }
5655bb6a25fSPoul-Henning Kamp 
566220ed979SColeman Kane static int PTRCALL
entity8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5676b2c1e49SXin LI entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5686b2c1e49SXin LI         const ENCODING *enc) {
5696b2c1e49SXin LI   UNUSED_P(ptr);
5706b2c1e49SXin LI   UNUSED_P(end);
5716b2c1e49SXin LI   UNUSED_P(enc);
5725bb6a25fSPoul-Henning Kamp   switch (tok) {
5735bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
5745bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
5755bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
5765bb6a25fSPoul-Henning Kamp     state->handler = entity9;
5775bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_PUBLIC_ID;
5785bb6a25fSPoul-Henning Kamp   }
5795bb6a25fSPoul-Henning Kamp   return common(state, tok);
5805bb6a25fSPoul-Henning Kamp }
5815bb6a25fSPoul-Henning Kamp 
582220ed979SColeman Kane static int PTRCALL
entity9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5836b2c1e49SXin LI entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
5846b2c1e49SXin LI         const ENCODING *enc) {
5856b2c1e49SXin LI   UNUSED_P(ptr);
5866b2c1e49SXin LI   UNUSED_P(end);
5876b2c1e49SXin LI   UNUSED_P(enc);
5885bb6a25fSPoul-Henning Kamp   switch (tok) {
5895bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
5905bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
5915bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
5925bb6a25fSPoul-Henning Kamp     state->handler = entity10;
5935bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_SYSTEM_ID;
5945bb6a25fSPoul-Henning Kamp   }
5955bb6a25fSPoul-Henning Kamp   return common(state, tok);
5965bb6a25fSPoul-Henning Kamp }
5975bb6a25fSPoul-Henning Kamp 
598220ed979SColeman Kane static int PTRCALL
entity10(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)5996b2c1e49SXin LI entity10(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6006b2c1e49SXin LI          const ENCODING *enc) {
6016b2c1e49SXin LI   UNUSED_P(ptr);
6026b2c1e49SXin LI   UNUSED_P(end);
6036b2c1e49SXin LI   UNUSED_P(enc);
6045bb6a25fSPoul-Henning Kamp   switch (tok) {
6055bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6065bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_NONE;
6075bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
6085bb6a25fSPoul-Henning Kamp     setTopLevel(state);
6095bb6a25fSPoul-Henning Kamp     return XML_ROLE_ENTITY_COMPLETE;
6105bb6a25fSPoul-Henning Kamp   }
6115bb6a25fSPoul-Henning Kamp   return common(state, tok);
6125bb6a25fSPoul-Henning Kamp }
6135bb6a25fSPoul-Henning Kamp 
614220ed979SColeman Kane static int PTRCALL
notation0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6156b2c1e49SXin LI notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6166b2c1e49SXin LI           const ENCODING *enc) {
6176b2c1e49SXin LI   UNUSED_P(ptr);
6186b2c1e49SXin LI   UNUSED_P(end);
6196b2c1e49SXin LI   UNUSED_P(enc);
6205bb6a25fSPoul-Henning Kamp   switch (tok) {
6215bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6225bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NONE;
6235bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
6245bb6a25fSPoul-Henning Kamp     state->handler = notation1;
6255bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NAME;
6265bb6a25fSPoul-Henning Kamp   }
6275bb6a25fSPoul-Henning Kamp   return common(state, tok);
6285bb6a25fSPoul-Henning Kamp }
6295bb6a25fSPoul-Henning Kamp 
630220ed979SColeman Kane static int PTRCALL
notation1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6316b2c1e49SXin LI notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6326b2c1e49SXin LI           const ENCODING *enc) {
6335bb6a25fSPoul-Henning Kamp   switch (tok) {
6345bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6355bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NONE;
6365bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
6375bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
6385bb6a25fSPoul-Henning Kamp       state->handler = notation3;
6395bb6a25fSPoul-Henning Kamp       return XML_ROLE_NOTATION_NONE;
6405bb6a25fSPoul-Henning Kamp     }
6415bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
6425bb6a25fSPoul-Henning Kamp       state->handler = notation2;
6435bb6a25fSPoul-Henning Kamp       return XML_ROLE_NOTATION_NONE;
6445bb6a25fSPoul-Henning Kamp     }
6455bb6a25fSPoul-Henning Kamp     break;
6465bb6a25fSPoul-Henning Kamp   }
6475bb6a25fSPoul-Henning Kamp   return common(state, tok);
6485bb6a25fSPoul-Henning Kamp }
6495bb6a25fSPoul-Henning Kamp 
650220ed979SColeman Kane static int PTRCALL
notation2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6516b2c1e49SXin LI notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6526b2c1e49SXin LI           const ENCODING *enc) {
6536b2c1e49SXin LI   UNUSED_P(ptr);
6546b2c1e49SXin LI   UNUSED_P(end);
6556b2c1e49SXin LI   UNUSED_P(enc);
6565bb6a25fSPoul-Henning Kamp   switch (tok) {
6575bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6585bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NONE;
6595bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
6605bb6a25fSPoul-Henning Kamp     state->handler = notation4;
6615bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_PUBLIC_ID;
6625bb6a25fSPoul-Henning Kamp   }
6635bb6a25fSPoul-Henning Kamp   return common(state, tok);
6645bb6a25fSPoul-Henning Kamp }
6655bb6a25fSPoul-Henning Kamp 
666220ed979SColeman Kane static int PTRCALL
notation3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6676b2c1e49SXin LI notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6686b2c1e49SXin LI           const ENCODING *enc) {
6696b2c1e49SXin LI   UNUSED_P(ptr);
6706b2c1e49SXin LI   UNUSED_P(end);
6716b2c1e49SXin LI   UNUSED_P(enc);
6725bb6a25fSPoul-Henning Kamp   switch (tok) {
6735bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6745bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NONE;
6755bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
6765bb6a25fSPoul-Henning Kamp     state->handler = declClose;
6775bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_NOTATION_NONE;
6785bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_SYSTEM_ID;
6795bb6a25fSPoul-Henning Kamp   }
6805bb6a25fSPoul-Henning Kamp   return common(state, tok);
6815bb6a25fSPoul-Henning Kamp }
6825bb6a25fSPoul-Henning Kamp 
683220ed979SColeman Kane static int PTRCALL
notation4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)6846b2c1e49SXin LI notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
6856b2c1e49SXin LI           const ENCODING *enc) {
6866b2c1e49SXin LI   UNUSED_P(ptr);
6876b2c1e49SXin LI   UNUSED_P(end);
6886b2c1e49SXin LI   UNUSED_P(enc);
6895bb6a25fSPoul-Henning Kamp   switch (tok) {
6905bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
6915bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NONE;
6925bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
6935bb6a25fSPoul-Henning Kamp     state->handler = declClose;
6945bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_NOTATION_NONE;
6955bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_SYSTEM_ID;
6965bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
6975bb6a25fSPoul-Henning Kamp     setTopLevel(state);
6985bb6a25fSPoul-Henning Kamp     return XML_ROLE_NOTATION_NO_SYSTEM_ID;
6995bb6a25fSPoul-Henning Kamp   }
7005bb6a25fSPoul-Henning Kamp   return common(state, tok);
7015bb6a25fSPoul-Henning Kamp }
7025bb6a25fSPoul-Henning Kamp 
703220ed979SColeman Kane static int PTRCALL
attlist0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7046b2c1e49SXin LI attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7056b2c1e49SXin LI          const ENCODING *enc) {
7066b2c1e49SXin LI   UNUSED_P(ptr);
7076b2c1e49SXin LI   UNUSED_P(end);
7086b2c1e49SXin LI   UNUSED_P(enc);
7095bb6a25fSPoul-Henning Kamp   switch (tok) {
7105bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
7115bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7125bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
7135bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
7145bb6a25fSPoul-Henning Kamp     state->handler = attlist1;
7155bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_ELEMENT_NAME;
7165bb6a25fSPoul-Henning Kamp   }
7175bb6a25fSPoul-Henning Kamp   return common(state, tok);
7185bb6a25fSPoul-Henning Kamp }
7195bb6a25fSPoul-Henning Kamp 
720220ed979SColeman Kane static int PTRCALL
attlist1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7216b2c1e49SXin LI attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7226b2c1e49SXin LI          const ENCODING *enc) {
7236b2c1e49SXin LI   UNUSED_P(ptr);
7246b2c1e49SXin LI   UNUSED_P(end);
7256b2c1e49SXin LI   UNUSED_P(enc);
7265bb6a25fSPoul-Henning Kamp   switch (tok) {
7275bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
7285bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7295bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
7305bb6a25fSPoul-Henning Kamp     setTopLevel(state);
7315bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7325bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
7335bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
7345bb6a25fSPoul-Henning Kamp     state->handler = attlist2;
7355bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTRIBUTE_NAME;
7365bb6a25fSPoul-Henning Kamp   }
7375bb6a25fSPoul-Henning Kamp   return common(state, tok);
7385bb6a25fSPoul-Henning Kamp }
7395bb6a25fSPoul-Henning Kamp 
740220ed979SColeman Kane static int PTRCALL
attlist2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7416b2c1e49SXin LI attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7426b2c1e49SXin LI          const ENCODING *enc) {
7435bb6a25fSPoul-Henning Kamp   switch (tok) {
7445bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
7455bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7466b2c1e49SXin LI   case XML_TOK_NAME: {
747220ed979SColeman Kane     static const char *const types[] = {
7486b2c1e49SXin LI         KW_CDATA,  KW_ID,       KW_IDREF,   KW_IDREFS,
7496b2c1e49SXin LI         KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS,
7505bb6a25fSPoul-Henning Kamp     };
7515bb6a25fSPoul-Henning Kamp     int i;
7525bb6a25fSPoul-Henning Kamp     for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++)
7535bb6a25fSPoul-Henning Kamp       if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
7545bb6a25fSPoul-Henning Kamp         state->handler = attlist8;
7555bb6a25fSPoul-Henning Kamp         return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
7565bb6a25fSPoul-Henning Kamp       }
7575bb6a25fSPoul-Henning Kamp   }
7585bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
7595bb6a25fSPoul-Henning Kamp       state->handler = attlist5;
7605bb6a25fSPoul-Henning Kamp       return XML_ROLE_ATTLIST_NONE;
7615bb6a25fSPoul-Henning Kamp     }
7625bb6a25fSPoul-Henning Kamp     break;
7635bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_PAREN:
7645bb6a25fSPoul-Henning Kamp     state->handler = attlist3;
7655bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7665bb6a25fSPoul-Henning Kamp   }
7675bb6a25fSPoul-Henning Kamp   return common(state, tok);
7685bb6a25fSPoul-Henning Kamp }
7695bb6a25fSPoul-Henning Kamp 
770220ed979SColeman Kane static int PTRCALL
attlist3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7716b2c1e49SXin LI attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7726b2c1e49SXin LI          const ENCODING *enc) {
7736b2c1e49SXin LI   UNUSED_P(ptr);
7746b2c1e49SXin LI   UNUSED_P(end);
7756b2c1e49SXin LI   UNUSED_P(enc);
7765bb6a25fSPoul-Henning Kamp   switch (tok) {
7775bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
7785bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7795bb6a25fSPoul-Henning Kamp   case XML_TOK_NMTOKEN:
7805bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
7815bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
7825bb6a25fSPoul-Henning Kamp     state->handler = attlist4;
7835bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
7845bb6a25fSPoul-Henning Kamp   }
7855bb6a25fSPoul-Henning Kamp   return common(state, tok);
7865bb6a25fSPoul-Henning Kamp }
7875bb6a25fSPoul-Henning Kamp 
788220ed979SColeman Kane static int PTRCALL
attlist4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)7896b2c1e49SXin LI attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
7906b2c1e49SXin LI          const ENCODING *enc) {
7916b2c1e49SXin LI   UNUSED_P(ptr);
7926b2c1e49SXin LI   UNUSED_P(end);
7936b2c1e49SXin LI   UNUSED_P(enc);
7945bb6a25fSPoul-Henning Kamp   switch (tok) {
7955bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
7965bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
7975bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN:
7985bb6a25fSPoul-Henning Kamp     state->handler = attlist8;
7995bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8005bb6a25fSPoul-Henning Kamp   case XML_TOK_OR:
8015bb6a25fSPoul-Henning Kamp     state->handler = attlist3;
8025bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8035bb6a25fSPoul-Henning Kamp   }
8045bb6a25fSPoul-Henning Kamp   return common(state, tok);
8055bb6a25fSPoul-Henning Kamp }
8065bb6a25fSPoul-Henning Kamp 
807220ed979SColeman Kane static int PTRCALL
attlist5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8086b2c1e49SXin LI attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8096b2c1e49SXin LI          const ENCODING *enc) {
8106b2c1e49SXin LI   UNUSED_P(ptr);
8116b2c1e49SXin LI   UNUSED_P(end);
8126b2c1e49SXin LI   UNUSED_P(enc);
8135bb6a25fSPoul-Henning Kamp   switch (tok) {
8145bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
8155bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8165bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_PAREN:
8175bb6a25fSPoul-Henning Kamp     state->handler = attlist6;
8185bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8195bb6a25fSPoul-Henning Kamp   }
8205bb6a25fSPoul-Henning Kamp   return common(state, tok);
8215bb6a25fSPoul-Henning Kamp }
8225bb6a25fSPoul-Henning Kamp 
823220ed979SColeman Kane static int PTRCALL
attlist6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8246b2c1e49SXin LI attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8256b2c1e49SXin LI          const ENCODING *enc) {
8266b2c1e49SXin LI   UNUSED_P(ptr);
8276b2c1e49SXin LI   UNUSED_P(end);
8286b2c1e49SXin LI   UNUSED_P(enc);
8295bb6a25fSPoul-Henning Kamp   switch (tok) {
8305bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
8315bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8325bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
8335bb6a25fSPoul-Henning Kamp     state->handler = attlist7;
8345bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
8355bb6a25fSPoul-Henning Kamp   }
8365bb6a25fSPoul-Henning Kamp   return common(state, tok);
8375bb6a25fSPoul-Henning Kamp }
8385bb6a25fSPoul-Henning Kamp 
839220ed979SColeman Kane static int PTRCALL
attlist7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8406b2c1e49SXin LI attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8416b2c1e49SXin LI          const ENCODING *enc) {
8426b2c1e49SXin LI   UNUSED_P(ptr);
8436b2c1e49SXin LI   UNUSED_P(end);
8446b2c1e49SXin LI   UNUSED_P(enc);
8455bb6a25fSPoul-Henning Kamp   switch (tok) {
8465bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
8475bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8485bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN:
8495bb6a25fSPoul-Henning Kamp     state->handler = attlist8;
8505bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8515bb6a25fSPoul-Henning Kamp   case XML_TOK_OR:
8525bb6a25fSPoul-Henning Kamp     state->handler = attlist6;
8535bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8545bb6a25fSPoul-Henning Kamp   }
8555bb6a25fSPoul-Henning Kamp   return common(state, tok);
8565bb6a25fSPoul-Henning Kamp }
8575bb6a25fSPoul-Henning Kamp 
8585bb6a25fSPoul-Henning Kamp /* default value */
859220ed979SColeman Kane static int PTRCALL
attlist8(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8606b2c1e49SXin LI attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8616b2c1e49SXin LI          const ENCODING *enc) {
8625bb6a25fSPoul-Henning Kamp   switch (tok) {
8635bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
8645bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8655bb6a25fSPoul-Henning Kamp   case XML_TOK_POUND_NAME:
8666b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8675bb6a25fSPoul-Henning Kamp                             KW_IMPLIED)) {
8685bb6a25fSPoul-Henning Kamp       state->handler = attlist1;
8695bb6a25fSPoul-Henning Kamp       return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
8705bb6a25fSPoul-Henning Kamp     }
8716b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8725bb6a25fSPoul-Henning Kamp                             KW_REQUIRED)) {
8735bb6a25fSPoul-Henning Kamp       state->handler = attlist1;
8745bb6a25fSPoul-Henning Kamp       return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
8755bb6a25fSPoul-Henning Kamp     }
8766b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
8775bb6a25fSPoul-Henning Kamp                             KW_FIXED)) {
8785bb6a25fSPoul-Henning Kamp       state->handler = attlist9;
8795bb6a25fSPoul-Henning Kamp       return XML_ROLE_ATTLIST_NONE;
8805bb6a25fSPoul-Henning Kamp     }
8815bb6a25fSPoul-Henning Kamp     break;
8825bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
8835bb6a25fSPoul-Henning Kamp     state->handler = attlist1;
8845bb6a25fSPoul-Henning Kamp     return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
8855bb6a25fSPoul-Henning Kamp   }
8865bb6a25fSPoul-Henning Kamp   return common(state, tok);
8875bb6a25fSPoul-Henning Kamp }
8885bb6a25fSPoul-Henning Kamp 
889220ed979SColeman Kane static int PTRCALL
attlist9(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)8906b2c1e49SXin LI attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
8916b2c1e49SXin LI          const ENCODING *enc) {
8926b2c1e49SXin LI   UNUSED_P(ptr);
8936b2c1e49SXin LI   UNUSED_P(end);
8946b2c1e49SXin LI   UNUSED_P(enc);
8955bb6a25fSPoul-Henning Kamp   switch (tok) {
8965bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
8975bb6a25fSPoul-Henning Kamp     return XML_ROLE_ATTLIST_NONE;
8985bb6a25fSPoul-Henning Kamp   case XML_TOK_LITERAL:
8995bb6a25fSPoul-Henning Kamp     state->handler = attlist1;
9005bb6a25fSPoul-Henning Kamp     return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
9015bb6a25fSPoul-Henning Kamp   }
9025bb6a25fSPoul-Henning Kamp   return common(state, tok);
9035bb6a25fSPoul-Henning Kamp }
9045bb6a25fSPoul-Henning Kamp 
905220ed979SColeman Kane static int PTRCALL
element0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9066b2c1e49SXin LI element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9076b2c1e49SXin LI          const ENCODING *enc) {
9086b2c1e49SXin LI   UNUSED_P(ptr);
9096b2c1e49SXin LI   UNUSED_P(end);
9106b2c1e49SXin LI   UNUSED_P(enc);
9115bb6a25fSPoul-Henning Kamp   switch (tok) {
9125bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
9135bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
9145bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
9155bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
9165bb6a25fSPoul-Henning Kamp     state->handler = element1;
9175bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NAME;
9185bb6a25fSPoul-Henning Kamp   }
9195bb6a25fSPoul-Henning Kamp   return common(state, tok);
9205bb6a25fSPoul-Henning Kamp }
9215bb6a25fSPoul-Henning Kamp 
922220ed979SColeman Kane static int PTRCALL
element1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9236b2c1e49SXin LI element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9246b2c1e49SXin LI          const ENCODING *enc) {
9255bb6a25fSPoul-Henning Kamp   switch (tok) {
9265bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
9275bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
9285bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
9295bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
9305bb6a25fSPoul-Henning Kamp       state->handler = declClose;
9315bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
9325bb6a25fSPoul-Henning Kamp       return XML_ROLE_CONTENT_EMPTY;
9335bb6a25fSPoul-Henning Kamp     }
9345bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
9355bb6a25fSPoul-Henning Kamp       state->handler = declClose;
9365bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
9375bb6a25fSPoul-Henning Kamp       return XML_ROLE_CONTENT_ANY;
9385bb6a25fSPoul-Henning Kamp     }
9395bb6a25fSPoul-Henning Kamp     break;
9405bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_PAREN:
9415bb6a25fSPoul-Henning Kamp     state->handler = element2;
9425bb6a25fSPoul-Henning Kamp     state->level = 1;
9435bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_OPEN;
9445bb6a25fSPoul-Henning Kamp   }
9455bb6a25fSPoul-Henning Kamp   return common(state, tok);
9465bb6a25fSPoul-Henning Kamp }
9475bb6a25fSPoul-Henning Kamp 
948220ed979SColeman Kane static int PTRCALL
element2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9496b2c1e49SXin LI element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9506b2c1e49SXin LI          const ENCODING *enc) {
9515bb6a25fSPoul-Henning Kamp   switch (tok) {
9525bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
9535bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
9545bb6a25fSPoul-Henning Kamp   case XML_TOK_POUND_NAME:
9556b2c1e49SXin LI     if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end,
9565bb6a25fSPoul-Henning Kamp                             KW_PCDATA)) {
9575bb6a25fSPoul-Henning Kamp       state->handler = element3;
9585bb6a25fSPoul-Henning Kamp       return XML_ROLE_CONTENT_PCDATA;
9595bb6a25fSPoul-Henning Kamp     }
9605bb6a25fSPoul-Henning Kamp     break;
9615bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_PAREN:
9625bb6a25fSPoul-Henning Kamp     state->level = 2;
9635bb6a25fSPoul-Henning Kamp     state->handler = element6;
9645bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_OPEN;
9655bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
9665bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
9675bb6a25fSPoul-Henning Kamp     state->handler = element7;
9685bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT;
9695bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_QUESTION:
9705bb6a25fSPoul-Henning Kamp     state->handler = element7;
9715bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_OPT;
9725bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_ASTERISK:
9735bb6a25fSPoul-Henning Kamp     state->handler = element7;
9745bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_REP;
9755bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_PLUS:
9765bb6a25fSPoul-Henning Kamp     state->handler = element7;
9775bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_PLUS;
9785bb6a25fSPoul-Henning Kamp   }
9795bb6a25fSPoul-Henning Kamp   return common(state, tok);
9805bb6a25fSPoul-Henning Kamp }
9815bb6a25fSPoul-Henning Kamp 
982220ed979SColeman Kane static int PTRCALL
element3(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)9836b2c1e49SXin LI element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
9846b2c1e49SXin LI          const ENCODING *enc) {
9856b2c1e49SXin LI   UNUSED_P(ptr);
9866b2c1e49SXin LI   UNUSED_P(end);
9876b2c1e49SXin LI   UNUSED_P(enc);
9885bb6a25fSPoul-Henning Kamp   switch (tok) {
9895bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
9905bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
9915bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN:
9925bb6a25fSPoul-Henning Kamp     state->handler = declClose;
9935bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ELEMENT_NONE;
9945bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE;
9955bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN_ASTERISK:
9965bb6a25fSPoul-Henning Kamp     state->handler = declClose;
9975bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ELEMENT_NONE;
9985bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE_REP;
9995bb6a25fSPoul-Henning Kamp   case XML_TOK_OR:
10005bb6a25fSPoul-Henning Kamp     state->handler = element4;
10015bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10025bb6a25fSPoul-Henning Kamp   }
10035bb6a25fSPoul-Henning Kamp   return common(state, tok);
10045bb6a25fSPoul-Henning Kamp }
10055bb6a25fSPoul-Henning Kamp 
1006220ed979SColeman Kane static int PTRCALL
element4(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10076b2c1e49SXin LI element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10086b2c1e49SXin LI          const ENCODING *enc) {
10096b2c1e49SXin LI   UNUSED_P(ptr);
10106b2c1e49SXin LI   UNUSED_P(end);
10116b2c1e49SXin LI   UNUSED_P(enc);
10125bb6a25fSPoul-Henning Kamp   switch (tok) {
10135bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
10145bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10155bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
10165bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
10175bb6a25fSPoul-Henning Kamp     state->handler = element5;
10185bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT;
10195bb6a25fSPoul-Henning Kamp   }
10205bb6a25fSPoul-Henning Kamp   return common(state, tok);
10215bb6a25fSPoul-Henning Kamp }
10225bb6a25fSPoul-Henning Kamp 
1023220ed979SColeman Kane static int PTRCALL
element5(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10246b2c1e49SXin LI element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10256b2c1e49SXin LI          const ENCODING *enc) {
10266b2c1e49SXin LI   UNUSED_P(ptr);
10276b2c1e49SXin LI   UNUSED_P(end);
10286b2c1e49SXin LI   UNUSED_P(enc);
10295bb6a25fSPoul-Henning Kamp   switch (tok) {
10305bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
10315bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10325bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN_ASTERISK:
10335bb6a25fSPoul-Henning Kamp     state->handler = declClose;
10345bb6a25fSPoul-Henning Kamp     state->role_none = XML_ROLE_ELEMENT_NONE;
10355bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE_REP;
10365bb6a25fSPoul-Henning Kamp   case XML_TOK_OR:
10375bb6a25fSPoul-Henning Kamp     state->handler = element4;
10385bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10395bb6a25fSPoul-Henning Kamp   }
10405bb6a25fSPoul-Henning Kamp   return common(state, tok);
10415bb6a25fSPoul-Henning Kamp }
10425bb6a25fSPoul-Henning Kamp 
1043220ed979SColeman Kane static int PTRCALL
element6(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10446b2c1e49SXin LI element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10456b2c1e49SXin LI          const ENCODING *enc) {
10466b2c1e49SXin LI   UNUSED_P(ptr);
10476b2c1e49SXin LI   UNUSED_P(end);
10486b2c1e49SXin LI   UNUSED_P(enc);
10495bb6a25fSPoul-Henning Kamp   switch (tok) {
10505bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
10515bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10525bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_PAREN:
10535bb6a25fSPoul-Henning Kamp     state->level += 1;
10545bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_OPEN;
10555bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
10565bb6a25fSPoul-Henning Kamp   case XML_TOK_PREFIXED_NAME:
10575bb6a25fSPoul-Henning Kamp     state->handler = element7;
10585bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT;
10595bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_QUESTION:
10605bb6a25fSPoul-Henning Kamp     state->handler = element7;
10615bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_OPT;
10625bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_ASTERISK:
10635bb6a25fSPoul-Henning Kamp     state->handler = element7;
10645bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_REP;
10655bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME_PLUS:
10665bb6a25fSPoul-Henning Kamp     state->handler = element7;
10675bb6a25fSPoul-Henning Kamp     return XML_ROLE_CONTENT_ELEMENT_PLUS;
10685bb6a25fSPoul-Henning Kamp   }
10695bb6a25fSPoul-Henning Kamp   return common(state, tok);
10705bb6a25fSPoul-Henning Kamp }
10715bb6a25fSPoul-Henning Kamp 
1072220ed979SColeman Kane static int PTRCALL
element7(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)10736b2c1e49SXin LI element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
10746b2c1e49SXin LI          const ENCODING *enc) {
10756b2c1e49SXin LI   UNUSED_P(ptr);
10766b2c1e49SXin LI   UNUSED_P(end);
10776b2c1e49SXin LI   UNUSED_P(enc);
10785bb6a25fSPoul-Henning Kamp   switch (tok) {
10795bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
10805bb6a25fSPoul-Henning Kamp     return XML_ROLE_ELEMENT_NONE;
10815bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN:
10825bb6a25fSPoul-Henning Kamp     state->level -= 1;
10835bb6a25fSPoul-Henning Kamp     if (state->level == 0) {
10845bb6a25fSPoul-Henning Kamp       state->handler = declClose;
10855bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
10865bb6a25fSPoul-Henning Kamp     }
10875bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE;
10885bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN_ASTERISK:
10895bb6a25fSPoul-Henning Kamp     state->level -= 1;
10905bb6a25fSPoul-Henning Kamp     if (state->level == 0) {
10915bb6a25fSPoul-Henning Kamp       state->handler = declClose;
10925bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
10935bb6a25fSPoul-Henning Kamp     }
10945bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE_REP;
10955bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN_QUESTION:
10965bb6a25fSPoul-Henning Kamp     state->level -= 1;
10975bb6a25fSPoul-Henning Kamp     if (state->level == 0) {
10985bb6a25fSPoul-Henning Kamp       state->handler = declClose;
10995bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
11005bb6a25fSPoul-Henning Kamp     }
11015bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE_OPT;
11025bb6a25fSPoul-Henning Kamp   case XML_TOK_CLOSE_PAREN_PLUS:
11035bb6a25fSPoul-Henning Kamp     state->level -= 1;
11045bb6a25fSPoul-Henning Kamp     if (state->level == 0) {
11055bb6a25fSPoul-Henning Kamp       state->handler = declClose;
11065bb6a25fSPoul-Henning Kamp       state->role_none = XML_ROLE_ELEMENT_NONE;
11075bb6a25fSPoul-Henning Kamp     }
11085bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CLOSE_PLUS;
11095bb6a25fSPoul-Henning Kamp   case XML_TOK_COMMA:
11105bb6a25fSPoul-Henning Kamp     state->handler = element6;
11115bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_SEQUENCE;
11125bb6a25fSPoul-Henning Kamp   case XML_TOK_OR:
11135bb6a25fSPoul-Henning Kamp     state->handler = element6;
11145bb6a25fSPoul-Henning Kamp     return XML_ROLE_GROUP_CHOICE;
11155bb6a25fSPoul-Henning Kamp   }
11165bb6a25fSPoul-Henning Kamp   return common(state, tok);
11175bb6a25fSPoul-Henning Kamp }
11185bb6a25fSPoul-Henning Kamp 
11195bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
11205bb6a25fSPoul-Henning Kamp 
1121220ed979SColeman Kane static int PTRCALL
condSect0(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11226b2c1e49SXin LI condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11236b2c1e49SXin LI           const ENCODING *enc) {
11245bb6a25fSPoul-Henning Kamp   switch (tok) {
11255bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
11265bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
11275bb6a25fSPoul-Henning Kamp   case XML_TOK_NAME:
11285bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
11295bb6a25fSPoul-Henning Kamp       state->handler = condSect1;
11305bb6a25fSPoul-Henning Kamp       return XML_ROLE_NONE;
11315bb6a25fSPoul-Henning Kamp     }
11325bb6a25fSPoul-Henning Kamp     if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
11335bb6a25fSPoul-Henning Kamp       state->handler = condSect2;
11345bb6a25fSPoul-Henning Kamp       return XML_ROLE_NONE;
11355bb6a25fSPoul-Henning Kamp     }
11365bb6a25fSPoul-Henning Kamp     break;
11375bb6a25fSPoul-Henning Kamp   }
11385bb6a25fSPoul-Henning Kamp   return common(state, tok);
11395bb6a25fSPoul-Henning Kamp }
11405bb6a25fSPoul-Henning Kamp 
1141220ed979SColeman Kane static int PTRCALL
condSect1(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11426b2c1e49SXin LI condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11436b2c1e49SXin LI           const ENCODING *enc) {
11446b2c1e49SXin LI   UNUSED_P(ptr);
11456b2c1e49SXin LI   UNUSED_P(end);
11466b2c1e49SXin LI   UNUSED_P(enc);
11475bb6a25fSPoul-Henning Kamp   switch (tok) {
11485bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
11495bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
11505bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_BRACKET:
11515bb6a25fSPoul-Henning Kamp     state->handler = externalSubset1;
11525bb6a25fSPoul-Henning Kamp     state->includeLevel += 1;
11535bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
11545bb6a25fSPoul-Henning Kamp   }
11555bb6a25fSPoul-Henning Kamp   return common(state, tok);
11565bb6a25fSPoul-Henning Kamp }
11575bb6a25fSPoul-Henning Kamp 
1158220ed979SColeman Kane static int PTRCALL
condSect2(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11596b2c1e49SXin LI condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11606b2c1e49SXin LI           const ENCODING *enc) {
11616b2c1e49SXin LI   UNUSED_P(ptr);
11626b2c1e49SXin LI   UNUSED_P(end);
11636b2c1e49SXin LI   UNUSED_P(enc);
11645bb6a25fSPoul-Henning Kamp   switch (tok) {
11655bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
11665bb6a25fSPoul-Henning Kamp     return XML_ROLE_NONE;
11675bb6a25fSPoul-Henning Kamp   case XML_TOK_OPEN_BRACKET:
11685bb6a25fSPoul-Henning Kamp     state->handler = externalSubset1;
11695bb6a25fSPoul-Henning Kamp     return XML_ROLE_IGNORE_SECT;
11705bb6a25fSPoul-Henning Kamp   }
11715bb6a25fSPoul-Henning Kamp   return common(state, tok);
11725bb6a25fSPoul-Henning Kamp }
11735bb6a25fSPoul-Henning Kamp 
11745bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */
11755bb6a25fSPoul-Henning Kamp 
1176220ed979SColeman Kane static int PTRCALL
declClose(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)11776b2c1e49SXin LI declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
11786b2c1e49SXin LI           const ENCODING *enc) {
11796b2c1e49SXin LI   UNUSED_P(ptr);
11806b2c1e49SXin LI   UNUSED_P(end);
11816b2c1e49SXin LI   UNUSED_P(enc);
11825bb6a25fSPoul-Henning Kamp   switch (tok) {
11835bb6a25fSPoul-Henning Kamp   case XML_TOK_PROLOG_S:
11845bb6a25fSPoul-Henning Kamp     return state->role_none;
11855bb6a25fSPoul-Henning Kamp   case XML_TOK_DECL_CLOSE:
11865bb6a25fSPoul-Henning Kamp     setTopLevel(state);
11875bb6a25fSPoul-Henning Kamp     return state->role_none;
11885bb6a25fSPoul-Henning Kamp   }
11895bb6a25fSPoul-Henning Kamp   return common(state, tok);
11905bb6a25fSPoul-Henning Kamp }
11915bb6a25fSPoul-Henning Kamp 
11920a48773fSEric van Gyzen /* This function will only be invoked if the internal logic of the
11930a48773fSEric van Gyzen  * parser has broken down.  It is used in two cases:
11940a48773fSEric van Gyzen  *
11950a48773fSEric van Gyzen  * 1: When the XML prolog has been finished.  At this point the
11960a48773fSEric van Gyzen  * processor (the parser level above these role handlers) should
11970a48773fSEric van Gyzen  * switch from prologProcessor to contentProcessor and reinitialise
11980a48773fSEric van Gyzen  * the handler function.
11990a48773fSEric van Gyzen  *
12000a48773fSEric van Gyzen  * 2: When an error has been detected (via common() below).  At this
12010a48773fSEric van Gyzen  * point again the processor should be switched to errorProcessor,
12020a48773fSEric van Gyzen  * which will never call a handler.
12030a48773fSEric van Gyzen  *
12040a48773fSEric van Gyzen  * The result of this is that error() can only be called if the
12050a48773fSEric van Gyzen  * processor switch failed to happen, which is an internal error and
12060a48773fSEric van Gyzen  * therefore we shouldn't be able to provoke it simply by using the
12070a48773fSEric van Gyzen  * library.  It is a necessary backstop, however, so we merely exclude
12080a48773fSEric van Gyzen  * it from the coverage statistics.
12090a48773fSEric van Gyzen  *
12100a48773fSEric van Gyzen  * LCOV_EXCL_START
12110a48773fSEric van Gyzen  */
1212220ed979SColeman Kane static int PTRCALL
error(PROLOG_STATE * state,int tok,const char * ptr,const char * end,const ENCODING * enc)12136b2c1e49SXin LI error(PROLOG_STATE *state, int tok, const char *ptr, const char *end,
12146b2c1e49SXin LI       const ENCODING *enc) {
12156b2c1e49SXin LI   UNUSED_P(state);
12166b2c1e49SXin LI   UNUSED_P(tok);
12176b2c1e49SXin LI   UNUSED_P(ptr);
12186b2c1e49SXin LI   UNUSED_P(end);
12196b2c1e49SXin LI   UNUSED_P(enc);
12205bb6a25fSPoul-Henning Kamp   return XML_ROLE_NONE;
12215bb6a25fSPoul-Henning Kamp }
12220a48773fSEric van Gyzen /* LCOV_EXCL_STOP */
12235bb6a25fSPoul-Henning Kamp 
12245bb6a25fSPoul-Henning Kamp static int FASTCALL
common(PROLOG_STATE * state,int tok)12256b2c1e49SXin LI common(PROLOG_STATE *state, int tok) {
12265bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
12275bb6a25fSPoul-Henning Kamp   if (! state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
12285bb6a25fSPoul-Henning Kamp     return XML_ROLE_INNER_PARAM_ENTITY_REF;
1229cc68614dSXin LI #else
1230cc68614dSXin LI   UNUSED_P(tok);
12315bb6a25fSPoul-Henning Kamp #endif
12325bb6a25fSPoul-Henning Kamp   state->handler = error;
12335bb6a25fSPoul-Henning Kamp   return XML_ROLE_ERROR;
12345bb6a25fSPoul-Henning Kamp }
12355bb6a25fSPoul-Henning Kamp 
12365bb6a25fSPoul-Henning Kamp void
XmlPrologStateInit(PROLOG_STATE * state)12376b2c1e49SXin LI XmlPrologStateInit(PROLOG_STATE *state) {
12385bb6a25fSPoul-Henning Kamp   state->handler = prolog0;
12395bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
12405bb6a25fSPoul-Henning Kamp   state->documentEntity = 1;
12415bb6a25fSPoul-Henning Kamp   state->includeLevel = 0;
12425bb6a25fSPoul-Henning Kamp   state->inEntityValue = 0;
12435bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */
12445bb6a25fSPoul-Henning Kamp }
12455bb6a25fSPoul-Henning Kamp 
12465bb6a25fSPoul-Henning Kamp #ifdef XML_DTD
12475bb6a25fSPoul-Henning Kamp 
12485bb6a25fSPoul-Henning Kamp void
XmlPrologStateInitExternalEntity(PROLOG_STATE * state)12496b2c1e49SXin LI XmlPrologStateInitExternalEntity(PROLOG_STATE *state) {
12505bb6a25fSPoul-Henning Kamp   state->handler = externalSubset0;
12515bb6a25fSPoul-Henning Kamp   state->documentEntity = 0;
12525bb6a25fSPoul-Henning Kamp   state->includeLevel = 0;
12535bb6a25fSPoul-Henning Kamp }
12545bb6a25fSPoul-Henning Kamp 
12555bb6a25fSPoul-Henning Kamp #endif /* XML_DTD */
1256