unsigned int getBitsFirstPartCode(EXIOptions opts, EXIGrammar* grammar, GrammarRule* currentRule, SmallIndex currentRuleIndx, boolean isNilType) { unsigned char secondLevelExists = 0; if(IS_BUILT_IN_ELEM(grammar->props)) { // Built-in element grammar // There is always a second level production return getBitsNumber(currentRule->pCount); } else if(IS_DOCUMENT(grammar->props)) { // Document grammar if(IS_PRESERVED(opts.preserve, PRESERVE_COMMENTS) || IS_PRESERVED(opts.preserve, PRESERVE_PIS)) secondLevelExists = 1; else if(currentRuleIndx == 0 && IS_PRESERVED(opts.preserve, PRESERVE_DTD)) secondLevelExists = 1; return getBitsNumber(currentRule->pCount - 1 + secondLevelExists); } else if(IS_FRAGMENT(grammar->props)) { // Fragment grammar if(IS_PRESERVED(opts.preserve, PRESERVE_COMMENTS) || IS_PRESERVED(opts.preserve, PRESERVE_PIS)) secondLevelExists = 1; return getBitsNumber(currentRule->pCount - 1 + secondLevelExists); } else { // Schema-informed element/type grammar Index prodCount; if(isNilType == FALSE) prodCount = currentRule->pCount; else prodCount = RULE_GET_AT_COUNT(currentRule->meta) + RULE_CONTAIN_EE(currentRule->meta); if(WITH_STRICT(opts.enumOpt)) { // Strict mode if(isNilType == FALSE && currentRuleIndx == 0 && (HAS_NAMED_SUB_TYPE_OR_UNION(grammar->props) || IS_NILLABLE(grammar->props))) secondLevelExists = 1; return getBitsNumber(prodCount - 1 + secondLevelExists); } else // Non-strict mode { // There is always a second level production return getBitsNumber(prodCount); } } }
errorCode createBuiltInElementGrammar(EXIGrammar* elementGrammar, EXIStream* strm) { unsigned int tmp_code1 = 0; // the number of productions with event codes with length 1 unsigned int tmp_code2 = 0; // the number of productions with event codes with length 2 unsigned int tmp_code3 = 0; // the number of productions with event codes with length 3 DynGrammarRule* tmp_rule; unsigned int p = 1; elementGrammar->count = DEF_ELEMENT_GRAMMAR_RULE_NUMBER; elementGrammar->props = 0; SET_BUILT_IN_ELEM(elementGrammar->props); SET_AUGMENTED(elementGrammar->props); elementGrammar->contentIndex = 0; elementGrammar->rule = (GrammarRule*) EXIP_MALLOC(sizeof(DynGrammarRule)*DEF_ELEMENT_GRAMMAR_RULE_NUMBER); if(elementGrammar->rule == NULL) return MEMORY_ALLOCATION_ERROR; /* Rule for StartTagContent */ /* StartTagContent : * EE 0.0 * AT (*) StartTagContent 0.1 * NS StartTagContent 0.2 * SC Fragment 0.3 * SE (*) ElementContent 0.4 * CH ElementContent 0.5 * ER ElementContent 0.6 * CM ElementContent 0.7.0 * PI ElementContent 0.7.1 */ tmp_rule = &((DynGrammarRule*) elementGrammar->rule)[GR_START_TAG_CONTENT]; /* Initialize Part 2 */ tmp_rule->part[1].prod = NULL; tmp_rule->part[1].count = 0; tmp_rule->part[1].bits = 0; /* Initialize Part 3 */ tmp_rule->part[2].prod = NULL; tmp_rule->part[2].count = 0; tmp_rule->part[2].bits = 0; tmp_code1 = 0; tmp_code2 = 4; tmp_code3 = 0; /* Part 1 */ tmp_rule->part[0].prod = (Production*) EXIP_MALLOC(sizeof(Production)*DEFAULT_PROD_ARRAY_DIM); if(tmp_rule->part[0].prod == NULL) return MEMORY_ALLOCATION_ERROR; /* The part 1 productions get added later... */ tmp_rule->part[0].count = 0; tmp_rule->part[0].bits = 0; tmp_rule->part0Dimension = DEFAULT_PROD_ARRAY_DIM; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PREFIXES)) tmp_code2 += 1; if(WITH_SELF_CONTAINED(strm->header.opts.enumOpt)) tmp_code2 += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_DTD)) tmp_code2 += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_COMMENTS)) tmp_code3 += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PIS)) tmp_code3 += 1; /* Part 2 */ tmp_rule->part[1].prod = (Production*) EXIP_MALLOC(sizeof(Production)*tmp_code2); if(tmp_rule->part[1].prod == NULL) return MEMORY_ALLOCATION_ERROR; /* EE 0.0 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_EE; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_VOID_NON_TERMINAL; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; /* AT (*) StartTagContent 0.1 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_AT_ALL; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_START_TAG_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PREFIXES)) { /* NS StartTagContent 0.2 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_NS; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_START_TAG_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; } if(WITH_SELF_CONTAINED(strm->header.opts.enumOpt)) { /* SC Fragment 0.3 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_SC; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_FRAGMENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; } /* SE (*) ElementContent 0.2 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_SE_ALL; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; /* CH ElementContent 0.3 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_CH; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_DTD)) { /* ER ElementContent 0.6 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_ER; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; } tmp_rule->part[1].count = tmp_code2; tmp_rule->part[1].bits = getBitsNumber(tmp_code2 - 1 + (tmp_code3 > 0)); /* Part 3 */ if(tmp_code3 > 0) { p = 1; tmp_rule->part[2].prod = (Production*) EXIP_MALLOC(sizeof(Production)*tmp_code3); if(tmp_rule->part[2].prod == NULL) return MEMORY_ALLOCATION_ERROR; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_COMMENTS)) { /* CM ElementContent 0.7.0 */ tmp_rule->part[2].prod[tmp_code3-p].eventType = EVENT_CM; tmp_rule->part[2].prod[tmp_code3-p].typeId = INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[2].prod[tmp_code3-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].qnameId.lnId = INDEX_MAX; p += 1; } if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PIS)) { /* PI ElementContent 0.7.1 */ tmp_rule->part[2].prod[tmp_code3-p].eventType = EVENT_PI; tmp_rule->part[2].prod[tmp_code3-p].typeId = INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[2].prod[tmp_code3-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].qnameId.lnId = INDEX_MAX; } tmp_rule->part[2].count = tmp_code3; tmp_rule->part[2].bits = tmp_code3 > 1; } p = 1; /* Rule for ElementContent */ /* ElementContent : * EE 0 * SE (*) ElementContent 1.0 * CH ElementContent 1.1 * ER ElementContent 1.2 * CM ElementContent 1.3.0 * PI ElementContent 1.3.1 */ tmp_rule = &((DynGrammarRule*) elementGrammar->rule)[GR_ELEMENT_CONTENT]; /* Initialize Part 2 */ tmp_rule->part[1].prod = NULL; tmp_rule->part[1].count = 0; tmp_rule->part[1].bits = 0; /* Initialize Part 3 */ tmp_rule->part[2].prod = NULL; tmp_rule->part[2].count = 0; tmp_rule->part[2].bits = 0; tmp_code1 = 1; tmp_code2 = 2; tmp_code3 = 0; /* Part 1 */ tmp_rule->part[0].prod = (Production*) EXIP_MALLOC(sizeof(Production)*DEFAULT_PROD_ARRAY_DIM); if(tmp_rule->part[0].prod == NULL) return MEMORY_ALLOCATION_ERROR; /* EE 0 */ tmp_rule->part[0].prod[0].eventType = EVENT_EE; tmp_rule->part[0].prod[0].typeId = INDEX_MAX; tmp_rule->part[0].prod[0].nonTermID = GR_VOID_NON_TERMINAL; tmp_rule->part[0].prod[0].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[0].prod[0].qnameId.lnId = INDEX_MAX; tmp_rule->part[0].count = 1; tmp_rule->part[0].bits = 1; tmp_rule->part0Dimension = DEFAULT_PROD_ARRAY_DIM; /* More part 1 productions get added later... */ if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_DTD)) tmp_code2 += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_COMMENTS)) tmp_code3 += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PIS)) tmp_code3 += 1; /* Part 2 */ tmp_rule->part[1].prod = (Production*) EXIP_MALLOC(sizeof(Production)*tmp_code2); if(tmp_rule->part[1].prod == NULL) return MEMORY_ALLOCATION_ERROR; /* SE (*) ElementContent 1.0 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_SE_ALL; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; /* CH ElementContent 1.1 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_CH; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; p += 1; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_DTD)) { /* ER ElementContent 1.2 */ tmp_rule->part[1].prod[tmp_code2-p].eventType = EVENT_ER; tmp_rule->part[1].prod[tmp_code2-p].typeId = INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[1].prod[tmp_code2-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[1].prod[tmp_code2-p].qnameId.lnId = INDEX_MAX; } tmp_rule->part[1].count = tmp_code2; tmp_rule->part[1].bits = 1 + ((tmp_code2 - 2 + tmp_code3) > 0); /* Part 3 */ if(tmp_code3 > 0) { p = 1; tmp_rule->part[2].prod = (Production*) EXIP_MALLOC(sizeof(Production)*tmp_code3); if(tmp_rule->part[2].prod == NULL) return MEMORY_ALLOCATION_ERROR; if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_COMMENTS)) { /* CM ElementContent 1.3.0 */ tmp_rule->part[2].prod[tmp_code3-p].eventType = EVENT_CM; tmp_rule->part[2].prod[tmp_code3-p].typeId = INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[2].prod[tmp_code3-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].qnameId.lnId = INDEX_MAX; p += 1; } if(IS_PRESERVED(strm->header.opts.preserve, PRESERVE_PIS)) { /* PI ElementContent 1.3.1 */ tmp_rule->part[2].prod[tmp_code3-p].eventType = EVENT_PI; tmp_rule->part[2].prod[tmp_code3-p].typeId = INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].nonTermID = GR_ELEMENT_CONTENT; tmp_rule->part[2].prod[tmp_code3-p].qnameId.uriId = SMALL_INDEX_MAX; tmp_rule->part[2].prod[tmp_code3-p].qnameId.lnId = INDEX_MAX; } tmp_rule->part[2].count = tmp_code3; tmp_rule->part[2].bits = tmp_code3 > 1; } return ERR_OK; }