parser/expat/lib/xmlrole.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
michael@0 2 See the file COPYING for copying permission.
michael@0 3 */
michael@0 4
michael@0 5 #include <stddef.h>
michael@0 6
michael@0 7 #ifdef COMPILED_FROM_DSP
michael@0 8 #include "winconfig.h"
michael@0 9 #elif defined(MACOS_CLASSIC)
michael@0 10 #include "macconfig.h"
michael@0 11 #elif defined(__amigaos4__)
michael@0 12 #include "amigaconfig.h"
michael@0 13 #else
michael@0 14 #ifdef HAVE_EXPAT_CONFIG_H
michael@0 15 #include <expat_config.h>
michael@0 16 #endif
michael@0 17 #endif /* ndef COMPILED_FROM_DSP */
michael@0 18
michael@0 19 #include "expat_external.h"
michael@0 20 #include "internal.h"
michael@0 21 #include "xmlrole.h"
michael@0 22 #include "ascii.h"
michael@0 23
michael@0 24 /* Doesn't check:
michael@0 25
michael@0 26 that ,| are not mixed in a model group
michael@0 27 content of literals
michael@0 28
michael@0 29 */
michael@0 30
michael@0 31 static const char KW_ANY[] = {
michael@0 32 ASCII_A, ASCII_N, ASCII_Y, '\0' };
michael@0 33 static const char KW_ATTLIST[] = {
michael@0 34 ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
michael@0 35 static const char KW_CDATA[] = {
michael@0 36 ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
michael@0 37 static const char KW_DOCTYPE[] = {
michael@0 38 ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
michael@0 39 static const char KW_ELEMENT[] = {
michael@0 40 ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
michael@0 41 static const char KW_EMPTY[] = {
michael@0 42 ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
michael@0 43 static const char KW_ENTITIES[] = {
michael@0 44 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
michael@0 45 '\0' };
michael@0 46 static const char KW_ENTITY[] = {
michael@0 47 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
michael@0 48 static const char KW_FIXED[] = {
michael@0 49 ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
michael@0 50 static const char KW_ID[] = {
michael@0 51 ASCII_I, ASCII_D, '\0' };
michael@0 52 static const char KW_IDREF[] = {
michael@0 53 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
michael@0 54 static const char KW_IDREFS[] = {
michael@0 55 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
michael@0 56 static const char KW_IGNORE[] = {
michael@0 57 ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
michael@0 58 static const char KW_IMPLIED[] = {
michael@0 59 ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
michael@0 60 static const char KW_INCLUDE[] = {
michael@0 61 ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
michael@0 62 static const char KW_NDATA[] = {
michael@0 63 ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
michael@0 64 static const char KW_NMTOKEN[] = {
michael@0 65 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
michael@0 66 static const char KW_NMTOKENS[] = {
michael@0 67 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
michael@0 68 '\0' };
michael@0 69 static const char KW_NOTATION[] =
michael@0 70 { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
michael@0 71 '\0' };
michael@0 72 static const char KW_PCDATA[] = {
michael@0 73 ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
michael@0 74 static const char KW_PUBLIC[] = {
michael@0 75 ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
michael@0 76 static const char KW_REQUIRED[] = {
michael@0 77 ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
michael@0 78 '\0' };
michael@0 79 static const char KW_SYSTEM[] = {
michael@0 80 ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
michael@0 81
michael@0 82 #ifndef MIN_BYTES_PER_CHAR
michael@0 83 #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
michael@0 84 #endif
michael@0 85
michael@0 86 #ifdef XML_DTD
michael@0 87 #define setTopLevel(state) \
michael@0 88 ((state)->handler = ((state)->documentEntity \
michael@0 89 ? internalSubset \
michael@0 90 : externalSubset1))
michael@0 91 #else /* not XML_DTD */
michael@0 92 #define setTopLevel(state) ((state)->handler = internalSubset)
michael@0 93 #endif /* not XML_DTD */
michael@0 94
michael@0 95 typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
michael@0 96 int tok,
michael@0 97 const char *ptr,
michael@0 98 const char *end,
michael@0 99 const ENCODING *enc);
michael@0 100
michael@0 101 static PROLOG_HANDLER
michael@0 102 prolog0, prolog1, prolog2,
michael@0 103 doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
michael@0 104 internalSubset,
michael@0 105 entity0, entity1, entity2, entity3, entity4, entity5, entity6,
michael@0 106 entity7, entity8, entity9, entity10,
michael@0 107 notation0, notation1, notation2, notation3, notation4,
michael@0 108 attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
michael@0 109 attlist7, attlist8, attlist9,
michael@0 110 element0, element1, element2, element3, element4, element5, element6,
michael@0 111 element7,
michael@0 112 #ifdef XML_DTD
michael@0 113 externalSubset0, externalSubset1,
michael@0 114 condSect0, condSect1, condSect2,
michael@0 115 #endif /* XML_DTD */
michael@0 116 declClose,
michael@0 117 error;
michael@0 118
michael@0 119 static int FASTCALL common(PROLOG_STATE *state, int tok);
michael@0 120
michael@0 121 static int PTRCALL
michael@0 122 prolog0(PROLOG_STATE *state,
michael@0 123 int tok,
michael@0 124 const char *ptr,
michael@0 125 const char *end,
michael@0 126 const ENCODING *enc)
michael@0 127 {
michael@0 128 switch (tok) {
michael@0 129 case XML_TOK_PROLOG_S:
michael@0 130 state->handler = prolog1;
michael@0 131 return XML_ROLE_NONE;
michael@0 132 case XML_TOK_XML_DECL:
michael@0 133 state->handler = prolog1;
michael@0 134 return XML_ROLE_XML_DECL;
michael@0 135 case XML_TOK_PI:
michael@0 136 state->handler = prolog1;
michael@0 137 return XML_ROLE_PI;
michael@0 138 case XML_TOK_COMMENT:
michael@0 139 state->handler = prolog1;
michael@0 140 return XML_ROLE_COMMENT;
michael@0 141 case XML_TOK_BOM:
michael@0 142 return XML_ROLE_NONE;
michael@0 143 case XML_TOK_DECL_OPEN:
michael@0 144 if (!XmlNameMatchesAscii(enc,
michael@0 145 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 146 end,
michael@0 147 KW_DOCTYPE))
michael@0 148 break;
michael@0 149 state->handler = doctype0;
michael@0 150 return XML_ROLE_DOCTYPE_NONE;
michael@0 151 case XML_TOK_INSTANCE_START:
michael@0 152 state->handler = error;
michael@0 153 return XML_ROLE_INSTANCE_START;
michael@0 154 }
michael@0 155 return common(state, tok);
michael@0 156 }
michael@0 157
michael@0 158 static int PTRCALL
michael@0 159 prolog1(PROLOG_STATE *state,
michael@0 160 int tok,
michael@0 161 const char *ptr,
michael@0 162 const char *end,
michael@0 163 const ENCODING *enc)
michael@0 164 {
michael@0 165 switch (tok) {
michael@0 166 case XML_TOK_PROLOG_S:
michael@0 167 return XML_ROLE_NONE;
michael@0 168 case XML_TOK_PI:
michael@0 169 return XML_ROLE_PI;
michael@0 170 case XML_TOK_COMMENT:
michael@0 171 return XML_ROLE_COMMENT;
michael@0 172 case XML_TOK_BOM:
michael@0 173 return XML_ROLE_NONE;
michael@0 174 case XML_TOK_DECL_OPEN:
michael@0 175 if (!XmlNameMatchesAscii(enc,
michael@0 176 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 177 end,
michael@0 178 KW_DOCTYPE))
michael@0 179 break;
michael@0 180 state->handler = doctype0;
michael@0 181 return XML_ROLE_DOCTYPE_NONE;
michael@0 182 case XML_TOK_INSTANCE_START:
michael@0 183 state->handler = error;
michael@0 184 return XML_ROLE_INSTANCE_START;
michael@0 185 }
michael@0 186 return common(state, tok);
michael@0 187 }
michael@0 188
michael@0 189 static int PTRCALL
michael@0 190 prolog2(PROLOG_STATE *state,
michael@0 191 int tok,
michael@0 192 const char *ptr,
michael@0 193 const char *end,
michael@0 194 const ENCODING *enc)
michael@0 195 {
michael@0 196 switch (tok) {
michael@0 197 case XML_TOK_PROLOG_S:
michael@0 198 return XML_ROLE_NONE;
michael@0 199 case XML_TOK_PI:
michael@0 200 return XML_ROLE_PI;
michael@0 201 case XML_TOK_COMMENT:
michael@0 202 return XML_ROLE_COMMENT;
michael@0 203 case XML_TOK_INSTANCE_START:
michael@0 204 state->handler = error;
michael@0 205 return XML_ROLE_INSTANCE_START;
michael@0 206 }
michael@0 207 return common(state, tok);
michael@0 208 }
michael@0 209
michael@0 210 static int PTRCALL
michael@0 211 doctype0(PROLOG_STATE *state,
michael@0 212 int tok,
michael@0 213 const char *ptr,
michael@0 214 const char *end,
michael@0 215 const ENCODING *enc)
michael@0 216 {
michael@0 217 switch (tok) {
michael@0 218 case XML_TOK_PROLOG_S:
michael@0 219 return XML_ROLE_DOCTYPE_NONE;
michael@0 220 case XML_TOK_NAME:
michael@0 221 case XML_TOK_PREFIXED_NAME:
michael@0 222 state->handler = doctype1;
michael@0 223 return XML_ROLE_DOCTYPE_NAME;
michael@0 224 }
michael@0 225 return common(state, tok);
michael@0 226 }
michael@0 227
michael@0 228 static int PTRCALL
michael@0 229 doctype1(PROLOG_STATE *state,
michael@0 230 int tok,
michael@0 231 const char *ptr,
michael@0 232 const char *end,
michael@0 233 const ENCODING *enc)
michael@0 234 {
michael@0 235 switch (tok) {
michael@0 236 case XML_TOK_PROLOG_S:
michael@0 237 return XML_ROLE_DOCTYPE_NONE;
michael@0 238 case XML_TOK_OPEN_BRACKET:
michael@0 239 state->handler = internalSubset;
michael@0 240 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
michael@0 241 case XML_TOK_DECL_CLOSE:
michael@0 242 state->handler = prolog2;
michael@0 243 return XML_ROLE_DOCTYPE_CLOSE;
michael@0 244 case XML_TOK_NAME:
michael@0 245 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
michael@0 246 state->handler = doctype3;
michael@0 247 return XML_ROLE_DOCTYPE_NONE;
michael@0 248 }
michael@0 249 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
michael@0 250 state->handler = doctype2;
michael@0 251 return XML_ROLE_DOCTYPE_NONE;
michael@0 252 }
michael@0 253 break;
michael@0 254 }
michael@0 255 return common(state, tok);
michael@0 256 }
michael@0 257
michael@0 258 static int PTRCALL
michael@0 259 doctype2(PROLOG_STATE *state,
michael@0 260 int tok,
michael@0 261 const char *ptr,
michael@0 262 const char *end,
michael@0 263 const ENCODING *enc)
michael@0 264 {
michael@0 265 switch (tok) {
michael@0 266 case XML_TOK_PROLOG_S:
michael@0 267 return XML_ROLE_DOCTYPE_NONE;
michael@0 268 case XML_TOK_LITERAL:
michael@0 269 state->handler = doctype3;
michael@0 270 return XML_ROLE_DOCTYPE_PUBLIC_ID;
michael@0 271 }
michael@0 272 return common(state, tok);
michael@0 273 }
michael@0 274
michael@0 275 static int PTRCALL
michael@0 276 doctype3(PROLOG_STATE *state,
michael@0 277 int tok,
michael@0 278 const char *ptr,
michael@0 279 const char *end,
michael@0 280 const ENCODING *enc)
michael@0 281 {
michael@0 282 switch (tok) {
michael@0 283 case XML_TOK_PROLOG_S:
michael@0 284 return XML_ROLE_DOCTYPE_NONE;
michael@0 285 case XML_TOK_LITERAL:
michael@0 286 state->handler = doctype4;
michael@0 287 return XML_ROLE_DOCTYPE_SYSTEM_ID;
michael@0 288 }
michael@0 289 return common(state, tok);
michael@0 290 }
michael@0 291
michael@0 292 static int PTRCALL
michael@0 293 doctype4(PROLOG_STATE *state,
michael@0 294 int tok,
michael@0 295 const char *ptr,
michael@0 296 const char *end,
michael@0 297 const ENCODING *enc)
michael@0 298 {
michael@0 299 switch (tok) {
michael@0 300 case XML_TOK_PROLOG_S:
michael@0 301 return XML_ROLE_DOCTYPE_NONE;
michael@0 302 case XML_TOK_OPEN_BRACKET:
michael@0 303 state->handler = internalSubset;
michael@0 304 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
michael@0 305 case XML_TOK_DECL_CLOSE:
michael@0 306 state->handler = prolog2;
michael@0 307 return XML_ROLE_DOCTYPE_CLOSE;
michael@0 308 }
michael@0 309 return common(state, tok);
michael@0 310 }
michael@0 311
michael@0 312 static int PTRCALL
michael@0 313 doctype5(PROLOG_STATE *state,
michael@0 314 int tok,
michael@0 315 const char *ptr,
michael@0 316 const char *end,
michael@0 317 const ENCODING *enc)
michael@0 318 {
michael@0 319 switch (tok) {
michael@0 320 case XML_TOK_PROLOG_S:
michael@0 321 return XML_ROLE_DOCTYPE_NONE;
michael@0 322 case XML_TOK_DECL_CLOSE:
michael@0 323 state->handler = prolog2;
michael@0 324 return XML_ROLE_DOCTYPE_CLOSE;
michael@0 325 }
michael@0 326 return common(state, tok);
michael@0 327 }
michael@0 328
michael@0 329 static int PTRCALL
michael@0 330 internalSubset(PROLOG_STATE *state,
michael@0 331 int tok,
michael@0 332 const char *ptr,
michael@0 333 const char *end,
michael@0 334 const ENCODING *enc)
michael@0 335 {
michael@0 336 switch (tok) {
michael@0 337 case XML_TOK_PROLOG_S:
michael@0 338 return XML_ROLE_NONE;
michael@0 339 case XML_TOK_DECL_OPEN:
michael@0 340 if (XmlNameMatchesAscii(enc,
michael@0 341 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 342 end,
michael@0 343 KW_ENTITY)) {
michael@0 344 state->handler = entity0;
michael@0 345 return XML_ROLE_ENTITY_NONE;
michael@0 346 }
michael@0 347 if (XmlNameMatchesAscii(enc,
michael@0 348 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 349 end,
michael@0 350 KW_ATTLIST)) {
michael@0 351 state->handler = attlist0;
michael@0 352 return XML_ROLE_ATTLIST_NONE;
michael@0 353 }
michael@0 354 if (XmlNameMatchesAscii(enc,
michael@0 355 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 356 end,
michael@0 357 KW_ELEMENT)) {
michael@0 358 state->handler = element0;
michael@0 359 return XML_ROLE_ELEMENT_NONE;
michael@0 360 }
michael@0 361 if (XmlNameMatchesAscii(enc,
michael@0 362 ptr + 2 * MIN_BYTES_PER_CHAR(enc),
michael@0 363 end,
michael@0 364 KW_NOTATION)) {
michael@0 365 state->handler = notation0;
michael@0 366 return XML_ROLE_NOTATION_NONE;
michael@0 367 }
michael@0 368 break;
michael@0 369 case XML_TOK_PI:
michael@0 370 return XML_ROLE_PI;
michael@0 371 case XML_TOK_COMMENT:
michael@0 372 return XML_ROLE_COMMENT;
michael@0 373 case XML_TOK_PARAM_ENTITY_REF:
michael@0 374 return XML_ROLE_PARAM_ENTITY_REF;
michael@0 375 case XML_TOK_CLOSE_BRACKET:
michael@0 376 state->handler = doctype5;
michael@0 377 return XML_ROLE_DOCTYPE_NONE;
michael@0 378 case XML_TOK_NONE:
michael@0 379 return XML_ROLE_NONE;
michael@0 380 }
michael@0 381 return common(state, tok);
michael@0 382 }
michael@0 383
michael@0 384 #ifdef XML_DTD
michael@0 385
michael@0 386 static int PTRCALL
michael@0 387 externalSubset0(PROLOG_STATE *state,
michael@0 388 int tok,
michael@0 389 const char *ptr,
michael@0 390 const char *end,
michael@0 391 const ENCODING *enc)
michael@0 392 {
michael@0 393 state->handler = externalSubset1;
michael@0 394 if (tok == XML_TOK_XML_DECL)
michael@0 395 return XML_ROLE_TEXT_DECL;
michael@0 396 return externalSubset1(state, tok, ptr, end, enc);
michael@0 397 }
michael@0 398
michael@0 399 static int PTRCALL
michael@0 400 externalSubset1(PROLOG_STATE *state,
michael@0 401 int tok,
michael@0 402 const char *ptr,
michael@0 403 const char *end,
michael@0 404 const ENCODING *enc)
michael@0 405 {
michael@0 406 switch (tok) {
michael@0 407 case XML_TOK_COND_SECT_OPEN:
michael@0 408 state->handler = condSect0;
michael@0 409 return XML_ROLE_NONE;
michael@0 410 case XML_TOK_COND_SECT_CLOSE:
michael@0 411 if (state->includeLevel == 0)
michael@0 412 break;
michael@0 413 state->includeLevel -= 1;
michael@0 414 return XML_ROLE_NONE;
michael@0 415 case XML_TOK_PROLOG_S:
michael@0 416 return XML_ROLE_NONE;
michael@0 417 case XML_TOK_CLOSE_BRACKET:
michael@0 418 break;
michael@0 419 case XML_TOK_NONE:
michael@0 420 if (state->includeLevel)
michael@0 421 break;
michael@0 422 return XML_ROLE_NONE;
michael@0 423 default:
michael@0 424 return internalSubset(state, tok, ptr, end, enc);
michael@0 425 }
michael@0 426 return common(state, tok);
michael@0 427 }
michael@0 428
michael@0 429 #endif /* XML_DTD */
michael@0 430
michael@0 431 static int PTRCALL
michael@0 432 entity0(PROLOG_STATE *state,
michael@0 433 int tok,
michael@0 434 const char *ptr,
michael@0 435 const char *end,
michael@0 436 const ENCODING *enc)
michael@0 437 {
michael@0 438 switch (tok) {
michael@0 439 case XML_TOK_PROLOG_S:
michael@0 440 return XML_ROLE_ENTITY_NONE;
michael@0 441 case XML_TOK_PERCENT:
michael@0 442 state->handler = entity1;
michael@0 443 return XML_ROLE_ENTITY_NONE;
michael@0 444 case XML_TOK_NAME:
michael@0 445 state->handler = entity2;
michael@0 446 return XML_ROLE_GENERAL_ENTITY_NAME;
michael@0 447 }
michael@0 448 return common(state, tok);
michael@0 449 }
michael@0 450
michael@0 451 static int PTRCALL
michael@0 452 entity1(PROLOG_STATE *state,
michael@0 453 int tok,
michael@0 454 const char *ptr,
michael@0 455 const char *end,
michael@0 456 const ENCODING *enc)
michael@0 457 {
michael@0 458 switch (tok) {
michael@0 459 case XML_TOK_PROLOG_S:
michael@0 460 return XML_ROLE_ENTITY_NONE;
michael@0 461 case XML_TOK_NAME:
michael@0 462 state->handler = entity7;
michael@0 463 return XML_ROLE_PARAM_ENTITY_NAME;
michael@0 464 }
michael@0 465 return common(state, tok);
michael@0 466 }
michael@0 467
michael@0 468 static int PTRCALL
michael@0 469 entity2(PROLOG_STATE *state,
michael@0 470 int tok,
michael@0 471 const char *ptr,
michael@0 472 const char *end,
michael@0 473 const ENCODING *enc)
michael@0 474 {
michael@0 475 switch (tok) {
michael@0 476 case XML_TOK_PROLOG_S:
michael@0 477 return XML_ROLE_ENTITY_NONE;
michael@0 478 case XML_TOK_NAME:
michael@0 479 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
michael@0 480 state->handler = entity4;
michael@0 481 return XML_ROLE_ENTITY_NONE;
michael@0 482 }
michael@0 483 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
michael@0 484 state->handler = entity3;
michael@0 485 return XML_ROLE_ENTITY_NONE;
michael@0 486 }
michael@0 487 break;
michael@0 488 case XML_TOK_LITERAL:
michael@0 489 state->handler = declClose;
michael@0 490 state->role_none = XML_ROLE_ENTITY_NONE;
michael@0 491 return XML_ROLE_ENTITY_VALUE;
michael@0 492 }
michael@0 493 return common(state, tok);
michael@0 494 }
michael@0 495
michael@0 496 static int PTRCALL
michael@0 497 entity3(PROLOG_STATE *state,
michael@0 498 int tok,
michael@0 499 const char *ptr,
michael@0 500 const char *end,
michael@0 501 const ENCODING *enc)
michael@0 502 {
michael@0 503 switch (tok) {
michael@0 504 case XML_TOK_PROLOG_S:
michael@0 505 return XML_ROLE_ENTITY_NONE;
michael@0 506 case XML_TOK_LITERAL:
michael@0 507 state->handler = entity4;
michael@0 508 return XML_ROLE_ENTITY_PUBLIC_ID;
michael@0 509 }
michael@0 510 return common(state, tok);
michael@0 511 }
michael@0 512
michael@0 513 static int PTRCALL
michael@0 514 entity4(PROLOG_STATE *state,
michael@0 515 int tok,
michael@0 516 const char *ptr,
michael@0 517 const char *end,
michael@0 518 const ENCODING *enc)
michael@0 519 {
michael@0 520 switch (tok) {
michael@0 521 case XML_TOK_PROLOG_S:
michael@0 522 return XML_ROLE_ENTITY_NONE;
michael@0 523 case XML_TOK_LITERAL:
michael@0 524 state->handler = entity5;
michael@0 525 return XML_ROLE_ENTITY_SYSTEM_ID;
michael@0 526 }
michael@0 527 return common(state, tok);
michael@0 528 }
michael@0 529
michael@0 530 static int PTRCALL
michael@0 531 entity5(PROLOG_STATE *state,
michael@0 532 int tok,
michael@0 533 const char *ptr,
michael@0 534 const char *end,
michael@0 535 const ENCODING *enc)
michael@0 536 {
michael@0 537 switch (tok) {
michael@0 538 case XML_TOK_PROLOG_S:
michael@0 539 return XML_ROLE_ENTITY_NONE;
michael@0 540 case XML_TOK_DECL_CLOSE:
michael@0 541 setTopLevel(state);
michael@0 542 return XML_ROLE_ENTITY_COMPLETE;
michael@0 543 case XML_TOK_NAME:
michael@0 544 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
michael@0 545 state->handler = entity6;
michael@0 546 return XML_ROLE_ENTITY_NONE;
michael@0 547 }
michael@0 548 break;
michael@0 549 }
michael@0 550 return common(state, tok);
michael@0 551 }
michael@0 552
michael@0 553 static int PTRCALL
michael@0 554 entity6(PROLOG_STATE *state,
michael@0 555 int tok,
michael@0 556 const char *ptr,
michael@0 557 const char *end,
michael@0 558 const ENCODING *enc)
michael@0 559 {
michael@0 560 switch (tok) {
michael@0 561 case XML_TOK_PROLOG_S:
michael@0 562 return XML_ROLE_ENTITY_NONE;
michael@0 563 case XML_TOK_NAME:
michael@0 564 state->handler = declClose;
michael@0 565 state->role_none = XML_ROLE_ENTITY_NONE;
michael@0 566 return XML_ROLE_ENTITY_NOTATION_NAME;
michael@0 567 }
michael@0 568 return common(state, tok);
michael@0 569 }
michael@0 570
michael@0 571 static int PTRCALL
michael@0 572 entity7(PROLOG_STATE *state,
michael@0 573 int tok,
michael@0 574 const char *ptr,
michael@0 575 const char *end,
michael@0 576 const ENCODING *enc)
michael@0 577 {
michael@0 578 switch (tok) {
michael@0 579 case XML_TOK_PROLOG_S:
michael@0 580 return XML_ROLE_ENTITY_NONE;
michael@0 581 case XML_TOK_NAME:
michael@0 582 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
michael@0 583 state->handler = entity9;
michael@0 584 return XML_ROLE_ENTITY_NONE;
michael@0 585 }
michael@0 586 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
michael@0 587 state->handler = entity8;
michael@0 588 return XML_ROLE_ENTITY_NONE;
michael@0 589 }
michael@0 590 break;
michael@0 591 case XML_TOK_LITERAL:
michael@0 592 state->handler = declClose;
michael@0 593 state->role_none = XML_ROLE_ENTITY_NONE;
michael@0 594 return XML_ROLE_ENTITY_VALUE;
michael@0 595 }
michael@0 596 return common(state, tok);
michael@0 597 }
michael@0 598
michael@0 599 static int PTRCALL
michael@0 600 entity8(PROLOG_STATE *state,
michael@0 601 int tok,
michael@0 602 const char *ptr,
michael@0 603 const char *end,
michael@0 604 const ENCODING *enc)
michael@0 605 {
michael@0 606 switch (tok) {
michael@0 607 case XML_TOK_PROLOG_S:
michael@0 608 return XML_ROLE_ENTITY_NONE;
michael@0 609 case XML_TOK_LITERAL:
michael@0 610 state->handler = entity9;
michael@0 611 return XML_ROLE_ENTITY_PUBLIC_ID;
michael@0 612 }
michael@0 613 return common(state, tok);
michael@0 614 }
michael@0 615
michael@0 616 static int PTRCALL
michael@0 617 entity9(PROLOG_STATE *state,
michael@0 618 int tok,
michael@0 619 const char *ptr,
michael@0 620 const char *end,
michael@0 621 const ENCODING *enc)
michael@0 622 {
michael@0 623 switch (tok) {
michael@0 624 case XML_TOK_PROLOG_S:
michael@0 625 return XML_ROLE_ENTITY_NONE;
michael@0 626 case XML_TOK_LITERAL:
michael@0 627 state->handler = entity10;
michael@0 628 return XML_ROLE_ENTITY_SYSTEM_ID;
michael@0 629 }
michael@0 630 return common(state, tok);
michael@0 631 }
michael@0 632
michael@0 633 static int PTRCALL
michael@0 634 entity10(PROLOG_STATE *state,
michael@0 635 int tok,
michael@0 636 const char *ptr,
michael@0 637 const char *end,
michael@0 638 const ENCODING *enc)
michael@0 639 {
michael@0 640 switch (tok) {
michael@0 641 case XML_TOK_PROLOG_S:
michael@0 642 return XML_ROLE_ENTITY_NONE;
michael@0 643 case XML_TOK_DECL_CLOSE:
michael@0 644 setTopLevel(state);
michael@0 645 return XML_ROLE_ENTITY_COMPLETE;
michael@0 646 }
michael@0 647 return common(state, tok);
michael@0 648 }
michael@0 649
michael@0 650 static int PTRCALL
michael@0 651 notation0(PROLOG_STATE *state,
michael@0 652 int tok,
michael@0 653 const char *ptr,
michael@0 654 const char *end,
michael@0 655 const ENCODING *enc)
michael@0 656 {
michael@0 657 switch (tok) {
michael@0 658 case XML_TOK_PROLOG_S:
michael@0 659 return XML_ROLE_NOTATION_NONE;
michael@0 660 case XML_TOK_NAME:
michael@0 661 state->handler = notation1;
michael@0 662 return XML_ROLE_NOTATION_NAME;
michael@0 663 }
michael@0 664 return common(state, tok);
michael@0 665 }
michael@0 666
michael@0 667 static int PTRCALL
michael@0 668 notation1(PROLOG_STATE *state,
michael@0 669 int tok,
michael@0 670 const char *ptr,
michael@0 671 const char *end,
michael@0 672 const ENCODING *enc)
michael@0 673 {
michael@0 674 switch (tok) {
michael@0 675 case XML_TOK_PROLOG_S:
michael@0 676 return XML_ROLE_NOTATION_NONE;
michael@0 677 case XML_TOK_NAME:
michael@0 678 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
michael@0 679 state->handler = notation3;
michael@0 680 return XML_ROLE_NOTATION_NONE;
michael@0 681 }
michael@0 682 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
michael@0 683 state->handler = notation2;
michael@0 684 return XML_ROLE_NOTATION_NONE;
michael@0 685 }
michael@0 686 break;
michael@0 687 }
michael@0 688 return common(state, tok);
michael@0 689 }
michael@0 690
michael@0 691 static int PTRCALL
michael@0 692 notation2(PROLOG_STATE *state,
michael@0 693 int tok,
michael@0 694 const char *ptr,
michael@0 695 const char *end,
michael@0 696 const ENCODING *enc)
michael@0 697 {
michael@0 698 switch (tok) {
michael@0 699 case XML_TOK_PROLOG_S:
michael@0 700 return XML_ROLE_NOTATION_NONE;
michael@0 701 case XML_TOK_LITERAL:
michael@0 702 state->handler = notation4;
michael@0 703 return XML_ROLE_NOTATION_PUBLIC_ID;
michael@0 704 }
michael@0 705 return common(state, tok);
michael@0 706 }
michael@0 707
michael@0 708 static int PTRCALL
michael@0 709 notation3(PROLOG_STATE *state,
michael@0 710 int tok,
michael@0 711 const char *ptr,
michael@0 712 const char *end,
michael@0 713 const ENCODING *enc)
michael@0 714 {
michael@0 715 switch (tok) {
michael@0 716 case XML_TOK_PROLOG_S:
michael@0 717 return XML_ROLE_NOTATION_NONE;
michael@0 718 case XML_TOK_LITERAL:
michael@0 719 state->handler = declClose;
michael@0 720 state->role_none = XML_ROLE_NOTATION_NONE;
michael@0 721 return XML_ROLE_NOTATION_SYSTEM_ID;
michael@0 722 }
michael@0 723 return common(state, tok);
michael@0 724 }
michael@0 725
michael@0 726 static int PTRCALL
michael@0 727 notation4(PROLOG_STATE *state,
michael@0 728 int tok,
michael@0 729 const char *ptr,
michael@0 730 const char *end,
michael@0 731 const ENCODING *enc)
michael@0 732 {
michael@0 733 switch (tok) {
michael@0 734 case XML_TOK_PROLOG_S:
michael@0 735 return XML_ROLE_NOTATION_NONE;
michael@0 736 case XML_TOK_LITERAL:
michael@0 737 state->handler = declClose;
michael@0 738 state->role_none = XML_ROLE_NOTATION_NONE;
michael@0 739 return XML_ROLE_NOTATION_SYSTEM_ID;
michael@0 740 case XML_TOK_DECL_CLOSE:
michael@0 741 setTopLevel(state);
michael@0 742 return XML_ROLE_NOTATION_NO_SYSTEM_ID;
michael@0 743 }
michael@0 744 return common(state, tok);
michael@0 745 }
michael@0 746
michael@0 747 static int PTRCALL
michael@0 748 attlist0(PROLOG_STATE *state,
michael@0 749 int tok,
michael@0 750 const char *ptr,
michael@0 751 const char *end,
michael@0 752 const ENCODING *enc)
michael@0 753 {
michael@0 754 switch (tok) {
michael@0 755 case XML_TOK_PROLOG_S:
michael@0 756 return XML_ROLE_ATTLIST_NONE;
michael@0 757 case XML_TOK_NAME:
michael@0 758 case XML_TOK_PREFIXED_NAME:
michael@0 759 state->handler = attlist1;
michael@0 760 return XML_ROLE_ATTLIST_ELEMENT_NAME;
michael@0 761 }
michael@0 762 return common(state, tok);
michael@0 763 }
michael@0 764
michael@0 765 static int PTRCALL
michael@0 766 attlist1(PROLOG_STATE *state,
michael@0 767 int tok,
michael@0 768 const char *ptr,
michael@0 769 const char *end,
michael@0 770 const ENCODING *enc)
michael@0 771 {
michael@0 772 switch (tok) {
michael@0 773 case XML_TOK_PROLOG_S:
michael@0 774 return XML_ROLE_ATTLIST_NONE;
michael@0 775 case XML_TOK_DECL_CLOSE:
michael@0 776 setTopLevel(state);
michael@0 777 return XML_ROLE_ATTLIST_NONE;
michael@0 778 case XML_TOK_NAME:
michael@0 779 case XML_TOK_PREFIXED_NAME:
michael@0 780 state->handler = attlist2;
michael@0 781 return XML_ROLE_ATTRIBUTE_NAME;
michael@0 782 }
michael@0 783 return common(state, tok);
michael@0 784 }
michael@0 785
michael@0 786 static int PTRCALL
michael@0 787 attlist2(PROLOG_STATE *state,
michael@0 788 int tok,
michael@0 789 const char *ptr,
michael@0 790 const char *end,
michael@0 791 const ENCODING *enc)
michael@0 792 {
michael@0 793 switch (tok) {
michael@0 794 case XML_TOK_PROLOG_S:
michael@0 795 return XML_ROLE_ATTLIST_NONE;
michael@0 796 case XML_TOK_NAME:
michael@0 797 {
michael@0 798 static const char * const types[] = {
michael@0 799 KW_CDATA,
michael@0 800 KW_ID,
michael@0 801 KW_IDREF,
michael@0 802 KW_IDREFS,
michael@0 803 KW_ENTITY,
michael@0 804 KW_ENTITIES,
michael@0 805 KW_NMTOKEN,
michael@0 806 KW_NMTOKENS,
michael@0 807 };
michael@0 808 int i;
michael@0 809 for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
michael@0 810 if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
michael@0 811 state->handler = attlist8;
michael@0 812 return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
michael@0 813 }
michael@0 814 }
michael@0 815 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
michael@0 816 state->handler = attlist5;
michael@0 817 return XML_ROLE_ATTLIST_NONE;
michael@0 818 }
michael@0 819 break;
michael@0 820 case XML_TOK_OPEN_PAREN:
michael@0 821 state->handler = attlist3;
michael@0 822 return XML_ROLE_ATTLIST_NONE;
michael@0 823 }
michael@0 824 return common(state, tok);
michael@0 825 }
michael@0 826
michael@0 827 static int PTRCALL
michael@0 828 attlist3(PROLOG_STATE *state,
michael@0 829 int tok,
michael@0 830 const char *ptr,
michael@0 831 const char *end,
michael@0 832 const ENCODING *enc)
michael@0 833 {
michael@0 834 switch (tok) {
michael@0 835 case XML_TOK_PROLOG_S:
michael@0 836 return XML_ROLE_ATTLIST_NONE;
michael@0 837 case XML_TOK_NMTOKEN:
michael@0 838 case XML_TOK_NAME:
michael@0 839 case XML_TOK_PREFIXED_NAME:
michael@0 840 state->handler = attlist4;
michael@0 841 return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
michael@0 842 }
michael@0 843 return common(state, tok);
michael@0 844 }
michael@0 845
michael@0 846 static int PTRCALL
michael@0 847 attlist4(PROLOG_STATE *state,
michael@0 848 int tok,
michael@0 849 const char *ptr,
michael@0 850 const char *end,
michael@0 851 const ENCODING *enc)
michael@0 852 {
michael@0 853 switch (tok) {
michael@0 854 case XML_TOK_PROLOG_S:
michael@0 855 return XML_ROLE_ATTLIST_NONE;
michael@0 856 case XML_TOK_CLOSE_PAREN:
michael@0 857 state->handler = attlist8;
michael@0 858 return XML_ROLE_ATTLIST_NONE;
michael@0 859 case XML_TOK_OR:
michael@0 860 state->handler = attlist3;
michael@0 861 return XML_ROLE_ATTLIST_NONE;
michael@0 862 }
michael@0 863 return common(state, tok);
michael@0 864 }
michael@0 865
michael@0 866 static int PTRCALL
michael@0 867 attlist5(PROLOG_STATE *state,
michael@0 868 int tok,
michael@0 869 const char *ptr,
michael@0 870 const char *end,
michael@0 871 const ENCODING *enc)
michael@0 872 {
michael@0 873 switch (tok) {
michael@0 874 case XML_TOK_PROLOG_S:
michael@0 875 return XML_ROLE_ATTLIST_NONE;
michael@0 876 case XML_TOK_OPEN_PAREN:
michael@0 877 state->handler = attlist6;
michael@0 878 return XML_ROLE_ATTLIST_NONE;
michael@0 879 }
michael@0 880 return common(state, tok);
michael@0 881 }
michael@0 882
michael@0 883 static int PTRCALL
michael@0 884 attlist6(PROLOG_STATE *state,
michael@0 885 int tok,
michael@0 886 const char *ptr,
michael@0 887 const char *end,
michael@0 888 const ENCODING *enc)
michael@0 889 {
michael@0 890 switch (tok) {
michael@0 891 case XML_TOK_PROLOG_S:
michael@0 892 return XML_ROLE_ATTLIST_NONE;
michael@0 893 case XML_TOK_NAME:
michael@0 894 state->handler = attlist7;
michael@0 895 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
michael@0 896 }
michael@0 897 return common(state, tok);
michael@0 898 }
michael@0 899
michael@0 900 static int PTRCALL
michael@0 901 attlist7(PROLOG_STATE *state,
michael@0 902 int tok,
michael@0 903 const char *ptr,
michael@0 904 const char *end,
michael@0 905 const ENCODING *enc)
michael@0 906 {
michael@0 907 switch (tok) {
michael@0 908 case XML_TOK_PROLOG_S:
michael@0 909 return XML_ROLE_ATTLIST_NONE;
michael@0 910 case XML_TOK_CLOSE_PAREN:
michael@0 911 state->handler = attlist8;
michael@0 912 return XML_ROLE_ATTLIST_NONE;
michael@0 913 case XML_TOK_OR:
michael@0 914 state->handler = attlist6;
michael@0 915 return XML_ROLE_ATTLIST_NONE;
michael@0 916 }
michael@0 917 return common(state, tok);
michael@0 918 }
michael@0 919
michael@0 920 /* default value */
michael@0 921 static int PTRCALL
michael@0 922 attlist8(PROLOG_STATE *state,
michael@0 923 int tok,
michael@0 924 const char *ptr,
michael@0 925 const char *end,
michael@0 926 const ENCODING *enc)
michael@0 927 {
michael@0 928 switch (tok) {
michael@0 929 case XML_TOK_PROLOG_S:
michael@0 930 return XML_ROLE_ATTLIST_NONE;
michael@0 931 case XML_TOK_POUND_NAME:
michael@0 932 if (XmlNameMatchesAscii(enc,
michael@0 933 ptr + MIN_BYTES_PER_CHAR(enc),
michael@0 934 end,
michael@0 935 KW_IMPLIED)) {
michael@0 936 state->handler = attlist1;
michael@0 937 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
michael@0 938 }
michael@0 939 if (XmlNameMatchesAscii(enc,
michael@0 940 ptr + MIN_BYTES_PER_CHAR(enc),
michael@0 941 end,
michael@0 942 KW_REQUIRED)) {
michael@0 943 state->handler = attlist1;
michael@0 944 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
michael@0 945 }
michael@0 946 if (XmlNameMatchesAscii(enc,
michael@0 947 ptr + MIN_BYTES_PER_CHAR(enc),
michael@0 948 end,
michael@0 949 KW_FIXED)) {
michael@0 950 state->handler = attlist9;
michael@0 951 return XML_ROLE_ATTLIST_NONE;
michael@0 952 }
michael@0 953 break;
michael@0 954 case XML_TOK_LITERAL:
michael@0 955 state->handler = attlist1;
michael@0 956 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
michael@0 957 }
michael@0 958 return common(state, tok);
michael@0 959 }
michael@0 960
michael@0 961 static int PTRCALL
michael@0 962 attlist9(PROLOG_STATE *state,
michael@0 963 int tok,
michael@0 964 const char *ptr,
michael@0 965 const char *end,
michael@0 966 const ENCODING *enc)
michael@0 967 {
michael@0 968 switch (tok) {
michael@0 969 case XML_TOK_PROLOG_S:
michael@0 970 return XML_ROLE_ATTLIST_NONE;
michael@0 971 case XML_TOK_LITERAL:
michael@0 972 state->handler = attlist1;
michael@0 973 return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
michael@0 974 }
michael@0 975 return common(state, tok);
michael@0 976 }
michael@0 977
michael@0 978 static int PTRCALL
michael@0 979 element0(PROLOG_STATE *state,
michael@0 980 int tok,
michael@0 981 const char *ptr,
michael@0 982 const char *end,
michael@0 983 const ENCODING *enc)
michael@0 984 {
michael@0 985 switch (tok) {
michael@0 986 case XML_TOK_PROLOG_S:
michael@0 987 return XML_ROLE_ELEMENT_NONE;
michael@0 988 case XML_TOK_NAME:
michael@0 989 case XML_TOK_PREFIXED_NAME:
michael@0 990 state->handler = element1;
michael@0 991 return XML_ROLE_ELEMENT_NAME;
michael@0 992 }
michael@0 993 return common(state, tok);
michael@0 994 }
michael@0 995
michael@0 996 static int PTRCALL
michael@0 997 element1(PROLOG_STATE *state,
michael@0 998 int tok,
michael@0 999 const char *ptr,
michael@0 1000 const char *end,
michael@0 1001 const ENCODING *enc)
michael@0 1002 {
michael@0 1003 switch (tok) {
michael@0 1004 case XML_TOK_PROLOG_S:
michael@0 1005 return XML_ROLE_ELEMENT_NONE;
michael@0 1006 case XML_TOK_NAME:
michael@0 1007 if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
michael@0 1008 state->handler = declClose;
michael@0 1009 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1010 return XML_ROLE_CONTENT_EMPTY;
michael@0 1011 }
michael@0 1012 if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
michael@0 1013 state->handler = declClose;
michael@0 1014 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1015 return XML_ROLE_CONTENT_ANY;
michael@0 1016 }
michael@0 1017 break;
michael@0 1018 case XML_TOK_OPEN_PAREN:
michael@0 1019 state->handler = element2;
michael@0 1020 state->level = 1;
michael@0 1021 return XML_ROLE_GROUP_OPEN;
michael@0 1022 }
michael@0 1023 return common(state, tok);
michael@0 1024 }
michael@0 1025
michael@0 1026 static int PTRCALL
michael@0 1027 element2(PROLOG_STATE *state,
michael@0 1028 int tok,
michael@0 1029 const char *ptr,
michael@0 1030 const char *end,
michael@0 1031 const ENCODING *enc)
michael@0 1032 {
michael@0 1033 switch (tok) {
michael@0 1034 case XML_TOK_PROLOG_S:
michael@0 1035 return XML_ROLE_ELEMENT_NONE;
michael@0 1036 case XML_TOK_POUND_NAME:
michael@0 1037 if (XmlNameMatchesAscii(enc,
michael@0 1038 ptr + MIN_BYTES_PER_CHAR(enc),
michael@0 1039 end,
michael@0 1040 KW_PCDATA)) {
michael@0 1041 state->handler = element3;
michael@0 1042 return XML_ROLE_CONTENT_PCDATA;
michael@0 1043 }
michael@0 1044 break;
michael@0 1045 case XML_TOK_OPEN_PAREN:
michael@0 1046 state->level = 2;
michael@0 1047 state->handler = element6;
michael@0 1048 return XML_ROLE_GROUP_OPEN;
michael@0 1049 case XML_TOK_NAME:
michael@0 1050 case XML_TOK_PREFIXED_NAME:
michael@0 1051 state->handler = element7;
michael@0 1052 return XML_ROLE_CONTENT_ELEMENT;
michael@0 1053 case XML_TOK_NAME_QUESTION:
michael@0 1054 state->handler = element7;
michael@0 1055 return XML_ROLE_CONTENT_ELEMENT_OPT;
michael@0 1056 case XML_TOK_NAME_ASTERISK:
michael@0 1057 state->handler = element7;
michael@0 1058 return XML_ROLE_CONTENT_ELEMENT_REP;
michael@0 1059 case XML_TOK_NAME_PLUS:
michael@0 1060 state->handler = element7;
michael@0 1061 return XML_ROLE_CONTENT_ELEMENT_PLUS;
michael@0 1062 }
michael@0 1063 return common(state, tok);
michael@0 1064 }
michael@0 1065
michael@0 1066 static int PTRCALL
michael@0 1067 element3(PROLOG_STATE *state,
michael@0 1068 int tok,
michael@0 1069 const char *ptr,
michael@0 1070 const char *end,
michael@0 1071 const ENCODING *enc)
michael@0 1072 {
michael@0 1073 switch (tok) {
michael@0 1074 case XML_TOK_PROLOG_S:
michael@0 1075 return XML_ROLE_ELEMENT_NONE;
michael@0 1076 case XML_TOK_CLOSE_PAREN:
michael@0 1077 state->handler = declClose;
michael@0 1078 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1079 return XML_ROLE_GROUP_CLOSE;
michael@0 1080 case XML_TOK_CLOSE_PAREN_ASTERISK:
michael@0 1081 state->handler = declClose;
michael@0 1082 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1083 return XML_ROLE_GROUP_CLOSE_REP;
michael@0 1084 case XML_TOK_OR:
michael@0 1085 state->handler = element4;
michael@0 1086 return XML_ROLE_ELEMENT_NONE;
michael@0 1087 }
michael@0 1088 return common(state, tok);
michael@0 1089 }
michael@0 1090
michael@0 1091 static int PTRCALL
michael@0 1092 element4(PROLOG_STATE *state,
michael@0 1093 int tok,
michael@0 1094 const char *ptr,
michael@0 1095 const char *end,
michael@0 1096 const ENCODING *enc)
michael@0 1097 {
michael@0 1098 switch (tok) {
michael@0 1099 case XML_TOK_PROLOG_S:
michael@0 1100 return XML_ROLE_ELEMENT_NONE;
michael@0 1101 case XML_TOK_NAME:
michael@0 1102 case XML_TOK_PREFIXED_NAME:
michael@0 1103 state->handler = element5;
michael@0 1104 return XML_ROLE_CONTENT_ELEMENT;
michael@0 1105 }
michael@0 1106 return common(state, tok);
michael@0 1107 }
michael@0 1108
michael@0 1109 static int PTRCALL
michael@0 1110 element5(PROLOG_STATE *state,
michael@0 1111 int tok,
michael@0 1112 const char *ptr,
michael@0 1113 const char *end,
michael@0 1114 const ENCODING *enc)
michael@0 1115 {
michael@0 1116 switch (tok) {
michael@0 1117 case XML_TOK_PROLOG_S:
michael@0 1118 return XML_ROLE_ELEMENT_NONE;
michael@0 1119 case XML_TOK_CLOSE_PAREN_ASTERISK:
michael@0 1120 state->handler = declClose;
michael@0 1121 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1122 return XML_ROLE_GROUP_CLOSE_REP;
michael@0 1123 case XML_TOK_OR:
michael@0 1124 state->handler = element4;
michael@0 1125 return XML_ROLE_ELEMENT_NONE;
michael@0 1126 }
michael@0 1127 return common(state, tok);
michael@0 1128 }
michael@0 1129
michael@0 1130 static int PTRCALL
michael@0 1131 element6(PROLOG_STATE *state,
michael@0 1132 int tok,
michael@0 1133 const char *ptr,
michael@0 1134 const char *end,
michael@0 1135 const ENCODING *enc)
michael@0 1136 {
michael@0 1137 switch (tok) {
michael@0 1138 case XML_TOK_PROLOG_S:
michael@0 1139 return XML_ROLE_ELEMENT_NONE;
michael@0 1140 case XML_TOK_OPEN_PAREN:
michael@0 1141 state->level += 1;
michael@0 1142 return XML_ROLE_GROUP_OPEN;
michael@0 1143 case XML_TOK_NAME:
michael@0 1144 case XML_TOK_PREFIXED_NAME:
michael@0 1145 state->handler = element7;
michael@0 1146 return XML_ROLE_CONTENT_ELEMENT;
michael@0 1147 case XML_TOK_NAME_QUESTION:
michael@0 1148 state->handler = element7;
michael@0 1149 return XML_ROLE_CONTENT_ELEMENT_OPT;
michael@0 1150 case XML_TOK_NAME_ASTERISK:
michael@0 1151 state->handler = element7;
michael@0 1152 return XML_ROLE_CONTENT_ELEMENT_REP;
michael@0 1153 case XML_TOK_NAME_PLUS:
michael@0 1154 state->handler = element7;
michael@0 1155 return XML_ROLE_CONTENT_ELEMENT_PLUS;
michael@0 1156 }
michael@0 1157 return common(state, tok);
michael@0 1158 }
michael@0 1159
michael@0 1160 static int PTRCALL
michael@0 1161 element7(PROLOG_STATE *state,
michael@0 1162 int tok,
michael@0 1163 const char *ptr,
michael@0 1164 const char *end,
michael@0 1165 const ENCODING *enc)
michael@0 1166 {
michael@0 1167 switch (tok) {
michael@0 1168 case XML_TOK_PROLOG_S:
michael@0 1169 return XML_ROLE_ELEMENT_NONE;
michael@0 1170 case XML_TOK_CLOSE_PAREN:
michael@0 1171 state->level -= 1;
michael@0 1172 if (state->level == 0) {
michael@0 1173 state->handler = declClose;
michael@0 1174 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1175 }
michael@0 1176 return XML_ROLE_GROUP_CLOSE;
michael@0 1177 case XML_TOK_CLOSE_PAREN_ASTERISK:
michael@0 1178 state->level -= 1;
michael@0 1179 if (state->level == 0) {
michael@0 1180 state->handler = declClose;
michael@0 1181 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1182 }
michael@0 1183 return XML_ROLE_GROUP_CLOSE_REP;
michael@0 1184 case XML_TOK_CLOSE_PAREN_QUESTION:
michael@0 1185 state->level -= 1;
michael@0 1186 if (state->level == 0) {
michael@0 1187 state->handler = declClose;
michael@0 1188 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1189 }
michael@0 1190 return XML_ROLE_GROUP_CLOSE_OPT;
michael@0 1191 case XML_TOK_CLOSE_PAREN_PLUS:
michael@0 1192 state->level -= 1;
michael@0 1193 if (state->level == 0) {
michael@0 1194 state->handler = declClose;
michael@0 1195 state->role_none = XML_ROLE_ELEMENT_NONE;
michael@0 1196 }
michael@0 1197 return XML_ROLE_GROUP_CLOSE_PLUS;
michael@0 1198 case XML_TOK_COMMA:
michael@0 1199 state->handler = element6;
michael@0 1200 return XML_ROLE_GROUP_SEQUENCE;
michael@0 1201 case XML_TOK_OR:
michael@0 1202 state->handler = element6;
michael@0 1203 return XML_ROLE_GROUP_CHOICE;
michael@0 1204 }
michael@0 1205 return common(state, tok);
michael@0 1206 }
michael@0 1207
michael@0 1208 #ifdef XML_DTD
michael@0 1209
michael@0 1210 static int PTRCALL
michael@0 1211 condSect0(PROLOG_STATE *state,
michael@0 1212 int tok,
michael@0 1213 const char *ptr,
michael@0 1214 const char *end,
michael@0 1215 const ENCODING *enc)
michael@0 1216 {
michael@0 1217 switch (tok) {
michael@0 1218 case XML_TOK_PROLOG_S:
michael@0 1219 return XML_ROLE_NONE;
michael@0 1220 case XML_TOK_NAME:
michael@0 1221 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
michael@0 1222 state->handler = condSect1;
michael@0 1223 return XML_ROLE_NONE;
michael@0 1224 }
michael@0 1225 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
michael@0 1226 state->handler = condSect2;
michael@0 1227 return XML_ROLE_NONE;
michael@0 1228 }
michael@0 1229 break;
michael@0 1230 }
michael@0 1231 return common(state, tok);
michael@0 1232 }
michael@0 1233
michael@0 1234 static int PTRCALL
michael@0 1235 condSect1(PROLOG_STATE *state,
michael@0 1236 int tok,
michael@0 1237 const char *ptr,
michael@0 1238 const char *end,
michael@0 1239 const ENCODING *enc)
michael@0 1240 {
michael@0 1241 switch (tok) {
michael@0 1242 case XML_TOK_PROLOG_S:
michael@0 1243 return XML_ROLE_NONE;
michael@0 1244 case XML_TOK_OPEN_BRACKET:
michael@0 1245 state->handler = externalSubset1;
michael@0 1246 state->includeLevel += 1;
michael@0 1247 return XML_ROLE_NONE;
michael@0 1248 }
michael@0 1249 return common(state, tok);
michael@0 1250 }
michael@0 1251
michael@0 1252 static int PTRCALL
michael@0 1253 condSect2(PROLOG_STATE *state,
michael@0 1254 int tok,
michael@0 1255 const char *ptr,
michael@0 1256 const char *end,
michael@0 1257 const ENCODING *enc)
michael@0 1258 {
michael@0 1259 switch (tok) {
michael@0 1260 case XML_TOK_PROLOG_S:
michael@0 1261 return XML_ROLE_NONE;
michael@0 1262 case XML_TOK_OPEN_BRACKET:
michael@0 1263 state->handler = externalSubset1;
michael@0 1264 return XML_ROLE_IGNORE_SECT;
michael@0 1265 }
michael@0 1266 return common(state, tok);
michael@0 1267 }
michael@0 1268
michael@0 1269 #endif /* XML_DTD */
michael@0 1270
michael@0 1271 static int PTRCALL
michael@0 1272 declClose(PROLOG_STATE *state,
michael@0 1273 int tok,
michael@0 1274 const char *ptr,
michael@0 1275 const char *end,
michael@0 1276 const ENCODING *enc)
michael@0 1277 {
michael@0 1278 switch (tok) {
michael@0 1279 case XML_TOK_PROLOG_S:
michael@0 1280 return state->role_none;
michael@0 1281 case XML_TOK_DECL_CLOSE:
michael@0 1282 setTopLevel(state);
michael@0 1283 return state->role_none;
michael@0 1284 }
michael@0 1285 return common(state, tok);
michael@0 1286 }
michael@0 1287
michael@0 1288 static int PTRCALL
michael@0 1289 error(PROLOG_STATE *state,
michael@0 1290 int tok,
michael@0 1291 const char *ptr,
michael@0 1292 const char *end,
michael@0 1293 const ENCODING *enc)
michael@0 1294 {
michael@0 1295 return XML_ROLE_NONE;
michael@0 1296 }
michael@0 1297
michael@0 1298 static int FASTCALL
michael@0 1299 common(PROLOG_STATE *state, int tok)
michael@0 1300 {
michael@0 1301 #ifdef XML_DTD
michael@0 1302 if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
michael@0 1303 return XML_ROLE_INNER_PARAM_ENTITY_REF;
michael@0 1304 #endif
michael@0 1305 state->handler = error;
michael@0 1306 return XML_ROLE_ERROR;
michael@0 1307 }
michael@0 1308
michael@0 1309 void
michael@0 1310 XmlPrologStateInit(PROLOG_STATE *state)
michael@0 1311 {
michael@0 1312 state->handler = prolog0;
michael@0 1313 #ifdef XML_DTD
michael@0 1314 state->documentEntity = 1;
michael@0 1315 state->includeLevel = 0;
michael@0 1316 state->inEntityValue = 0;
michael@0 1317 #endif /* XML_DTD */
michael@0 1318 }
michael@0 1319
michael@0 1320 #ifdef XML_DTD
michael@0 1321
michael@0 1322 void
michael@0 1323 XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
michael@0 1324 {
michael@0 1325 state->handler = externalSubset0;
michael@0 1326 state->documentEntity = 0;
michael@0 1327 state->includeLevel = 0;
michael@0 1328 }
michael@0 1329
michael@0 1330 #endif /* XML_DTD */

mercurial