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

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"
1.1.1.2 ! misho      11: #elif defined(__amigaos__)
1.1       misho      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>