1104349Sphk/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 2104349Sphk See the file COPYING for copying permission. 3104349Sphk*/ 4104349Sphk 5178848Scokane#include <stddef.h> 6178848Scokane 7104349Sphk#ifdef COMPILED_FROM_DSP 8104349Sphk#include "winconfig.h" 9104349Sphk#elif defined(MACOS_CLASSIC) 10104349Sphk#include "macconfig.h" 11247296Sdelphij#elif defined(__amigaos__) 12178848Scokane#include "amigaconfig.h" 13178848Scokane#elif defined(__WATCOMC__) 14178848Scokane#include "watcomconfig.h" 15104349Sphk#else 16178848Scokane#ifdef HAVE_EXPAT_CONFIG_H 17104349Sphk#include <expat_config.h> 18178848Scokane#endif 19104349Sphk#endif /* ndef COMPILED_FROM_DSP */ 20104349Sphk 21178848Scokane#include "expat_external.h" 22104349Sphk#include "internal.h" 23104349Sphk#include "xmlrole.h" 24104349Sphk#include "ascii.h" 25104349Sphk 26104349Sphk/* Doesn't check: 27104349Sphk 28104349Sphk that ,| are not mixed in a model group 29104349Sphk content of literals 30104349Sphk 31104349Sphk*/ 32104349Sphk 33104349Sphkstatic const char KW_ANY[] = { 34104349Sphk ASCII_A, ASCII_N, ASCII_Y, '\0' }; 35104349Sphkstatic const char KW_ATTLIST[] = { 36104349Sphk ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; 37104349Sphkstatic const char KW_CDATA[] = { 38104349Sphk ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 39104349Sphkstatic const char KW_DOCTYPE[] = { 40104349Sphk ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; 41104349Sphkstatic const char KW_ELEMENT[] = { 42104349Sphk ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; 43104349Sphkstatic const char KW_EMPTY[] = { 44104349Sphk ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; 45104349Sphkstatic const char KW_ENTITIES[] = { 46104349Sphk ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, 47104349Sphk '\0' }; 48104349Sphkstatic const char KW_ENTITY[] = { 49104349Sphk ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; 50104349Sphkstatic const char KW_FIXED[] = { 51104349Sphk ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; 52104349Sphkstatic const char KW_ID[] = { 53104349Sphk ASCII_I, ASCII_D, '\0' }; 54104349Sphkstatic const char KW_IDREF[] = { 55104349Sphk ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; 56104349Sphkstatic const char KW_IDREFS[] = { 57104349Sphk ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; 58178848Scokane#ifdef XML_DTD 59104349Sphkstatic const char KW_IGNORE[] = { 60104349Sphk ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; 61178848Scokane#endif 62104349Sphkstatic const char KW_IMPLIED[] = { 63104349Sphk ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; 64178848Scokane#ifdef XML_DTD 65104349Sphkstatic const char KW_INCLUDE[] = { 66104349Sphk ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; 67178848Scokane#endif 68104349Sphkstatic const char KW_NDATA[] = { 69104349Sphk ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 70104349Sphkstatic const char KW_NMTOKEN[] = { 71104349Sphk ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; 72104349Sphkstatic const char KW_NMTOKENS[] = { 73104349Sphk ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, 74104349Sphk '\0' }; 75104349Sphkstatic const char KW_NOTATION[] = 76104349Sphk { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, 77104349Sphk '\0' }; 78104349Sphkstatic const char KW_PCDATA[] = { 79104349Sphk ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 80104349Sphkstatic const char KW_PUBLIC[] = { 81104349Sphk ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; 82104349Sphkstatic const char KW_REQUIRED[] = { 83104349Sphk ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, 84104349Sphk '\0' }; 85104349Sphkstatic const char KW_SYSTEM[] = { 86104349Sphk ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; 87104349Sphk 88104349Sphk#ifndef MIN_BYTES_PER_CHAR 89104349Sphk#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) 90104349Sphk#endif 91104349Sphk 92104349Sphk#ifdef XML_DTD 93104349Sphk#define setTopLevel(state) \ 94104349Sphk ((state)->handler = ((state)->documentEntity \ 95104349Sphk ? internalSubset \ 96104349Sphk : externalSubset1)) 97104349Sphk#else /* not XML_DTD */ 98104349Sphk#define setTopLevel(state) ((state)->handler = internalSubset) 99104349Sphk#endif /* not XML_DTD */ 100104349Sphk 101178848Scokanetypedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, 102178848Scokane int tok, 103178848Scokane const char *ptr, 104178848Scokane const char *end, 105178848Scokane const ENCODING *enc); 106104349Sphk 107104349Sphkstatic PROLOG_HANDLER 108104349Sphk prolog0, prolog1, prolog2, 109104349Sphk doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, 110104349Sphk internalSubset, 111104349Sphk entity0, entity1, entity2, entity3, entity4, entity5, entity6, 112104349Sphk entity7, entity8, entity9, entity10, 113104349Sphk notation0, notation1, notation2, notation3, notation4, 114104349Sphk attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, 115104349Sphk attlist7, attlist8, attlist9, 116104349Sphk element0, element1, element2, element3, element4, element5, element6, 117104349Sphk element7, 118104349Sphk#ifdef XML_DTD 119104349Sphk externalSubset0, externalSubset1, 120104349Sphk condSect0, condSect1, condSect2, 121104349Sphk#endif /* XML_DTD */ 122104349Sphk declClose, 123104349Sphk error; 124104349Sphk 125104349Sphkstatic int FASTCALL common(PROLOG_STATE *state, int tok); 126104349Sphk 127178848Scokanestatic int PTRCALL 128104349Sphkprolog0(PROLOG_STATE *state, 129104349Sphk int tok, 130104349Sphk const char *ptr, 131104349Sphk const char *end, 132104349Sphk const ENCODING *enc) 133104349Sphk{ 134104349Sphk switch (tok) { 135104349Sphk case XML_TOK_PROLOG_S: 136104349Sphk state->handler = prolog1; 137104349Sphk return XML_ROLE_NONE; 138104349Sphk case XML_TOK_XML_DECL: 139104349Sphk state->handler = prolog1; 140104349Sphk return XML_ROLE_XML_DECL; 141104349Sphk case XML_TOK_PI: 142104349Sphk state->handler = prolog1; 143104349Sphk return XML_ROLE_PI; 144104349Sphk case XML_TOK_COMMENT: 145104349Sphk state->handler = prolog1; 146104349Sphk return XML_ROLE_COMMENT; 147104349Sphk case XML_TOK_BOM: 148104349Sphk return XML_ROLE_NONE; 149104349Sphk case XML_TOK_DECL_OPEN: 150104349Sphk if (!XmlNameMatchesAscii(enc, 151104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 152104349Sphk end, 153104349Sphk KW_DOCTYPE)) 154104349Sphk break; 155104349Sphk state->handler = doctype0; 156104349Sphk return XML_ROLE_DOCTYPE_NONE; 157104349Sphk case XML_TOK_INSTANCE_START: 158104349Sphk state->handler = error; 159104349Sphk return XML_ROLE_INSTANCE_START; 160104349Sphk } 161104349Sphk return common(state, tok); 162104349Sphk} 163104349Sphk 164178848Scokanestatic int PTRCALL 165104349Sphkprolog1(PROLOG_STATE *state, 166104349Sphk int tok, 167104349Sphk const char *ptr, 168104349Sphk const char *end, 169104349Sphk const ENCODING *enc) 170104349Sphk{ 171104349Sphk switch (tok) { 172104349Sphk case XML_TOK_PROLOG_S: 173104349Sphk return XML_ROLE_NONE; 174104349Sphk case XML_TOK_PI: 175104349Sphk return XML_ROLE_PI; 176104349Sphk case XML_TOK_COMMENT: 177104349Sphk return XML_ROLE_COMMENT; 178104349Sphk case XML_TOK_BOM: 179104349Sphk return XML_ROLE_NONE; 180104349Sphk case XML_TOK_DECL_OPEN: 181104349Sphk if (!XmlNameMatchesAscii(enc, 182104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 183104349Sphk end, 184104349Sphk KW_DOCTYPE)) 185104349Sphk break; 186104349Sphk state->handler = doctype0; 187104349Sphk return XML_ROLE_DOCTYPE_NONE; 188104349Sphk case XML_TOK_INSTANCE_START: 189104349Sphk state->handler = error; 190104349Sphk return XML_ROLE_INSTANCE_START; 191104349Sphk } 192104349Sphk return common(state, tok); 193104349Sphk} 194104349Sphk 195178848Scokanestatic int PTRCALL 196104349Sphkprolog2(PROLOG_STATE *state, 197104349Sphk int tok, 198104349Sphk const char *ptr, 199104349Sphk const char *end, 200104349Sphk const ENCODING *enc) 201104349Sphk{ 202104349Sphk switch (tok) { 203104349Sphk case XML_TOK_PROLOG_S: 204104349Sphk return XML_ROLE_NONE; 205104349Sphk case XML_TOK_PI: 206104349Sphk return XML_ROLE_PI; 207104349Sphk case XML_TOK_COMMENT: 208104349Sphk return XML_ROLE_COMMENT; 209104349Sphk case XML_TOK_INSTANCE_START: 210104349Sphk state->handler = error; 211104349Sphk return XML_ROLE_INSTANCE_START; 212104349Sphk } 213104349Sphk return common(state, tok); 214104349Sphk} 215104349Sphk 216178848Scokanestatic int PTRCALL 217104349Sphkdoctype0(PROLOG_STATE *state, 218104349Sphk int tok, 219104349Sphk const char *ptr, 220104349Sphk const char *end, 221104349Sphk const ENCODING *enc) 222104349Sphk{ 223104349Sphk switch (tok) { 224104349Sphk case XML_TOK_PROLOG_S: 225104349Sphk return XML_ROLE_DOCTYPE_NONE; 226104349Sphk case XML_TOK_NAME: 227104349Sphk case XML_TOK_PREFIXED_NAME: 228104349Sphk state->handler = doctype1; 229104349Sphk return XML_ROLE_DOCTYPE_NAME; 230104349Sphk } 231104349Sphk return common(state, tok); 232104349Sphk} 233104349Sphk 234178848Scokanestatic int PTRCALL 235104349Sphkdoctype1(PROLOG_STATE *state, 236104349Sphk int tok, 237104349Sphk const char *ptr, 238104349Sphk const char *end, 239104349Sphk const ENCODING *enc) 240104349Sphk{ 241104349Sphk switch (tok) { 242104349Sphk case XML_TOK_PROLOG_S: 243104349Sphk return XML_ROLE_DOCTYPE_NONE; 244104349Sphk case XML_TOK_OPEN_BRACKET: 245104349Sphk state->handler = internalSubset; 246104349Sphk return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 247104349Sphk case XML_TOK_DECL_CLOSE: 248104349Sphk state->handler = prolog2; 249104349Sphk return XML_ROLE_DOCTYPE_CLOSE; 250104349Sphk case XML_TOK_NAME: 251104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 252104349Sphk state->handler = doctype3; 253104349Sphk return XML_ROLE_DOCTYPE_NONE; 254104349Sphk } 255104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 256104349Sphk state->handler = doctype2; 257104349Sphk return XML_ROLE_DOCTYPE_NONE; 258104349Sphk } 259104349Sphk break; 260104349Sphk } 261104349Sphk return common(state, tok); 262104349Sphk} 263104349Sphk 264178848Scokanestatic int PTRCALL 265104349Sphkdoctype2(PROLOG_STATE *state, 266104349Sphk int tok, 267104349Sphk const char *ptr, 268104349Sphk const char *end, 269104349Sphk const ENCODING *enc) 270104349Sphk{ 271104349Sphk switch (tok) { 272104349Sphk case XML_TOK_PROLOG_S: 273104349Sphk return XML_ROLE_DOCTYPE_NONE; 274104349Sphk case XML_TOK_LITERAL: 275104349Sphk state->handler = doctype3; 276104349Sphk return XML_ROLE_DOCTYPE_PUBLIC_ID; 277104349Sphk } 278104349Sphk return common(state, tok); 279104349Sphk} 280104349Sphk 281178848Scokanestatic int PTRCALL 282104349Sphkdoctype3(PROLOG_STATE *state, 283104349Sphk int tok, 284104349Sphk const char *ptr, 285104349Sphk const char *end, 286104349Sphk const ENCODING *enc) 287104349Sphk{ 288104349Sphk switch (tok) { 289104349Sphk case XML_TOK_PROLOG_S: 290104349Sphk return XML_ROLE_DOCTYPE_NONE; 291104349Sphk case XML_TOK_LITERAL: 292104349Sphk state->handler = doctype4; 293104349Sphk return XML_ROLE_DOCTYPE_SYSTEM_ID; 294104349Sphk } 295104349Sphk return common(state, tok); 296104349Sphk} 297104349Sphk 298178848Scokanestatic int PTRCALL 299104349Sphkdoctype4(PROLOG_STATE *state, 300104349Sphk int tok, 301104349Sphk const char *ptr, 302104349Sphk const char *end, 303104349Sphk const ENCODING *enc) 304104349Sphk{ 305104349Sphk switch (tok) { 306104349Sphk case XML_TOK_PROLOG_S: 307104349Sphk return XML_ROLE_DOCTYPE_NONE; 308104349Sphk case XML_TOK_OPEN_BRACKET: 309104349Sphk state->handler = internalSubset; 310104349Sphk return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 311104349Sphk case XML_TOK_DECL_CLOSE: 312104349Sphk state->handler = prolog2; 313104349Sphk return XML_ROLE_DOCTYPE_CLOSE; 314104349Sphk } 315104349Sphk return common(state, tok); 316104349Sphk} 317104349Sphk 318178848Scokanestatic int PTRCALL 319104349Sphkdoctype5(PROLOG_STATE *state, 320104349Sphk int tok, 321104349Sphk const char *ptr, 322104349Sphk const char *end, 323104349Sphk const ENCODING *enc) 324104349Sphk{ 325104349Sphk switch (tok) { 326104349Sphk case XML_TOK_PROLOG_S: 327104349Sphk return XML_ROLE_DOCTYPE_NONE; 328104349Sphk case XML_TOK_DECL_CLOSE: 329104349Sphk state->handler = prolog2; 330104349Sphk return XML_ROLE_DOCTYPE_CLOSE; 331104349Sphk } 332104349Sphk return common(state, tok); 333104349Sphk} 334104349Sphk 335178848Scokanestatic int PTRCALL 336104349SphkinternalSubset(PROLOG_STATE *state, 337104349Sphk int tok, 338104349Sphk const char *ptr, 339104349Sphk const char *end, 340104349Sphk const ENCODING *enc) 341104349Sphk{ 342104349Sphk switch (tok) { 343104349Sphk case XML_TOK_PROLOG_S: 344104349Sphk return XML_ROLE_NONE; 345104349Sphk case XML_TOK_DECL_OPEN: 346104349Sphk if (XmlNameMatchesAscii(enc, 347104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 348104349Sphk end, 349104349Sphk KW_ENTITY)) { 350104349Sphk state->handler = entity0; 351104349Sphk return XML_ROLE_ENTITY_NONE; 352104349Sphk } 353104349Sphk if (XmlNameMatchesAscii(enc, 354104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 355104349Sphk end, 356104349Sphk KW_ATTLIST)) { 357104349Sphk state->handler = attlist0; 358104349Sphk return XML_ROLE_ATTLIST_NONE; 359104349Sphk } 360104349Sphk if (XmlNameMatchesAscii(enc, 361104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 362104349Sphk end, 363104349Sphk KW_ELEMENT)) { 364104349Sphk state->handler = element0; 365104349Sphk return XML_ROLE_ELEMENT_NONE; 366104349Sphk } 367104349Sphk if (XmlNameMatchesAscii(enc, 368104349Sphk ptr + 2 * MIN_BYTES_PER_CHAR(enc), 369104349Sphk end, 370104349Sphk KW_NOTATION)) { 371104349Sphk state->handler = notation0; 372104349Sphk return XML_ROLE_NOTATION_NONE; 373104349Sphk } 374104349Sphk break; 375104349Sphk case XML_TOK_PI: 376104349Sphk return XML_ROLE_PI; 377104349Sphk case XML_TOK_COMMENT: 378104349Sphk return XML_ROLE_COMMENT; 379104349Sphk case XML_TOK_PARAM_ENTITY_REF: 380104349Sphk return XML_ROLE_PARAM_ENTITY_REF; 381104349Sphk case XML_TOK_CLOSE_BRACKET: 382104349Sphk state->handler = doctype5; 383104349Sphk return XML_ROLE_DOCTYPE_NONE; 384178848Scokane case XML_TOK_NONE: 385178848Scokane return XML_ROLE_NONE; 386104349Sphk } 387104349Sphk return common(state, tok); 388104349Sphk} 389104349Sphk 390104349Sphk#ifdef XML_DTD 391104349Sphk 392178848Scokanestatic int PTRCALL 393104349SphkexternalSubset0(PROLOG_STATE *state, 394104349Sphk int tok, 395104349Sphk const char *ptr, 396104349Sphk const char *end, 397104349Sphk const ENCODING *enc) 398104349Sphk{ 399104349Sphk state->handler = externalSubset1; 400104349Sphk if (tok == XML_TOK_XML_DECL) 401104349Sphk return XML_ROLE_TEXT_DECL; 402104349Sphk return externalSubset1(state, tok, ptr, end, enc); 403104349Sphk} 404104349Sphk 405178848Scokanestatic int PTRCALL 406104349SphkexternalSubset1(PROLOG_STATE *state, 407104349Sphk int tok, 408104349Sphk const char *ptr, 409104349Sphk const char *end, 410104349Sphk const ENCODING *enc) 411104349Sphk{ 412104349Sphk switch (tok) { 413104349Sphk case XML_TOK_COND_SECT_OPEN: 414104349Sphk state->handler = condSect0; 415104349Sphk return XML_ROLE_NONE; 416104349Sphk case XML_TOK_COND_SECT_CLOSE: 417104349Sphk if (state->includeLevel == 0) 418104349Sphk break; 419104349Sphk state->includeLevel -= 1; 420104349Sphk return XML_ROLE_NONE; 421104349Sphk case XML_TOK_PROLOG_S: 422104349Sphk return XML_ROLE_NONE; 423104349Sphk case XML_TOK_CLOSE_BRACKET: 424104349Sphk break; 425104349Sphk case XML_TOK_NONE: 426104349Sphk if (state->includeLevel) 427104349Sphk break; 428104349Sphk return XML_ROLE_NONE; 429104349Sphk default: 430104349Sphk return internalSubset(state, tok, ptr, end, enc); 431104349Sphk } 432104349Sphk return common(state, tok); 433104349Sphk} 434104349Sphk 435104349Sphk#endif /* XML_DTD */ 436104349Sphk 437178848Scokanestatic int PTRCALL 438104349Sphkentity0(PROLOG_STATE *state, 439104349Sphk int tok, 440104349Sphk const char *ptr, 441104349Sphk const char *end, 442104349Sphk const ENCODING *enc) 443104349Sphk{ 444104349Sphk switch (tok) { 445104349Sphk case XML_TOK_PROLOG_S: 446104349Sphk return XML_ROLE_ENTITY_NONE; 447104349Sphk case XML_TOK_PERCENT: 448104349Sphk state->handler = entity1; 449104349Sphk return XML_ROLE_ENTITY_NONE; 450104349Sphk case XML_TOK_NAME: 451104349Sphk state->handler = entity2; 452104349Sphk return XML_ROLE_GENERAL_ENTITY_NAME; 453104349Sphk } 454104349Sphk return common(state, tok); 455104349Sphk} 456104349Sphk 457178848Scokanestatic int PTRCALL 458104349Sphkentity1(PROLOG_STATE *state, 459104349Sphk int tok, 460104349Sphk const char *ptr, 461104349Sphk const char *end, 462104349Sphk const ENCODING *enc) 463104349Sphk{ 464104349Sphk switch (tok) { 465104349Sphk case XML_TOK_PROLOG_S: 466104349Sphk return XML_ROLE_ENTITY_NONE; 467104349Sphk case XML_TOK_NAME: 468104349Sphk state->handler = entity7; 469104349Sphk return XML_ROLE_PARAM_ENTITY_NAME; 470104349Sphk } 471104349Sphk return common(state, tok); 472104349Sphk} 473104349Sphk 474178848Scokanestatic int PTRCALL 475104349Sphkentity2(PROLOG_STATE *state, 476104349Sphk int tok, 477104349Sphk const char *ptr, 478104349Sphk const char *end, 479104349Sphk const ENCODING *enc) 480104349Sphk{ 481104349Sphk switch (tok) { 482104349Sphk case XML_TOK_PROLOG_S: 483104349Sphk return XML_ROLE_ENTITY_NONE; 484104349Sphk case XML_TOK_NAME: 485104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 486104349Sphk state->handler = entity4; 487104349Sphk return XML_ROLE_ENTITY_NONE; 488104349Sphk } 489104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 490104349Sphk state->handler = entity3; 491104349Sphk return XML_ROLE_ENTITY_NONE; 492104349Sphk } 493104349Sphk break; 494104349Sphk case XML_TOK_LITERAL: 495104349Sphk state->handler = declClose; 496104349Sphk state->role_none = XML_ROLE_ENTITY_NONE; 497104349Sphk return XML_ROLE_ENTITY_VALUE; 498104349Sphk } 499104349Sphk return common(state, tok); 500104349Sphk} 501104349Sphk 502178848Scokanestatic int PTRCALL 503104349Sphkentity3(PROLOG_STATE *state, 504104349Sphk int tok, 505104349Sphk const char *ptr, 506104349Sphk const char *end, 507104349Sphk const ENCODING *enc) 508104349Sphk{ 509104349Sphk switch (tok) { 510104349Sphk case XML_TOK_PROLOG_S: 511104349Sphk return XML_ROLE_ENTITY_NONE; 512104349Sphk case XML_TOK_LITERAL: 513104349Sphk state->handler = entity4; 514104349Sphk return XML_ROLE_ENTITY_PUBLIC_ID; 515104349Sphk } 516104349Sphk return common(state, tok); 517104349Sphk} 518104349Sphk 519178848Scokanestatic int PTRCALL 520104349Sphkentity4(PROLOG_STATE *state, 521104349Sphk int tok, 522104349Sphk const char *ptr, 523104349Sphk const char *end, 524104349Sphk const ENCODING *enc) 525104349Sphk{ 526104349Sphk switch (tok) { 527104349Sphk case XML_TOK_PROLOG_S: 528104349Sphk return XML_ROLE_ENTITY_NONE; 529104349Sphk case XML_TOK_LITERAL: 530104349Sphk state->handler = entity5; 531104349Sphk return XML_ROLE_ENTITY_SYSTEM_ID; 532104349Sphk } 533104349Sphk return common(state, tok); 534104349Sphk} 535104349Sphk 536178848Scokanestatic int PTRCALL 537104349Sphkentity5(PROLOG_STATE *state, 538104349Sphk int tok, 539104349Sphk const char *ptr, 540104349Sphk const char *end, 541104349Sphk const ENCODING *enc) 542104349Sphk{ 543104349Sphk switch (tok) { 544104349Sphk case XML_TOK_PROLOG_S: 545104349Sphk return XML_ROLE_ENTITY_NONE; 546104349Sphk case XML_TOK_DECL_CLOSE: 547104349Sphk setTopLevel(state); 548104349Sphk return XML_ROLE_ENTITY_COMPLETE; 549104349Sphk case XML_TOK_NAME: 550104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { 551104349Sphk state->handler = entity6; 552104349Sphk return XML_ROLE_ENTITY_NONE; 553104349Sphk } 554104349Sphk break; 555104349Sphk } 556104349Sphk return common(state, tok); 557104349Sphk} 558104349Sphk 559178848Scokanestatic int PTRCALL 560104349Sphkentity6(PROLOG_STATE *state, 561104349Sphk int tok, 562104349Sphk const char *ptr, 563104349Sphk const char *end, 564104349Sphk const ENCODING *enc) 565104349Sphk{ 566104349Sphk switch (tok) { 567104349Sphk case XML_TOK_PROLOG_S: 568104349Sphk return XML_ROLE_ENTITY_NONE; 569104349Sphk case XML_TOK_NAME: 570104349Sphk state->handler = declClose; 571104349Sphk state->role_none = XML_ROLE_ENTITY_NONE; 572104349Sphk return XML_ROLE_ENTITY_NOTATION_NAME; 573104349Sphk } 574104349Sphk return common(state, tok); 575104349Sphk} 576104349Sphk 577178848Scokanestatic int PTRCALL 578104349Sphkentity7(PROLOG_STATE *state, 579104349Sphk int tok, 580104349Sphk const char *ptr, 581104349Sphk const char *end, 582104349Sphk const ENCODING *enc) 583104349Sphk{ 584104349Sphk switch (tok) { 585104349Sphk case XML_TOK_PROLOG_S: 586104349Sphk return XML_ROLE_ENTITY_NONE; 587104349Sphk case XML_TOK_NAME: 588104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 589104349Sphk state->handler = entity9; 590104349Sphk return XML_ROLE_ENTITY_NONE; 591104349Sphk } 592104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 593104349Sphk state->handler = entity8; 594104349Sphk return XML_ROLE_ENTITY_NONE; 595104349Sphk } 596104349Sphk break; 597104349Sphk case XML_TOK_LITERAL: 598104349Sphk state->handler = declClose; 599104349Sphk state->role_none = XML_ROLE_ENTITY_NONE; 600104349Sphk return XML_ROLE_ENTITY_VALUE; 601104349Sphk } 602104349Sphk return common(state, tok); 603104349Sphk} 604104349Sphk 605178848Scokanestatic int PTRCALL 606104349Sphkentity8(PROLOG_STATE *state, 607104349Sphk int tok, 608104349Sphk const char *ptr, 609104349Sphk const char *end, 610104349Sphk const ENCODING *enc) 611104349Sphk{ 612104349Sphk switch (tok) { 613104349Sphk case XML_TOK_PROLOG_S: 614104349Sphk return XML_ROLE_ENTITY_NONE; 615104349Sphk case XML_TOK_LITERAL: 616104349Sphk state->handler = entity9; 617104349Sphk return XML_ROLE_ENTITY_PUBLIC_ID; 618104349Sphk } 619104349Sphk return common(state, tok); 620104349Sphk} 621104349Sphk 622178848Scokanestatic int PTRCALL 623104349Sphkentity9(PROLOG_STATE *state, 624104349Sphk int tok, 625104349Sphk const char *ptr, 626104349Sphk const char *end, 627104349Sphk const ENCODING *enc) 628104349Sphk{ 629104349Sphk switch (tok) { 630104349Sphk case XML_TOK_PROLOG_S: 631104349Sphk return XML_ROLE_ENTITY_NONE; 632104349Sphk case XML_TOK_LITERAL: 633104349Sphk state->handler = entity10; 634104349Sphk return XML_ROLE_ENTITY_SYSTEM_ID; 635104349Sphk } 636104349Sphk return common(state, tok); 637104349Sphk} 638104349Sphk 639178848Scokanestatic int PTRCALL 640104349Sphkentity10(PROLOG_STATE *state, 641104349Sphk int tok, 642104349Sphk const char *ptr, 643104349Sphk const char *end, 644104349Sphk const ENCODING *enc) 645104349Sphk{ 646104349Sphk switch (tok) { 647104349Sphk case XML_TOK_PROLOG_S: 648104349Sphk return XML_ROLE_ENTITY_NONE; 649104349Sphk case XML_TOK_DECL_CLOSE: 650104349Sphk setTopLevel(state); 651104349Sphk return XML_ROLE_ENTITY_COMPLETE; 652104349Sphk } 653104349Sphk return common(state, tok); 654104349Sphk} 655104349Sphk 656178848Scokanestatic int PTRCALL 657104349Sphknotation0(PROLOG_STATE *state, 658104349Sphk int tok, 659104349Sphk const char *ptr, 660104349Sphk const char *end, 661104349Sphk const ENCODING *enc) 662104349Sphk{ 663104349Sphk switch (tok) { 664104349Sphk case XML_TOK_PROLOG_S: 665104349Sphk return XML_ROLE_NOTATION_NONE; 666104349Sphk case XML_TOK_NAME: 667104349Sphk state->handler = notation1; 668104349Sphk return XML_ROLE_NOTATION_NAME; 669104349Sphk } 670104349Sphk return common(state, tok); 671104349Sphk} 672104349Sphk 673178848Scokanestatic int PTRCALL 674104349Sphknotation1(PROLOG_STATE *state, 675104349Sphk int tok, 676104349Sphk const char *ptr, 677104349Sphk const char *end, 678104349Sphk const ENCODING *enc) 679104349Sphk{ 680104349Sphk switch (tok) { 681104349Sphk case XML_TOK_PROLOG_S: 682104349Sphk return XML_ROLE_NOTATION_NONE; 683104349Sphk case XML_TOK_NAME: 684104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 685104349Sphk state->handler = notation3; 686104349Sphk return XML_ROLE_NOTATION_NONE; 687104349Sphk } 688104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 689104349Sphk state->handler = notation2; 690104349Sphk return XML_ROLE_NOTATION_NONE; 691104349Sphk } 692104349Sphk break; 693104349Sphk } 694104349Sphk return common(state, tok); 695104349Sphk} 696104349Sphk 697178848Scokanestatic int PTRCALL 698104349Sphknotation2(PROLOG_STATE *state, 699104349Sphk int tok, 700104349Sphk const char *ptr, 701104349Sphk const char *end, 702104349Sphk const ENCODING *enc) 703104349Sphk{ 704104349Sphk switch (tok) { 705104349Sphk case XML_TOK_PROLOG_S: 706104349Sphk return XML_ROLE_NOTATION_NONE; 707104349Sphk case XML_TOK_LITERAL: 708104349Sphk state->handler = notation4; 709104349Sphk return XML_ROLE_NOTATION_PUBLIC_ID; 710104349Sphk } 711104349Sphk return common(state, tok); 712104349Sphk} 713104349Sphk 714178848Scokanestatic int PTRCALL 715104349Sphknotation3(PROLOG_STATE *state, 716104349Sphk int tok, 717104349Sphk const char *ptr, 718104349Sphk const char *end, 719104349Sphk const ENCODING *enc) 720104349Sphk{ 721104349Sphk switch (tok) { 722104349Sphk case XML_TOK_PROLOG_S: 723104349Sphk return XML_ROLE_NOTATION_NONE; 724104349Sphk case XML_TOK_LITERAL: 725104349Sphk state->handler = declClose; 726104349Sphk state->role_none = XML_ROLE_NOTATION_NONE; 727104349Sphk return XML_ROLE_NOTATION_SYSTEM_ID; 728104349Sphk } 729104349Sphk return common(state, tok); 730104349Sphk} 731104349Sphk 732178848Scokanestatic int PTRCALL 733104349Sphknotation4(PROLOG_STATE *state, 734104349Sphk int tok, 735104349Sphk const char *ptr, 736104349Sphk const char *end, 737104349Sphk const ENCODING *enc) 738104349Sphk{ 739104349Sphk switch (tok) { 740104349Sphk case XML_TOK_PROLOG_S: 741104349Sphk return XML_ROLE_NOTATION_NONE; 742104349Sphk case XML_TOK_LITERAL: 743104349Sphk state->handler = declClose; 744104349Sphk state->role_none = XML_ROLE_NOTATION_NONE; 745104349Sphk return XML_ROLE_NOTATION_SYSTEM_ID; 746104349Sphk case XML_TOK_DECL_CLOSE: 747104349Sphk setTopLevel(state); 748104349Sphk return XML_ROLE_NOTATION_NO_SYSTEM_ID; 749104349Sphk } 750104349Sphk return common(state, tok); 751104349Sphk} 752104349Sphk 753178848Scokanestatic int PTRCALL 754104349Sphkattlist0(PROLOG_STATE *state, 755104349Sphk int tok, 756104349Sphk const char *ptr, 757104349Sphk const char *end, 758104349Sphk const ENCODING *enc) 759104349Sphk{ 760104349Sphk switch (tok) { 761104349Sphk case XML_TOK_PROLOG_S: 762104349Sphk return XML_ROLE_ATTLIST_NONE; 763104349Sphk case XML_TOK_NAME: 764104349Sphk case XML_TOK_PREFIXED_NAME: 765104349Sphk state->handler = attlist1; 766104349Sphk return XML_ROLE_ATTLIST_ELEMENT_NAME; 767104349Sphk } 768104349Sphk return common(state, tok); 769104349Sphk} 770104349Sphk 771178848Scokanestatic int PTRCALL 772104349Sphkattlist1(PROLOG_STATE *state, 773104349Sphk int tok, 774104349Sphk const char *ptr, 775104349Sphk const char *end, 776104349Sphk const ENCODING *enc) 777104349Sphk{ 778104349Sphk switch (tok) { 779104349Sphk case XML_TOK_PROLOG_S: 780104349Sphk return XML_ROLE_ATTLIST_NONE; 781104349Sphk case XML_TOK_DECL_CLOSE: 782104349Sphk setTopLevel(state); 783104349Sphk return XML_ROLE_ATTLIST_NONE; 784104349Sphk case XML_TOK_NAME: 785104349Sphk case XML_TOK_PREFIXED_NAME: 786104349Sphk state->handler = attlist2; 787104349Sphk return XML_ROLE_ATTRIBUTE_NAME; 788104349Sphk } 789104349Sphk return common(state, tok); 790104349Sphk} 791104349Sphk 792178848Scokanestatic int PTRCALL 793104349Sphkattlist2(PROLOG_STATE *state, 794104349Sphk int tok, 795104349Sphk const char *ptr, 796104349Sphk const char *end, 797104349Sphk const ENCODING *enc) 798104349Sphk{ 799104349Sphk switch (tok) { 800104349Sphk case XML_TOK_PROLOG_S: 801104349Sphk return XML_ROLE_ATTLIST_NONE; 802104349Sphk case XML_TOK_NAME: 803104349Sphk { 804178848Scokane static const char * const types[] = { 805104349Sphk KW_CDATA, 806104349Sphk KW_ID, 807104349Sphk KW_IDREF, 808104349Sphk KW_IDREFS, 809104349Sphk KW_ENTITY, 810104349Sphk KW_ENTITIES, 811104349Sphk KW_NMTOKEN, 812104349Sphk KW_NMTOKENS, 813104349Sphk }; 814104349Sphk int i; 815104349Sphk for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) 816104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { 817104349Sphk state->handler = attlist8; 818104349Sphk return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; 819104349Sphk } 820104349Sphk } 821104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { 822104349Sphk state->handler = attlist5; 823104349Sphk return XML_ROLE_ATTLIST_NONE; 824104349Sphk } 825104349Sphk break; 826104349Sphk case XML_TOK_OPEN_PAREN: 827104349Sphk state->handler = attlist3; 828104349Sphk return XML_ROLE_ATTLIST_NONE; 829104349Sphk } 830104349Sphk return common(state, tok); 831104349Sphk} 832104349Sphk 833178848Scokanestatic int PTRCALL 834104349Sphkattlist3(PROLOG_STATE *state, 835104349Sphk int tok, 836104349Sphk const char *ptr, 837104349Sphk const char *end, 838104349Sphk const ENCODING *enc) 839104349Sphk{ 840104349Sphk switch (tok) { 841104349Sphk case XML_TOK_PROLOG_S: 842104349Sphk return XML_ROLE_ATTLIST_NONE; 843104349Sphk case XML_TOK_NMTOKEN: 844104349Sphk case XML_TOK_NAME: 845104349Sphk case XML_TOK_PREFIXED_NAME: 846104349Sphk state->handler = attlist4; 847104349Sphk return XML_ROLE_ATTRIBUTE_ENUM_VALUE; 848104349Sphk } 849104349Sphk return common(state, tok); 850104349Sphk} 851104349Sphk 852178848Scokanestatic int PTRCALL 853104349Sphkattlist4(PROLOG_STATE *state, 854104349Sphk int tok, 855104349Sphk const char *ptr, 856104349Sphk const char *end, 857104349Sphk const ENCODING *enc) 858104349Sphk{ 859104349Sphk switch (tok) { 860104349Sphk case XML_TOK_PROLOG_S: 861104349Sphk return XML_ROLE_ATTLIST_NONE; 862104349Sphk case XML_TOK_CLOSE_PAREN: 863104349Sphk state->handler = attlist8; 864104349Sphk return XML_ROLE_ATTLIST_NONE; 865104349Sphk case XML_TOK_OR: 866104349Sphk state->handler = attlist3; 867104349Sphk return XML_ROLE_ATTLIST_NONE; 868104349Sphk } 869104349Sphk return common(state, tok); 870104349Sphk} 871104349Sphk 872178848Scokanestatic int PTRCALL 873104349Sphkattlist5(PROLOG_STATE *state, 874104349Sphk int tok, 875104349Sphk const char *ptr, 876104349Sphk const char *end, 877104349Sphk const ENCODING *enc) 878104349Sphk{ 879104349Sphk switch (tok) { 880104349Sphk case XML_TOK_PROLOG_S: 881104349Sphk return XML_ROLE_ATTLIST_NONE; 882104349Sphk case XML_TOK_OPEN_PAREN: 883104349Sphk state->handler = attlist6; 884104349Sphk return XML_ROLE_ATTLIST_NONE; 885104349Sphk } 886104349Sphk return common(state, tok); 887104349Sphk} 888104349Sphk 889178848Scokanestatic int PTRCALL 890104349Sphkattlist6(PROLOG_STATE *state, 891104349Sphk int tok, 892104349Sphk const char *ptr, 893104349Sphk const char *end, 894104349Sphk const ENCODING *enc) 895104349Sphk{ 896104349Sphk switch (tok) { 897104349Sphk case XML_TOK_PROLOG_S: 898104349Sphk return XML_ROLE_ATTLIST_NONE; 899104349Sphk case XML_TOK_NAME: 900104349Sphk state->handler = attlist7; 901104349Sphk return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; 902104349Sphk } 903104349Sphk return common(state, tok); 904104349Sphk} 905104349Sphk 906178848Scokanestatic int PTRCALL 907104349Sphkattlist7(PROLOG_STATE *state, 908104349Sphk int tok, 909104349Sphk const char *ptr, 910104349Sphk const char *end, 911104349Sphk const ENCODING *enc) 912104349Sphk{ 913104349Sphk switch (tok) { 914104349Sphk case XML_TOK_PROLOG_S: 915104349Sphk return XML_ROLE_ATTLIST_NONE; 916104349Sphk case XML_TOK_CLOSE_PAREN: 917104349Sphk state->handler = attlist8; 918104349Sphk return XML_ROLE_ATTLIST_NONE; 919104349Sphk case XML_TOK_OR: 920104349Sphk state->handler = attlist6; 921104349Sphk return XML_ROLE_ATTLIST_NONE; 922104349Sphk } 923104349Sphk return common(state, tok); 924104349Sphk} 925104349Sphk 926104349Sphk/* default value */ 927178848Scokanestatic int PTRCALL 928104349Sphkattlist8(PROLOG_STATE *state, 929104349Sphk int tok, 930104349Sphk const char *ptr, 931104349Sphk const char *end, 932104349Sphk const ENCODING *enc) 933104349Sphk{ 934104349Sphk switch (tok) { 935104349Sphk case XML_TOK_PROLOG_S: 936104349Sphk return XML_ROLE_ATTLIST_NONE; 937104349Sphk case XML_TOK_POUND_NAME: 938104349Sphk if (XmlNameMatchesAscii(enc, 939104349Sphk ptr + MIN_BYTES_PER_CHAR(enc), 940104349Sphk end, 941104349Sphk KW_IMPLIED)) { 942104349Sphk state->handler = attlist1; 943104349Sphk return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; 944104349Sphk } 945104349Sphk if (XmlNameMatchesAscii(enc, 946104349Sphk ptr + MIN_BYTES_PER_CHAR(enc), 947104349Sphk end, 948104349Sphk KW_REQUIRED)) { 949104349Sphk state->handler = attlist1; 950104349Sphk return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; 951104349Sphk } 952104349Sphk if (XmlNameMatchesAscii(enc, 953104349Sphk ptr + MIN_BYTES_PER_CHAR(enc), 954104349Sphk end, 955104349Sphk KW_FIXED)) { 956104349Sphk state->handler = attlist9; 957104349Sphk return XML_ROLE_ATTLIST_NONE; 958104349Sphk } 959104349Sphk break; 960104349Sphk case XML_TOK_LITERAL: 961104349Sphk state->handler = attlist1; 962104349Sphk return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; 963104349Sphk } 964104349Sphk return common(state, tok); 965104349Sphk} 966104349Sphk 967178848Scokanestatic int PTRCALL 968104349Sphkattlist9(PROLOG_STATE *state, 969104349Sphk int tok, 970104349Sphk const char *ptr, 971104349Sphk const char *end, 972104349Sphk const ENCODING *enc) 973104349Sphk{ 974104349Sphk switch (tok) { 975104349Sphk case XML_TOK_PROLOG_S: 976104349Sphk return XML_ROLE_ATTLIST_NONE; 977104349Sphk case XML_TOK_LITERAL: 978104349Sphk state->handler = attlist1; 979104349Sphk return XML_ROLE_FIXED_ATTRIBUTE_VALUE; 980104349Sphk } 981104349Sphk return common(state, tok); 982104349Sphk} 983104349Sphk 984178848Scokanestatic int PTRCALL 985104349Sphkelement0(PROLOG_STATE *state, 986104349Sphk int tok, 987104349Sphk const char *ptr, 988104349Sphk const char *end, 989104349Sphk const ENCODING *enc) 990104349Sphk{ 991104349Sphk switch (tok) { 992104349Sphk case XML_TOK_PROLOG_S: 993104349Sphk return XML_ROLE_ELEMENT_NONE; 994104349Sphk case XML_TOK_NAME: 995104349Sphk case XML_TOK_PREFIXED_NAME: 996104349Sphk state->handler = element1; 997104349Sphk return XML_ROLE_ELEMENT_NAME; 998104349Sphk } 999104349Sphk return common(state, tok); 1000104349Sphk} 1001104349Sphk 1002178848Scokanestatic int PTRCALL 1003104349Sphkelement1(PROLOG_STATE *state, 1004104349Sphk int tok, 1005104349Sphk const char *ptr, 1006104349Sphk const char *end, 1007104349Sphk const ENCODING *enc) 1008104349Sphk{ 1009104349Sphk switch (tok) { 1010104349Sphk case XML_TOK_PROLOG_S: 1011104349Sphk return XML_ROLE_ELEMENT_NONE; 1012104349Sphk case XML_TOK_NAME: 1013104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { 1014104349Sphk state->handler = declClose; 1015104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1016104349Sphk return XML_ROLE_CONTENT_EMPTY; 1017104349Sphk } 1018104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { 1019104349Sphk state->handler = declClose; 1020104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1021104349Sphk return XML_ROLE_CONTENT_ANY; 1022104349Sphk } 1023104349Sphk break; 1024104349Sphk case XML_TOK_OPEN_PAREN: 1025104349Sphk state->handler = element2; 1026104349Sphk state->level = 1; 1027104349Sphk return XML_ROLE_GROUP_OPEN; 1028104349Sphk } 1029104349Sphk return common(state, tok); 1030104349Sphk} 1031104349Sphk 1032178848Scokanestatic int PTRCALL 1033104349Sphkelement2(PROLOG_STATE *state, 1034104349Sphk int tok, 1035104349Sphk const char *ptr, 1036104349Sphk const char *end, 1037104349Sphk const ENCODING *enc) 1038104349Sphk{ 1039104349Sphk switch (tok) { 1040104349Sphk case XML_TOK_PROLOG_S: 1041104349Sphk return XML_ROLE_ELEMENT_NONE; 1042104349Sphk case XML_TOK_POUND_NAME: 1043104349Sphk if (XmlNameMatchesAscii(enc, 1044104349Sphk ptr + MIN_BYTES_PER_CHAR(enc), 1045104349Sphk end, 1046104349Sphk KW_PCDATA)) { 1047104349Sphk state->handler = element3; 1048104349Sphk return XML_ROLE_CONTENT_PCDATA; 1049104349Sphk } 1050104349Sphk break; 1051104349Sphk case XML_TOK_OPEN_PAREN: 1052104349Sphk state->level = 2; 1053104349Sphk state->handler = element6; 1054104349Sphk return XML_ROLE_GROUP_OPEN; 1055104349Sphk case XML_TOK_NAME: 1056104349Sphk case XML_TOK_PREFIXED_NAME: 1057104349Sphk state->handler = element7; 1058104349Sphk return XML_ROLE_CONTENT_ELEMENT; 1059104349Sphk case XML_TOK_NAME_QUESTION: 1060104349Sphk state->handler = element7; 1061104349Sphk return XML_ROLE_CONTENT_ELEMENT_OPT; 1062104349Sphk case XML_TOK_NAME_ASTERISK: 1063104349Sphk state->handler = element7; 1064104349Sphk return XML_ROLE_CONTENT_ELEMENT_REP; 1065104349Sphk case XML_TOK_NAME_PLUS: 1066104349Sphk state->handler = element7; 1067104349Sphk return XML_ROLE_CONTENT_ELEMENT_PLUS; 1068104349Sphk } 1069104349Sphk return common(state, tok); 1070104349Sphk} 1071104349Sphk 1072178848Scokanestatic int PTRCALL 1073104349Sphkelement3(PROLOG_STATE *state, 1074104349Sphk int tok, 1075104349Sphk const char *ptr, 1076104349Sphk const char *end, 1077104349Sphk const ENCODING *enc) 1078104349Sphk{ 1079104349Sphk switch (tok) { 1080104349Sphk case XML_TOK_PROLOG_S: 1081104349Sphk return XML_ROLE_ELEMENT_NONE; 1082104349Sphk case XML_TOK_CLOSE_PAREN: 1083104349Sphk state->handler = declClose; 1084104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1085104349Sphk return XML_ROLE_GROUP_CLOSE; 1086104349Sphk case XML_TOK_CLOSE_PAREN_ASTERISK: 1087104349Sphk state->handler = declClose; 1088104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1089104349Sphk return XML_ROLE_GROUP_CLOSE_REP; 1090104349Sphk case XML_TOK_OR: 1091104349Sphk state->handler = element4; 1092104349Sphk return XML_ROLE_ELEMENT_NONE; 1093104349Sphk } 1094104349Sphk return common(state, tok); 1095104349Sphk} 1096104349Sphk 1097178848Scokanestatic int PTRCALL 1098104349Sphkelement4(PROLOG_STATE *state, 1099104349Sphk int tok, 1100104349Sphk const char *ptr, 1101104349Sphk const char *end, 1102104349Sphk const ENCODING *enc) 1103104349Sphk{ 1104104349Sphk switch (tok) { 1105104349Sphk case XML_TOK_PROLOG_S: 1106104349Sphk return XML_ROLE_ELEMENT_NONE; 1107104349Sphk case XML_TOK_NAME: 1108104349Sphk case XML_TOK_PREFIXED_NAME: 1109104349Sphk state->handler = element5; 1110104349Sphk return XML_ROLE_CONTENT_ELEMENT; 1111104349Sphk } 1112104349Sphk return common(state, tok); 1113104349Sphk} 1114104349Sphk 1115178848Scokanestatic int PTRCALL 1116104349Sphkelement5(PROLOG_STATE *state, 1117104349Sphk int tok, 1118104349Sphk const char *ptr, 1119104349Sphk const char *end, 1120104349Sphk const ENCODING *enc) 1121104349Sphk{ 1122104349Sphk switch (tok) { 1123104349Sphk case XML_TOK_PROLOG_S: 1124104349Sphk return XML_ROLE_ELEMENT_NONE; 1125104349Sphk case XML_TOK_CLOSE_PAREN_ASTERISK: 1126104349Sphk state->handler = declClose; 1127104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1128104349Sphk return XML_ROLE_GROUP_CLOSE_REP; 1129104349Sphk case XML_TOK_OR: 1130104349Sphk state->handler = element4; 1131104349Sphk return XML_ROLE_ELEMENT_NONE; 1132104349Sphk } 1133104349Sphk return common(state, tok); 1134104349Sphk} 1135104349Sphk 1136178848Scokanestatic int PTRCALL 1137104349Sphkelement6(PROLOG_STATE *state, 1138104349Sphk int tok, 1139104349Sphk const char *ptr, 1140104349Sphk const char *end, 1141104349Sphk const ENCODING *enc) 1142104349Sphk{ 1143104349Sphk switch (tok) { 1144104349Sphk case XML_TOK_PROLOG_S: 1145104349Sphk return XML_ROLE_ELEMENT_NONE; 1146104349Sphk case XML_TOK_OPEN_PAREN: 1147104349Sphk state->level += 1; 1148104349Sphk return XML_ROLE_GROUP_OPEN; 1149104349Sphk case XML_TOK_NAME: 1150104349Sphk case XML_TOK_PREFIXED_NAME: 1151104349Sphk state->handler = element7; 1152104349Sphk return XML_ROLE_CONTENT_ELEMENT; 1153104349Sphk case XML_TOK_NAME_QUESTION: 1154104349Sphk state->handler = element7; 1155104349Sphk return XML_ROLE_CONTENT_ELEMENT_OPT; 1156104349Sphk case XML_TOK_NAME_ASTERISK: 1157104349Sphk state->handler = element7; 1158104349Sphk return XML_ROLE_CONTENT_ELEMENT_REP; 1159104349Sphk case XML_TOK_NAME_PLUS: 1160104349Sphk state->handler = element7; 1161104349Sphk return XML_ROLE_CONTENT_ELEMENT_PLUS; 1162104349Sphk } 1163104349Sphk return common(state, tok); 1164104349Sphk} 1165104349Sphk 1166178848Scokanestatic int PTRCALL 1167104349Sphkelement7(PROLOG_STATE *state, 1168104349Sphk int tok, 1169104349Sphk const char *ptr, 1170104349Sphk const char *end, 1171104349Sphk const ENCODING *enc) 1172104349Sphk{ 1173104349Sphk switch (tok) { 1174104349Sphk case XML_TOK_PROLOG_S: 1175104349Sphk return XML_ROLE_ELEMENT_NONE; 1176104349Sphk case XML_TOK_CLOSE_PAREN: 1177104349Sphk state->level -= 1; 1178104349Sphk if (state->level == 0) { 1179104349Sphk state->handler = declClose; 1180104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1181104349Sphk } 1182104349Sphk return XML_ROLE_GROUP_CLOSE; 1183104349Sphk case XML_TOK_CLOSE_PAREN_ASTERISK: 1184104349Sphk state->level -= 1; 1185104349Sphk if (state->level == 0) { 1186104349Sphk state->handler = declClose; 1187104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1188104349Sphk } 1189104349Sphk return XML_ROLE_GROUP_CLOSE_REP; 1190104349Sphk case XML_TOK_CLOSE_PAREN_QUESTION: 1191104349Sphk state->level -= 1; 1192104349Sphk if (state->level == 0) { 1193104349Sphk state->handler = declClose; 1194104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1195104349Sphk } 1196104349Sphk return XML_ROLE_GROUP_CLOSE_OPT; 1197104349Sphk case XML_TOK_CLOSE_PAREN_PLUS: 1198104349Sphk state->level -= 1; 1199104349Sphk if (state->level == 0) { 1200104349Sphk state->handler = declClose; 1201104349Sphk state->role_none = XML_ROLE_ELEMENT_NONE; 1202104349Sphk } 1203104349Sphk return XML_ROLE_GROUP_CLOSE_PLUS; 1204104349Sphk case XML_TOK_COMMA: 1205104349Sphk state->handler = element6; 1206104349Sphk return XML_ROLE_GROUP_SEQUENCE; 1207104349Sphk case XML_TOK_OR: 1208104349Sphk state->handler = element6; 1209104349Sphk return XML_ROLE_GROUP_CHOICE; 1210104349Sphk } 1211104349Sphk return common(state, tok); 1212104349Sphk} 1213104349Sphk 1214104349Sphk#ifdef XML_DTD 1215104349Sphk 1216178848Scokanestatic int PTRCALL 1217104349SphkcondSect0(PROLOG_STATE *state, 1218104349Sphk int tok, 1219104349Sphk const char *ptr, 1220104349Sphk const char *end, 1221104349Sphk const ENCODING *enc) 1222104349Sphk{ 1223104349Sphk switch (tok) { 1224104349Sphk case XML_TOK_PROLOG_S: 1225104349Sphk return XML_ROLE_NONE; 1226104349Sphk case XML_TOK_NAME: 1227104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { 1228104349Sphk state->handler = condSect1; 1229104349Sphk return XML_ROLE_NONE; 1230104349Sphk } 1231104349Sphk if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { 1232104349Sphk state->handler = condSect2; 1233104349Sphk return XML_ROLE_NONE; 1234104349Sphk } 1235104349Sphk break; 1236104349Sphk } 1237104349Sphk return common(state, tok); 1238104349Sphk} 1239104349Sphk 1240178848Scokanestatic int PTRCALL 1241104349SphkcondSect1(PROLOG_STATE *state, 1242104349Sphk int tok, 1243104349Sphk const char *ptr, 1244104349Sphk const char *end, 1245104349Sphk const ENCODING *enc) 1246104349Sphk{ 1247104349Sphk switch (tok) { 1248104349Sphk case XML_TOK_PROLOG_S: 1249104349Sphk return XML_ROLE_NONE; 1250104349Sphk case XML_TOK_OPEN_BRACKET: 1251104349Sphk state->handler = externalSubset1; 1252104349Sphk state->includeLevel += 1; 1253104349Sphk return XML_ROLE_NONE; 1254104349Sphk } 1255104349Sphk return common(state, tok); 1256104349Sphk} 1257104349Sphk 1258178848Scokanestatic int PTRCALL 1259104349SphkcondSect2(PROLOG_STATE *state, 1260104349Sphk int tok, 1261104349Sphk const char *ptr, 1262104349Sphk const char *end, 1263104349Sphk const ENCODING *enc) 1264104349Sphk{ 1265104349Sphk switch (tok) { 1266104349Sphk case XML_TOK_PROLOG_S: 1267104349Sphk return XML_ROLE_NONE; 1268104349Sphk case XML_TOK_OPEN_BRACKET: 1269104349Sphk state->handler = externalSubset1; 1270104349Sphk return XML_ROLE_IGNORE_SECT; 1271104349Sphk } 1272104349Sphk return common(state, tok); 1273104349Sphk} 1274104349Sphk 1275104349Sphk#endif /* XML_DTD */ 1276104349Sphk 1277178848Scokanestatic int PTRCALL 1278104349SphkdeclClose(PROLOG_STATE *state, 1279104349Sphk int tok, 1280104349Sphk const char *ptr, 1281104349Sphk const char *end, 1282104349Sphk const ENCODING *enc) 1283104349Sphk{ 1284104349Sphk switch (tok) { 1285104349Sphk case XML_TOK_PROLOG_S: 1286104349Sphk return state->role_none; 1287104349Sphk case XML_TOK_DECL_CLOSE: 1288104349Sphk setTopLevel(state); 1289104349Sphk return state->role_none; 1290104349Sphk } 1291104349Sphk return common(state, tok); 1292104349Sphk} 1293104349Sphk 1294178848Scokanestatic int PTRCALL 1295104349Sphkerror(PROLOG_STATE *state, 1296104349Sphk int tok, 1297104349Sphk const char *ptr, 1298104349Sphk const char *end, 1299104349Sphk const ENCODING *enc) 1300104349Sphk{ 1301104349Sphk return XML_ROLE_NONE; 1302104349Sphk} 1303104349Sphk 1304104349Sphkstatic int FASTCALL 1305104349Sphkcommon(PROLOG_STATE *state, int tok) 1306104349Sphk{ 1307104349Sphk#ifdef XML_DTD 1308104349Sphk if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) 1309104349Sphk return XML_ROLE_INNER_PARAM_ENTITY_REF; 1310104349Sphk#endif 1311104349Sphk state->handler = error; 1312104349Sphk return XML_ROLE_ERROR; 1313104349Sphk} 1314104349Sphk 1315104349Sphkvoid 1316104349SphkXmlPrologStateInit(PROLOG_STATE *state) 1317104349Sphk{ 1318104349Sphk state->handler = prolog0; 1319104349Sphk#ifdef XML_DTD 1320104349Sphk state->documentEntity = 1; 1321104349Sphk state->includeLevel = 0; 1322104349Sphk state->inEntityValue = 0; 1323104349Sphk#endif /* XML_DTD */ 1324104349Sphk} 1325104349Sphk 1326104349Sphk#ifdef XML_DTD 1327104349Sphk 1328104349Sphkvoid 1329104349SphkXmlPrologStateInitExternalEntity(PROLOG_STATE *state) 1330104349Sphk{ 1331104349Sphk state->handler = externalSubset0; 1332104349Sphk state->documentEntity = 0; 1333104349Sphk state->includeLevel = 0; 1334104349Sphk} 1335104349Sphk 1336104349Sphk#endif /* XML_DTD */ 1337