ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

xmlrole.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.