Annotation of embedaddon/expat/lib/xmlrole.c, revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>