Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenxmlrole.c
Go to the documentation of this file.
00001 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 00002 See the file COPYING for copying permission. 00003 */ 00004 00005 #include <stddef.h> 00006 00007 #ifdef COMPILED_FROM_DSP 00008 #include "winconfig.h" 00009 #elif defined(MACOS_CLASSIC) 00010 #include "macconfig.h" 00011 #elif defined(__amigaos4__) 00012 #include "amigaconfig.h" 00013 #else 00014 #ifdef HAVE_EXPAT_CONFIG_H 00015 #include <expat_config.h> 00016 #endif 00017 #endif /* ndef COMPILED_FROM_DSP */ 00018 00019 #include "expat_external.h" 00020 #include "internal.h" 00021 #include "xmlrole.h" 00022 #include "ascii.h" 00023 00024 /* Doesn't check: 00025 00026 that ,| are not mixed in a model group 00027 content of literals 00028 00029 */ 00030 00031 static const char KW_ANY[] = { 00032 ASCII_A, ASCII_N, ASCII_Y, '\0' }; 00033 static const char KW_ATTLIST[] = { 00034 ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; 00035 static const char KW_CDATA[] = { 00036 ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 00037 static const char KW_DOCTYPE[] = { 00038 ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; 00039 static const char KW_ELEMENT[] = { 00040 ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; 00041 static const char KW_EMPTY[] = { 00042 ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; 00043 static const char KW_ENTITIES[] = { 00044 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, 00045 '\0' }; 00046 static const char KW_ENTITY[] = { 00047 ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; 00048 static const char KW_FIXED[] = { 00049 ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; 00050 static const char KW_ID[] = { 00051 ASCII_I, ASCII_D, '\0' }; 00052 static const char KW_IDREF[] = { 00053 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; 00054 static const char KW_IDREFS[] = { 00055 ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; 00056 static const char KW_IGNORE[] = { 00057 ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; 00058 static const char KW_IMPLIED[] = { 00059 ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; 00060 static const char KW_INCLUDE[] = { 00061 ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; 00062 static const char KW_NDATA[] = { 00063 ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 00064 static const char KW_NMTOKEN[] = { 00065 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; 00066 static const char KW_NMTOKENS[] = { 00067 ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, 00068 '\0' }; 00069 static const char KW_NOTATION[] = 00070 { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, 00071 '\0' }; 00072 static const char KW_PCDATA[] = { 00073 ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 00074 static const char KW_PUBLIC[] = { 00075 ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; 00076 static const char KW_REQUIRED[] = { 00077 ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, 00078 '\0' }; 00079 static const char KW_SYSTEM[] = { 00080 ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; 00081 00082 #ifndef MIN_BYTES_PER_CHAR 00083 #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) 00084 #endif 00085 00086 #ifdef XML_DTD 00087 #define setTopLevel(state) \ 00088 ((state)->handler = ((state)->documentEntity \ 00089 ? internalSubset \ 00090 : externalSubset1)) 00091 #else /* not XML_DTD */ 00092 #define setTopLevel(state) ((state)->handler = internalSubset) 00093 #endif /* not XML_DTD */ 00094 00095 typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, 00096 int tok, 00097 const char *ptr, 00098 const char *end, 00099 const ENCODING *enc); 00100 00101 static PROLOG_HANDLER 00102 prolog0, prolog1, prolog2, 00103 doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, 00104 internalSubset, 00105 entity0, entity1, entity2, entity3, entity4, entity5, entity6, 00106 entity7, entity8, entity9, entity10, 00107 notation0, notation1, notation2, notation3, notation4, 00108 attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, 00109 attlist7, attlist8, attlist9, 00110 element0, element1, element2, element3, element4, element5, element6, 00111 element7, 00112 #ifdef XML_DTD 00113 externalSubset0, externalSubset1, 00114 condSect0, condSect1, condSect2, 00115 #endif /* XML_DTD */ 00116 declClose, 00117 error; 00118 00119 static int FASTCALL common(PROLOG_STATE *state, int tok); 00120 00121 static int PTRCALL 00122 prolog0(PROLOG_STATE *state, 00123 int tok, 00124 const char *ptr, 00125 const char *end, 00126 const ENCODING *enc) 00127 { 00128 switch (tok) { 00129 case XML_TOK_PROLOG_S: 00130 state->handler = prolog1; 00131 return XML_ROLE_NONE; 00132 case XML_TOK_XML_DECL: 00133 state->handler = prolog1; 00134 return XML_ROLE_XML_DECL; 00135 case XML_TOK_PI: 00136 state->handler = prolog1; 00137 return XML_ROLE_PI; 00138 case XML_TOK_COMMENT: 00139 state->handler = prolog1; 00140 return XML_ROLE_COMMENT; 00141 case XML_TOK_BOM: 00142 return XML_ROLE_NONE; 00143 case XML_TOK_DECL_OPEN: 00144 if (!XmlNameMatchesAscii(enc, 00145 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00146 end, 00147 KW_DOCTYPE)) 00148 break; 00149 state->handler = doctype0; 00150 return XML_ROLE_DOCTYPE_NONE; 00151 case XML_TOK_INSTANCE_START: 00152 state->handler = error; 00153 return XML_ROLE_INSTANCE_START; 00154 } 00155 return common(state, tok); 00156 } 00157 00158 static int PTRCALL 00159 prolog1(PROLOG_STATE *state, 00160 int tok, 00161 const char *ptr, 00162 const char *end, 00163 const ENCODING *enc) 00164 { 00165 switch (tok) { 00166 case XML_TOK_PROLOG_S: 00167 return XML_ROLE_NONE; 00168 case XML_TOK_PI: 00169 return XML_ROLE_PI; 00170 case XML_TOK_COMMENT: 00171 return XML_ROLE_COMMENT; 00172 case XML_TOK_BOM: 00173 return XML_ROLE_NONE; 00174 case XML_TOK_DECL_OPEN: 00175 if (!XmlNameMatchesAscii(enc, 00176 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00177 end, 00178 KW_DOCTYPE)) 00179 break; 00180 state->handler = doctype0; 00181 return XML_ROLE_DOCTYPE_NONE; 00182 case XML_TOK_INSTANCE_START: 00183 state->handler = error; 00184 return XML_ROLE_INSTANCE_START; 00185 } 00186 return common(state, tok); 00187 } 00188 00189 static int PTRCALL 00190 prolog2(PROLOG_STATE *state, 00191 int tok, 00192 const char *ptr, 00193 const char *end, 00194 const ENCODING *enc) 00195 { 00196 switch (tok) { 00197 case XML_TOK_PROLOG_S: 00198 return XML_ROLE_NONE; 00199 case XML_TOK_PI: 00200 return XML_ROLE_PI; 00201 case XML_TOK_COMMENT: 00202 return XML_ROLE_COMMENT; 00203 case XML_TOK_INSTANCE_START: 00204 state->handler = error; 00205 return XML_ROLE_INSTANCE_START; 00206 } 00207 return common(state, tok); 00208 } 00209 00210 static int PTRCALL 00211 doctype0(PROLOG_STATE *state, 00212 int tok, 00213 const char *ptr, 00214 const char *end, 00215 const ENCODING *enc) 00216 { 00217 switch (tok) { 00218 case XML_TOK_PROLOG_S: 00219 return XML_ROLE_DOCTYPE_NONE; 00220 case XML_TOK_NAME: 00221 case XML_TOK_PREFIXED_NAME: 00222 state->handler = doctype1; 00223 return XML_ROLE_DOCTYPE_NAME; 00224 } 00225 return common(state, tok); 00226 } 00227 00228 static int PTRCALL 00229 doctype1(PROLOG_STATE *state, 00230 int tok, 00231 const char *ptr, 00232 const char *end, 00233 const ENCODING *enc) 00234 { 00235 switch (tok) { 00236 case XML_TOK_PROLOG_S: 00237 return XML_ROLE_DOCTYPE_NONE; 00238 case XML_TOK_OPEN_BRACKET: 00239 state->handler = internalSubset; 00240 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 00241 case XML_TOK_DECL_CLOSE: 00242 state->handler = prolog2; 00243 return XML_ROLE_DOCTYPE_CLOSE; 00244 case XML_TOK_NAME: 00245 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 00246 state->handler = doctype3; 00247 return XML_ROLE_DOCTYPE_NONE; 00248 } 00249 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 00250 state->handler = doctype2; 00251 return XML_ROLE_DOCTYPE_NONE; 00252 } 00253 break; 00254 } 00255 return common(state, tok); 00256 } 00257 00258 static int PTRCALL 00259 doctype2(PROLOG_STATE *state, 00260 int tok, 00261 const char *ptr, 00262 const char *end, 00263 const ENCODING *enc) 00264 { 00265 switch (tok) { 00266 case XML_TOK_PROLOG_S: 00267 return XML_ROLE_DOCTYPE_NONE; 00268 case XML_TOK_LITERAL: 00269 state->handler = doctype3; 00270 return XML_ROLE_DOCTYPE_PUBLIC_ID; 00271 } 00272 return common(state, tok); 00273 } 00274 00275 static int PTRCALL 00276 doctype3(PROLOG_STATE *state, 00277 int tok, 00278 const char *ptr, 00279 const char *end, 00280 const ENCODING *enc) 00281 { 00282 switch (tok) { 00283 case XML_TOK_PROLOG_S: 00284 return XML_ROLE_DOCTYPE_NONE; 00285 case XML_TOK_LITERAL: 00286 state->handler = doctype4; 00287 return XML_ROLE_DOCTYPE_SYSTEM_ID; 00288 } 00289 return common(state, tok); 00290 } 00291 00292 static int PTRCALL 00293 doctype4(PROLOG_STATE *state, 00294 int tok, 00295 const char *ptr, 00296 const char *end, 00297 const ENCODING *enc) 00298 { 00299 switch (tok) { 00300 case XML_TOK_PROLOG_S: 00301 return XML_ROLE_DOCTYPE_NONE; 00302 case XML_TOK_OPEN_BRACKET: 00303 state->handler = internalSubset; 00304 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 00305 case XML_TOK_DECL_CLOSE: 00306 state->handler = prolog2; 00307 return XML_ROLE_DOCTYPE_CLOSE; 00308 } 00309 return common(state, tok); 00310 } 00311 00312 static int PTRCALL 00313 doctype5(PROLOG_STATE *state, 00314 int tok, 00315 const char *ptr, 00316 const char *end, 00317 const ENCODING *enc) 00318 { 00319 switch (tok) { 00320 case XML_TOK_PROLOG_S: 00321 return XML_ROLE_DOCTYPE_NONE; 00322 case XML_TOK_DECL_CLOSE: 00323 state->handler = prolog2; 00324 return XML_ROLE_DOCTYPE_CLOSE; 00325 } 00326 return common(state, tok); 00327 } 00328 00329 static int PTRCALL 00330 internalSubset(PROLOG_STATE *state, 00331 int tok, 00332 const char *ptr, 00333 const char *end, 00334 const ENCODING *enc) 00335 { 00336 switch (tok) { 00337 case XML_TOK_PROLOG_S: 00338 return XML_ROLE_NONE; 00339 case XML_TOK_DECL_OPEN: 00340 if (XmlNameMatchesAscii(enc, 00341 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00342 end, 00343 KW_ENTITY)) { 00344 state->handler = entity0; 00345 return XML_ROLE_ENTITY_NONE; 00346 } 00347 if (XmlNameMatchesAscii(enc, 00348 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00349 end, 00350 KW_ATTLIST)) { 00351 state->handler = attlist0; 00352 return XML_ROLE_ATTLIST_NONE; 00353 } 00354 if (XmlNameMatchesAscii(enc, 00355 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00356 end, 00357 KW_ELEMENT)) { 00358 state->handler = element0; 00359 return XML_ROLE_ELEMENT_NONE; 00360 } 00361 if (XmlNameMatchesAscii(enc, 00362 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 00363 end, 00364 KW_NOTATION)) { 00365 state->handler = notation0; 00366 return XML_ROLE_NOTATION_NONE; 00367 } 00368 break; 00369 case XML_TOK_PI: 00370 return XML_ROLE_PI; 00371 case XML_TOK_COMMENT: 00372 return XML_ROLE_COMMENT; 00373 case XML_TOK_PARAM_ENTITY_REF: 00374 return XML_ROLE_PARAM_ENTITY_REF; 00375 case XML_TOK_CLOSE_BRACKET: 00376 state->handler = doctype5; 00377 return XML_ROLE_DOCTYPE_NONE; 00378 case XML_TOK_NONE: 00379 return XML_ROLE_NONE; 00380 } 00381 return common(state, tok); 00382 } 00383 00384 #ifdef XML_DTD 00385 00386 static int PTRCALL 00387 externalSubset0(PROLOG_STATE *state, 00388 int tok, 00389 const char *ptr, 00390 const char *end, 00391 const ENCODING *enc) 00392 { 00393 state->handler = externalSubset1; 00394 if (tok == XML_TOK_XML_DECL) 00395 return XML_ROLE_TEXT_DECL; 00396 return externalSubset1(state, tok, ptr, end, enc); 00397 } 00398 00399 static int PTRCALL 00400 externalSubset1(PROLOG_STATE *state, 00401 int tok, 00402 const char *ptr, 00403 const char *end, 00404 const ENCODING *enc) 00405 { 00406 switch (tok) { 00407 case XML_TOK_COND_SECT_OPEN: 00408 state->handler = condSect0; 00409 return XML_ROLE_NONE; 00410 case XML_TOK_COND_SECT_CLOSE: 00411 if (state->includeLevel == 0) 00412 break; 00413 state->includeLevel -= 1; 00414 return XML_ROLE_NONE; 00415 case XML_TOK_PROLOG_S: 00416 return XML_ROLE_NONE; 00417 case XML_TOK_CLOSE_BRACKET: 00418 break; 00419 case XML_TOK_NONE: 00420 if (state->includeLevel) 00421 break; 00422 return XML_ROLE_NONE; 00423 default: 00424 return internalSubset(state, tok, ptr, end, enc); 00425 } 00426 return common(state, tok); 00427 } 00428 00429 #endif /* XML_DTD */ 00430 00431 static int PTRCALL 00432 entity0(PROLOG_STATE *state, 00433 int tok, 00434 const char *ptr, 00435 const char *end, 00436 const ENCODING *enc) 00437 { 00438 switch (tok) { 00439 case XML_TOK_PROLOG_S: 00440 return XML_ROLE_ENTITY_NONE; 00441 case XML_TOK_PERCENT: 00442 state->handler = entity1; 00443 return XML_ROLE_ENTITY_NONE; 00444 case XML_TOK_NAME: 00445 state->handler = entity2; 00446 return XML_ROLE_GENERAL_ENTITY_NAME; 00447 } 00448 return common(state, tok); 00449 } 00450 00451 static int PTRCALL 00452 entity1(PROLOG_STATE *state, 00453 int tok, 00454 const char *ptr, 00455 const char *end, 00456 const ENCODING *enc) 00457 { 00458 switch (tok) { 00459 case XML_TOK_PROLOG_S: 00460 return XML_ROLE_ENTITY_NONE; 00461 case XML_TOK_NAME: 00462 state->handler = entity7; 00463 return XML_ROLE_PARAM_ENTITY_NAME; 00464 } 00465 return common(state, tok); 00466 } 00467 00468 static int PTRCALL 00469 entity2(PROLOG_STATE *state, 00470 int tok, 00471 const char *ptr, 00472 const char *end, 00473 const ENCODING *enc) 00474 { 00475 switch (tok) { 00476 case XML_TOK_PROLOG_S: 00477 return XML_ROLE_ENTITY_NONE; 00478 case XML_TOK_NAME: 00479 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 00480 state->handler = entity4; 00481 return XML_ROLE_ENTITY_NONE; 00482 } 00483 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 00484 state->handler = entity3; 00485 return XML_ROLE_ENTITY_NONE; 00486 } 00487 break; 00488 case XML_TOK_LITERAL: 00489 state->handler = declClose; 00490 state->role_none = XML_ROLE_ENTITY_NONE; 00491 return XML_ROLE_ENTITY_VALUE; 00492 } 00493 return common(state, tok); 00494 } 00495 00496 static int PTRCALL 00497 entity3(PROLOG_STATE *state, 00498 int tok, 00499 const char *ptr, 00500 const char *end, 00501 const ENCODING *enc) 00502 { 00503 switch (tok) { 00504 case XML_TOK_PROLOG_S: 00505 return XML_ROLE_ENTITY_NONE; 00506 case XML_TOK_LITERAL: 00507 state->handler = entity4; 00508 return XML_ROLE_ENTITY_PUBLIC_ID; 00509 } 00510 return common(state, tok); 00511 } 00512 00513 static int PTRCALL 00514 entity4(PROLOG_STATE *state, 00515 int tok, 00516 const char *ptr, 00517 const char *end, 00518 const ENCODING *enc) 00519 { 00520 switch (tok) { 00521 case XML_TOK_PROLOG_S: 00522 return XML_ROLE_ENTITY_NONE; 00523 case XML_TOK_LITERAL: 00524 state->handler = entity5; 00525 return XML_ROLE_ENTITY_SYSTEM_ID; 00526 } 00527 return common(state, tok); 00528 } 00529 00530 static int PTRCALL 00531 entity5(PROLOG_STATE *state, 00532 int tok, 00533 const char *ptr, 00534 const char *end, 00535 const ENCODING *enc) 00536 { 00537 switch (tok) { 00538 case XML_TOK_PROLOG_S: 00539 return XML_ROLE_ENTITY_NONE; 00540 case XML_TOK_DECL_CLOSE: 00541 setTopLevel(state); 00542 return XML_ROLE_ENTITY_COMPLETE; 00543 case XML_TOK_NAME: 00544 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { 00545 state->handler = entity6; 00546 return XML_ROLE_ENTITY_NONE; 00547 } 00548 break; 00549 } 00550 return common(state, tok); 00551 } 00552 00553 static int PTRCALL 00554 entity6(PROLOG_STATE *state, 00555 int tok, 00556 const char *ptr, 00557 const char *end, 00558 const ENCODING *enc) 00559 { 00560 switch (tok) { 00561 case XML_TOK_PROLOG_S: 00562 return XML_ROLE_ENTITY_NONE; 00563 case XML_TOK_NAME: 00564 state->handler = declClose; 00565 state->role_none = XML_ROLE_ENTITY_NONE; 00566 return XML_ROLE_ENTITY_NOTATION_NAME; 00567 } 00568 return common(state, tok); 00569 } 00570 00571 static int PTRCALL 00572 entity7(PROLOG_STATE *state, 00573 int tok, 00574 const char *ptr, 00575 const char *end, 00576 const ENCODING *enc) 00577 { 00578 switch (tok) { 00579 case XML_TOK_PROLOG_S: 00580 return XML_ROLE_ENTITY_NONE; 00581 case XML_TOK_NAME: 00582 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 00583 state->handler = entity9; 00584 return XML_ROLE_ENTITY_NONE; 00585 } 00586 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 00587 state->handler = entity8; 00588 return XML_ROLE_ENTITY_NONE; 00589 } 00590 break; 00591 case XML_TOK_LITERAL: 00592 state->handler = declClose; 00593 state->role_none = XML_ROLE_ENTITY_NONE; 00594 return XML_ROLE_ENTITY_VALUE; 00595 } 00596 return common(state, tok); 00597 } 00598 00599 static int PTRCALL 00600 entity8(PROLOG_STATE *state, 00601 int tok, 00602 const char *ptr, 00603 const char *end, 00604 const ENCODING *enc) 00605 { 00606 switch (tok) { 00607 case XML_TOK_PROLOG_S: 00608 return XML_ROLE_ENTITY_NONE; 00609 case XML_TOK_LITERAL: 00610 state->handler = entity9; 00611 return XML_ROLE_ENTITY_PUBLIC_ID; 00612 } 00613 return common(state, tok); 00614 } 00615 00616 static int PTRCALL 00617 entity9(PROLOG_STATE *state, 00618 int tok, 00619 const char *ptr, 00620 const char *end, 00621 const ENCODING *enc) 00622 { 00623 switch (tok) { 00624 case XML_TOK_PROLOG_S: 00625 return XML_ROLE_ENTITY_NONE; 00626 case XML_TOK_LITERAL: 00627 state->handler = entity10; 00628 return XML_ROLE_ENTITY_SYSTEM_ID; 00629 } 00630 return common(state, tok); 00631 } 00632 00633 static int PTRCALL 00634 entity10(PROLOG_STATE *state, 00635 int tok, 00636 const char *ptr, 00637 const char *end, 00638 const ENCODING *enc) 00639 { 00640 switch (tok) { 00641 case XML_TOK_PROLOG_S: 00642 return XML_ROLE_ENTITY_NONE; 00643 case XML_TOK_DECL_CLOSE: 00644 setTopLevel(state); 00645 return XML_ROLE_ENTITY_COMPLETE; 00646 } 00647 return common(state, tok); 00648 } 00649 00650 static int PTRCALL 00651 notation0(PROLOG_STATE *state, 00652 int tok, 00653 const char *ptr, 00654 const char *end, 00655 const ENCODING *enc) 00656 { 00657 switch (tok) { 00658 case XML_TOK_PROLOG_S: 00659 return XML_ROLE_NOTATION_NONE; 00660 case XML_TOK_NAME: 00661 state->handler = notation1; 00662 return XML_ROLE_NOTATION_NAME; 00663 } 00664 return common(state, tok); 00665 } 00666 00667 static int PTRCALL 00668 notation1(PROLOG_STATE *state, 00669 int tok, 00670 const char *ptr, 00671 const char *end, 00672 const ENCODING *enc) 00673 { 00674 switch (tok) { 00675 case XML_TOK_PROLOG_S: 00676 return XML_ROLE_NOTATION_NONE; 00677 case XML_TOK_NAME: 00678 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 00679 state->handler = notation3; 00680 return XML_ROLE_NOTATION_NONE; 00681 } 00682 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 00683 state->handler = notation2; 00684 return XML_ROLE_NOTATION_NONE; 00685 } 00686 break; 00687 } 00688 return common(state, tok); 00689 } 00690 00691 static int PTRCALL 00692 notation2(PROLOG_STATE *state, 00693 int tok, 00694 const char *ptr, 00695 const char *end, 00696 const ENCODING *enc) 00697 { 00698 switch (tok) { 00699 case XML_TOK_PROLOG_S: 00700 return XML_ROLE_NOTATION_NONE; 00701 case XML_TOK_LITERAL: 00702 state->handler = notation4; 00703 return XML_ROLE_NOTATION_PUBLIC_ID; 00704 } 00705 return common(state, tok); 00706 } 00707 00708 static int PTRCALL 00709 notation3(PROLOG_STATE *state, 00710 int tok, 00711 const char *ptr, 00712 const char *end, 00713 const ENCODING *enc) 00714 { 00715 switch (tok) { 00716 case XML_TOK_PROLOG_S: 00717 return XML_ROLE_NOTATION_NONE; 00718 case XML_TOK_LITERAL: 00719 state->handler = declClose; 00720 state->role_none = XML_ROLE_NOTATION_NONE; 00721 return XML_ROLE_NOTATION_SYSTEM_ID; 00722 } 00723 return common(state, tok); 00724 } 00725 00726 static int PTRCALL 00727 notation4(PROLOG_STATE *state, 00728 int tok, 00729 const char *ptr, 00730 const char *end, 00731 const ENCODING *enc) 00732 { 00733 switch (tok) { 00734 case XML_TOK_PROLOG_S: 00735 return XML_ROLE_NOTATION_NONE; 00736 case XML_TOK_LITERAL: 00737 state->handler = declClose; 00738 state->role_none = XML_ROLE_NOTATION_NONE; 00739 return XML_ROLE_NOTATION_SYSTEM_ID; 00740 case XML_TOK_DECL_CLOSE: 00741 setTopLevel(state); 00742 return XML_ROLE_NOTATION_NO_SYSTEM_ID; 00743 } 00744 return common(state, tok); 00745 } 00746 00747 static int PTRCALL 00748 attlist0(PROLOG_STATE *state, 00749 int tok, 00750 const char *ptr, 00751 const char *end, 00752 const ENCODING *enc) 00753 { 00754 switch (tok) { 00755 case XML_TOK_PROLOG_S: 00756 return XML_ROLE_ATTLIST_NONE; 00757 case XML_TOK_NAME: 00758 case XML_TOK_PREFIXED_NAME: 00759 state->handler = attlist1; 00760 return XML_ROLE_ATTLIST_ELEMENT_NAME; 00761 } 00762 return common(state, tok); 00763 } 00764 00765 static int PTRCALL 00766 attlist1(PROLOG_STATE *state, 00767 int tok, 00768 const char *ptr, 00769 const char *end, 00770 const ENCODING *enc) 00771 { 00772 switch (tok) { 00773 case XML_TOK_PROLOG_S: 00774 return XML_ROLE_ATTLIST_NONE; 00775 case XML_TOK_DECL_CLOSE: 00776 setTopLevel(state); 00777 return XML_ROLE_ATTLIST_NONE; 00778 case XML_TOK_NAME: 00779 case XML_TOK_PREFIXED_NAME: 00780 state->handler = attlist2; 00781 return XML_ROLE_ATTRIBUTE_NAME; 00782 } 00783 return common(state, tok); 00784 } 00785 00786 static int PTRCALL 00787 attlist2(PROLOG_STATE *state, 00788 int tok, 00789 const char *ptr, 00790 const char *end, 00791 const ENCODING *enc) 00792 { 00793 switch (tok) { 00794 case XML_TOK_PROLOG_S: 00795 return XML_ROLE_ATTLIST_NONE; 00796 case XML_TOK_NAME: 00797 { 00798 static const char * const types[] = { 00799 KW_CDATA, 00800 KW_ID, 00801 KW_IDREF, 00802 KW_IDREFS, 00803 KW_ENTITY, 00804 KW_ENTITIES, 00805 KW_NMTOKEN, 00806 KW_NMTOKENS, 00807 }; 00808 int i; 00809 for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) 00810 if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { 00811 state->handler = attlist8; 00812 return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; 00813 } 00814 } 00815 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { 00816 state->handler = attlist5; 00817 return XML_ROLE_ATTLIST_NONE; 00818 } 00819 break; 00820 case XML_TOK_OPEN_PAREN: 00821 state->handler = attlist3; 00822 return XML_ROLE_ATTLIST_NONE; 00823 } 00824 return common(state, tok); 00825 } 00826 00827 static int PTRCALL 00828 attlist3(PROLOG_STATE *state, 00829 int tok, 00830 const char *ptr, 00831 const char *end, 00832 const ENCODING *enc) 00833 { 00834 switch (tok) { 00835 case XML_TOK_PROLOG_S: 00836 return XML_ROLE_ATTLIST_NONE; 00837 case XML_TOK_NMTOKEN: 00838 case XML_TOK_NAME: 00839 case XML_TOK_PREFIXED_NAME: 00840 state->handler = attlist4; 00841 return XML_ROLE_ATTRIBUTE_ENUM_VALUE; 00842 } 00843 return common(state, tok); 00844 } 00845 00846 static int PTRCALL 00847 attlist4(PROLOG_STATE *state, 00848 int tok, 00849 const char *ptr, 00850 const char *end, 00851 const ENCODING *enc) 00852 { 00853 switch (tok) { 00854 case XML_TOK_PROLOG_S: 00855 return XML_ROLE_ATTLIST_NONE; 00856 case XML_TOK_CLOSE_PAREN: 00857 state->handler = attlist8; 00858 return XML_ROLE_ATTLIST_NONE; 00859 case XML_TOK_OR: 00860 state->handler = attlist3; 00861 return XML_ROLE_ATTLIST_NONE; 00862 } 00863 return common(state, tok); 00864 } 00865 00866 static int PTRCALL 00867 attlist5(PROLOG_STATE *state, 00868 int tok, 00869 const char *ptr, 00870 const char *end, 00871 const ENCODING *enc) 00872 { 00873 switch (tok) { 00874 case XML_TOK_PROLOG_S: 00875 return XML_ROLE_ATTLIST_NONE; 00876 case XML_TOK_OPEN_PAREN: 00877 state->handler = attlist6; 00878 return XML_ROLE_ATTLIST_NONE; 00879 } 00880 return common(state, tok); 00881 } 00882 00883 static int PTRCALL 00884 attlist6(PROLOG_STATE *state, 00885 int tok, 00886 const char *ptr, 00887 const char *end, 00888 const ENCODING *enc) 00889 { 00890 switch (tok) { 00891 case XML_TOK_PROLOG_S: 00892 return XML_ROLE_ATTLIST_NONE; 00893 case XML_TOK_NAME: 00894 state->handler = attlist7; 00895 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; 00896 } 00897 return common(state, tok); 00898 } 00899 00900 static int PTRCALL 00901 attlist7(PROLOG_STATE *state, 00902 int tok, 00903 const char *ptr, 00904 const char *end, 00905 const ENCODING *enc) 00906 { 00907 switch (tok) { 00908 case XML_TOK_PROLOG_S: 00909 return XML_ROLE_ATTLIST_NONE; 00910 case XML_TOK_CLOSE_PAREN: 00911 state->handler = attlist8; 00912 return XML_ROLE_ATTLIST_NONE; 00913 case XML_TOK_OR: 00914 state->handler = attlist6; 00915 return XML_ROLE_ATTLIST_NONE; 00916 } 00917 return common(state, tok); 00918 } 00919 00920 /* default value */ 00921 static int PTRCALL 00922 attlist8(PROLOG_STATE *state, 00923 int tok, 00924 const char *ptr, 00925 const char *end, 00926 const ENCODING *enc) 00927 { 00928 switch (tok) { 00929 case XML_TOK_PROLOG_S: 00930 return XML_ROLE_ATTLIST_NONE; 00931 case XML_TOK_POUND_NAME: 00932 if (XmlNameMatchesAscii(enc, 00933 ptr + MIN_BYTES_PER_CHAR(enc), 00934 end, 00935 KW_IMPLIED)) { 00936 state->handler = attlist1; 00937 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; 00938 } 00939 if (XmlNameMatchesAscii(enc, 00940 ptr + MIN_BYTES_PER_CHAR(enc), 00941 end, 00942 KW_REQUIRED)) { 00943 state->handler = attlist1; 00944 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; 00945 } 00946 if (XmlNameMatchesAscii(enc, 00947 ptr + MIN_BYTES_PER_CHAR(enc), 00948 end, 00949 KW_FIXED)) { 00950 state->handler = attlist9; 00951 return XML_ROLE_ATTLIST_NONE; 00952 } 00953 break; 00954 case XML_TOK_LITERAL: 00955 state->handler = attlist1; 00956 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; 00957 } 00958 return common(state, tok); 00959 } 00960 00961 static int PTRCALL 00962 attlist9(PROLOG_STATE *state, 00963 int tok, 00964 const char *ptr, 00965 const char *end, 00966 const ENCODING *enc) 00967 { 00968 switch (tok) { 00969 case XML_TOK_PROLOG_S: 00970 return XML_ROLE_ATTLIST_NONE; 00971 case XML_TOK_LITERAL: 00972 state->handler = attlist1; 00973 return XML_ROLE_FIXED_ATTRIBUTE_VALUE; 00974 } 00975 return common(state, tok); 00976 } 00977 00978 static int PTRCALL 00979 element0(PROLOG_STATE *state, 00980 int tok, 00981 const char *ptr, 00982 const char *end, 00983 const ENCODING *enc) 00984 { 00985 switch (tok) { 00986 case XML_TOK_PROLOG_S: 00987 return XML_ROLE_ELEMENT_NONE; 00988 case XML_TOK_NAME: 00989 case XML_TOK_PREFIXED_NAME: 00990 state->handler = element1; 00991 return XML_ROLE_ELEMENT_NAME; 00992 } 00993 return common(state, tok); 00994 } 00995 00996 static int PTRCALL 00997 element1(PROLOG_STATE *state, 00998 int tok, 00999 const char *ptr, 01000 const char *end, 01001 const ENCODING *enc) 01002 { 01003 switch (tok) { 01004 case XML_TOK_PROLOG_S: 01005 return XML_ROLE_ELEMENT_NONE; 01006 case XML_TOK_NAME: 01007 if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { 01008 state->handler = declClose; 01009 state->role_none = XML_ROLE_ELEMENT_NONE; 01010 return XML_ROLE_CONTENT_EMPTY; 01011 } 01012 if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { 01013 state->handler = declClose; 01014 state->role_none = XML_ROLE_ELEMENT_NONE; 01015 return XML_ROLE_CONTENT_ANY; 01016 } 01017 break; 01018 case XML_TOK_OPEN_PAREN: 01019 state->handler = element2; 01020 state->level = 1; 01021 return XML_ROLE_GROUP_OPEN; 01022 } 01023 return common(state, tok); 01024 } 01025 01026 static int PTRCALL 01027 element2(PROLOG_STATE *state, 01028 int tok, 01029 const char *ptr, 01030 const char *end, 01031 const ENCODING *enc) 01032 { 01033 switch (tok) { 01034 case XML_TOK_PROLOG_S: 01035 return XML_ROLE_ELEMENT_NONE; 01036 case XML_TOK_POUND_NAME: 01037 if (XmlNameMatchesAscii(enc, 01038 ptr + MIN_BYTES_PER_CHAR(enc), 01039 end, 01040 KW_PCDATA)) { 01041 state->handler = element3; 01042 return XML_ROLE_CONTENT_PCDATA; 01043 } 01044 break; 01045 case XML_TOK_OPEN_PAREN: 01046 state->level = 2; 01047 state->handler = element6; 01048 return XML_ROLE_GROUP_OPEN; 01049 case XML_TOK_NAME: 01050 case XML_TOK_PREFIXED_NAME: 01051 state->handler = element7; 01052 return XML_ROLE_CONTENT_ELEMENT; 01053 case XML_TOK_NAME_QUESTION: 01054 state->handler = element7; 01055 return XML_ROLE_CONTENT_ELEMENT_OPT; 01056 case XML_TOK_NAME_ASTERISK: 01057 state->handler = element7; 01058 return XML_ROLE_CONTENT_ELEMENT_REP; 01059 case XML_TOK_NAME_PLUS: 01060 state->handler = element7; 01061 return XML_ROLE_CONTENT_ELEMENT_PLUS; 01062 } 01063 return common(state, tok); 01064 } 01065 01066 static int PTRCALL 01067 element3(PROLOG_STATE *state, 01068 int tok, 01069 const char *ptr, 01070 const char *end, 01071 const ENCODING *enc) 01072 { 01073 switch (tok) { 01074 case XML_TOK_PROLOG_S: 01075 return XML_ROLE_ELEMENT_NONE; 01076 case XML_TOK_CLOSE_PAREN: 01077 state->handler = declClose; 01078 state->role_none = XML_ROLE_ELEMENT_NONE; 01079 return XML_ROLE_GROUP_CLOSE; 01080 case XML_TOK_CLOSE_PAREN_ASTERISK: 01081 state->handler = declClose; 01082 state->role_none = XML_ROLE_ELEMENT_NONE; 01083 return XML_ROLE_GROUP_CLOSE_REP; 01084 case XML_TOK_OR: 01085 state->handler = element4; 01086 return XML_ROLE_ELEMENT_NONE; 01087 } 01088 return common(state, tok); 01089 } 01090 01091 static int PTRCALL 01092 element4(PROLOG_STATE *state, 01093 int tok, 01094 const char *ptr, 01095 const char *end, 01096 const ENCODING *enc) 01097 { 01098 switch (tok) { 01099 case XML_TOK_PROLOG_S: 01100 return XML_ROLE_ELEMENT_NONE; 01101 case XML_TOK_NAME: 01102 case XML_TOK_PREFIXED_NAME: 01103 state->handler = element5; 01104 return XML_ROLE_CONTENT_ELEMENT; 01105 } 01106 return common(state, tok); 01107 } 01108 01109 static int PTRCALL 01110 element5(PROLOG_STATE *state, 01111 int tok, 01112 const char *ptr, 01113 const char *end, 01114 const ENCODING *enc) 01115 { 01116 switch (tok) { 01117 case XML_TOK_PROLOG_S: 01118 return XML_ROLE_ELEMENT_NONE; 01119 case XML_TOK_CLOSE_PAREN_ASTERISK: 01120 state->handler = declClose; 01121 state->role_none = XML_ROLE_ELEMENT_NONE; 01122 return XML_ROLE_GROUP_CLOSE_REP; 01123 case XML_TOK_OR: 01124 state->handler = element4; 01125 return XML_ROLE_ELEMENT_NONE; 01126 } 01127 return common(state, tok); 01128 } 01129 01130 static int PTRCALL 01131 element6(PROLOG_STATE *state, 01132 int tok, 01133 const char *ptr, 01134 const char *end, 01135 const ENCODING *enc) 01136 { 01137 switch (tok) { 01138 case XML_TOK_PROLOG_S: 01139 return XML_ROLE_ELEMENT_NONE; 01140 case XML_TOK_OPEN_PAREN: 01141 state->level += 1; 01142 return XML_ROLE_GROUP_OPEN; 01143 case XML_TOK_NAME: 01144 case XML_TOK_PREFIXED_NAME: 01145 state->handler = element7; 01146 return XML_ROLE_CONTENT_ELEMENT; 01147 case XML_TOK_NAME_QUESTION: 01148 state->handler = element7; 01149 return XML_ROLE_CONTENT_ELEMENT_OPT; 01150 case XML_TOK_NAME_ASTERISK: 01151 state->handler = element7; 01152 return XML_ROLE_CONTENT_ELEMENT_REP; 01153 case XML_TOK_NAME_PLUS: 01154 state->handler = element7; 01155 return XML_ROLE_CONTENT_ELEMENT_PLUS; 01156 } 01157 return common(state, tok); 01158 } 01159 01160 static int PTRCALL 01161 element7(PROLOG_STATE *state, 01162 int tok, 01163 const char *ptr, 01164 const char *end, 01165 const ENCODING *enc) 01166 { 01167 switch (tok) { 01168 case XML_TOK_PROLOG_S: 01169 return XML_ROLE_ELEMENT_NONE; 01170 case XML_TOK_CLOSE_PAREN: 01171 state->level -= 1; 01172 if (state->level == 0) { 01173 state->handler = declClose; 01174 state->role_none = XML_ROLE_ELEMENT_NONE; 01175 } 01176 return XML_ROLE_GROUP_CLOSE; 01177 case XML_TOK_CLOSE_PAREN_ASTERISK: 01178 state->level -= 1; 01179 if (state->level == 0) { 01180 state->handler = declClose; 01181 state->role_none = XML_ROLE_ELEMENT_NONE; 01182 } 01183 return XML_ROLE_GROUP_CLOSE_REP; 01184 case XML_TOK_CLOSE_PAREN_QUESTION: 01185 state->level -= 1; 01186 if (state->level == 0) { 01187 state->handler = declClose; 01188 state->role_none = XML_ROLE_ELEMENT_NONE; 01189 } 01190 return XML_ROLE_GROUP_CLOSE_OPT; 01191 case XML_TOK_CLOSE_PAREN_PLUS: 01192 state->level -= 1; 01193 if (state->level == 0) { 01194 state->handler = declClose; 01195 state->role_none = XML_ROLE_ELEMENT_NONE; 01196 } 01197 return XML_ROLE_GROUP_CLOSE_PLUS; 01198 case XML_TOK_COMMA: 01199 state->handler = element6; 01200 return XML_ROLE_GROUP_SEQUENCE; 01201 case XML_TOK_OR: 01202 state->handler = element6; 01203 return XML_ROLE_GROUP_CHOICE; 01204 } 01205 return common(state, tok); 01206 } 01207 01208 #ifdef XML_DTD 01209 01210 static int PTRCALL 01211 condSect0(PROLOG_STATE *state, 01212 int tok, 01213 const char *ptr, 01214 const char *end, 01215 const ENCODING *enc) 01216 { 01217 switch (tok) { 01218 case XML_TOK_PROLOG_S: 01219 return XML_ROLE_NONE; 01220 case XML_TOK_NAME: 01221 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { 01222 state->handler = condSect1; 01223 return XML_ROLE_NONE; 01224 } 01225 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { 01226 state->handler = condSect2; 01227 return XML_ROLE_NONE; 01228 } 01229 break; 01230 } 01231 return common(state, tok); 01232 } 01233 01234 static int PTRCALL 01235 condSect1(PROLOG_STATE *state, 01236 int tok, 01237 const char *ptr, 01238 const char *end, 01239 const ENCODING *enc) 01240 { 01241 switch (tok) { 01242 case XML_TOK_PROLOG_S: 01243 return XML_ROLE_NONE; 01244 case XML_TOK_OPEN_BRACKET: 01245 state->handler = externalSubset1; 01246 state->includeLevel += 1; 01247 return XML_ROLE_NONE; 01248 } 01249 return common(state, tok); 01250 } 01251 01252 static int PTRCALL 01253 condSect2(PROLOG_STATE *state, 01254 int tok, 01255 const char *ptr, 01256 const char *end, 01257 const ENCODING *enc) 01258 { 01259 switch (tok) { 01260 case XML_TOK_PROLOG_S: 01261 return XML_ROLE_NONE; 01262 case XML_TOK_OPEN_BRACKET: 01263 state->handler = externalSubset1; 01264 return XML_ROLE_IGNORE_SECT; 01265 } 01266 return common(state, tok); 01267 } 01268 01269 #endif /* XML_DTD */ 01270 01271 static int PTRCALL 01272 declClose(PROLOG_STATE *state, 01273 int tok, 01274 const char *ptr, 01275 const char *end, 01276 const ENCODING *enc) 01277 { 01278 switch (tok) { 01279 case XML_TOK_PROLOG_S: 01280 return state->role_none; 01281 case XML_TOK_DECL_CLOSE: 01282 setTopLevel(state); 01283 return state->role_none; 01284 } 01285 return common(state, tok); 01286 } 01287 01288 static int PTRCALL 01289 error(PROLOG_STATE *state, 01290 int tok, 01291 const char *ptr, 01292 const char *end, 01293 const ENCODING *enc) 01294 { 01295 return XML_ROLE_NONE; 01296 } 01297 01298 static int FASTCALL 01299 common(PROLOG_STATE *state, int tok) 01300 { 01301 #ifdef XML_DTD 01302 if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) 01303 return XML_ROLE_INNER_PARAM_ENTITY_REF; 01304 #endif 01305 state->handler = error; 01306 return XML_ROLE_ERROR; 01307 } 01308 01309 void 01310 XmlPrologStateInit(PROLOG_STATE *state) 01311 { 01312 state->handler = prolog0; 01313 #ifdef XML_DTD 01314 state->documentEntity = 1; 01315 state->includeLevel = 0; 01316 state->inEntityValue = 0; 01317 #endif /* XML_DTD */ 01318 } 01319 01320 #ifdef XML_DTD 01321 01322 void 01323 XmlPrologStateInitExternalEntity(PROLOG_STATE *state) 01324 { 01325 state->handler = externalSubset0; 01326 state->documentEntity = 0; 01327 state->includeLevel = 0; 01328 } 01329 01330 #endif /* XML_DTD */ Generated on Sat May 26 2012 04:32:24 for ReactOS by
1.7.6.1
|