Ejemplo n.º 1
0
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);
		}
	}
}
Ejemplo n.º 2
0
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;
}