Пример #1
0
errorCode generateBuiltInTypesGrammars(EXIPSchema* schema)
{
	unsigned int i;
	QNameID typeQnameID;
	Index typeId;
	EXIGrammar grammar;
	Index dynArrId;

	// URI id 3 -> http://www.w3.org/2001/XMLSchema
	typeQnameID.uriId = XML_SCHEMA_NAMESPACE_ID;

	grammar.count = 2;

	for(i = 0; i < schema->uriTable.uri[XML_SCHEMA_NAMESPACE_ID].lnTable.count; i++)
	{
		grammar.contentIndex = 0;
		typeQnameID.lnId = i;
		typeId = typeQnameID.lnId;

		grammar.props = 0;
		SET_SCHEMA(grammar.props);
		if((schema->simpleTypeTable.sType[typeId].facetPresenceMask & TYPE_FACET_NAMED_SUBTYPE_UNION) > 0)
			SET_NAMED_SUB_TYPE_OR_UNION(grammar.props);

		// One more rule slot for grammar augmentation when strict == FASLE
		grammar.rule = (GrammarRule*)memManagedAllocate(&schema->memList, sizeof(GrammarRule)*(grammar.count + 1));
		if(grammar.rule == NULL)
			return MEMORY_ALLOCATION_ERROR;

		if(typeId == SIMPLE_TYPE_ANY_TYPE)
		{
			// <xs:anyType> - The base complex type; complex ur-type
			grammar.contentIndex = 1;

			/* Initialize first rule Part 2 */
			grammar.rule[0].part[1].prod = NULL;
			grammar.rule[0].part[1].count = 0;
			grammar.rule[0].part[1].bits = 0;

			/* Initialize first rule Part 3 */
			grammar.rule[0].part[2].prod = NULL;
			grammar.rule[0].part[2].count = 0;
			grammar.rule[0].part[2].bits = 0;

			/* Initialize second rule Part 2 */
			grammar.rule[1].part[1].prod = NULL;
			grammar.rule[1].part[1].count = 0;
			grammar.rule[1].part[1].bits = 0;

			/* Initialize second rule Part 3 */
			grammar.rule[1].part[2].prod = NULL;
			grammar.rule[1].part[2].count = 0;
			grammar.rule[1].part[2].bits = 0;

			grammar.rule[0].part[0].prod = memManagedAllocate(&schema->memList, sizeof(Production)*4);
			if(grammar.rule[0].part[0].prod == NULL)
				return MEMORY_ALLOCATION_ERROR;

			grammar.rule[0].part[0].prod[3].eventType = EVENT_AT_ALL;
			grammar.rule[0].part[0].prod[3].typeId = INDEX_MAX;
			grammar.rule[0].part[0].prod[3].nonTermID = 0;
			grammar.rule[0].part[0].prod[3].qnameId.uriId = URI_MAX;
			grammar.rule[0].part[0].prod[3].qnameId.lnId = LN_MAX;

			grammar.rule[0].part[0].prod[2].eventType = EVENT_SE_ALL;
			grammar.rule[0].part[0].prod[2].typeId = INDEX_MAX;
			grammar.rule[0].part[0].prod[2].nonTermID = 1;
			grammar.rule[0].part[0].prod[2].qnameId.uriId = URI_MAX;
			grammar.rule[0].part[0].prod[2].qnameId.lnId = LN_MAX;

			grammar.rule[0].part[0].prod[1].eventType = EVENT_EE;
			grammar.rule[0].part[0].prod[1].typeId = INDEX_MAX;
			grammar.rule[0].part[0].prod[1].nonTermID = GR_VOID_NON_TERMINAL;
			grammar.rule[0].part[0].prod[1].qnameId.uriId = URI_MAX;
			grammar.rule[0].part[0].prod[1].qnameId.lnId = LN_MAX;

			grammar.rule[0].part[0].prod[0].eventType = EVENT_CH;
			grammar.rule[0].part[0].prod[0].typeId = INDEX_MAX;
			grammar.rule[0].part[0].prod[0].nonTermID = 1;
			grammar.rule[0].part[0].prod[0].qnameId.uriId = URI_MAX;
			grammar.rule[0].part[0].prod[0].qnameId.lnId = LN_MAX;

			grammar.rule[0].part[0].count = 4;
			grammar.rule[0].part[0].bits = 2;

			grammar.rule[1].part[0].prod = memManagedAllocate(&schema->memList, sizeof(Production)*3);
			if(grammar.rule[1].part[0].prod == NULL)
				return MEMORY_ALLOCATION_ERROR;

			grammar.rule[1].part[0].prod[2].eventType = EVENT_SE_ALL;
			grammar.rule[1].part[0].prod[2].typeId = INDEX_MAX;
			grammar.rule[1].part[0].prod[2].nonTermID = 1;
			grammar.rule[1].part[0].prod[2].qnameId.uriId = URI_MAX;
			grammar.rule[1].part[0].prod[2].qnameId.lnId = LN_MAX;

			grammar.rule[1].part[0].prod[1].eventType = EVENT_EE;
			grammar.rule[1].part[0].prod[1].typeId = INDEX_MAX;
			grammar.rule[1].part[0].prod[1].nonTermID = GR_VOID_NON_TERMINAL;
			grammar.rule[1].part[0].prod[1].qnameId.uriId = URI_MAX;
			grammar.rule[1].part[0].prod[1].qnameId.lnId = LN_MAX;

			grammar.rule[1].part[0].prod[0].eventType = EVENT_CH;
			grammar.rule[1].part[0].prod[0].typeId = INDEX_MAX;
			grammar.rule[1].part[0].prod[0].nonTermID = 1;
			grammar.rule[1].part[0].prod[0].qnameId.uriId = URI_MAX;
			grammar.rule[1].part[0].prod[0].qnameId.lnId = LN_MAX;

			grammar.rule[1].part[0].count = 3;
			grammar.rule[1].part[0].bits = 2;

		}
		else // a regular simple type
		{
			/* Initialize first rule Part 2 */
			grammar.rule[0].part[1].prod = NULL;
			grammar.rule[0].part[1].count = 0;
			grammar.rule[0].part[1].bits = 0;

			/* Initialize first rule Part 3 */
			grammar.rule[0].part[2].prod = NULL;
			grammar.rule[0].part[2].count = 0;
			grammar.rule[0].part[2].bits = 0;

			/* Initialize second rule Part 2 */
			grammar.rule[1].part[1].prod = NULL;
			grammar.rule[1].part[1].count = 0;
			grammar.rule[1].part[1].bits = 0;

			/* Initialize second rule Part 3 */
			grammar.rule[1].part[2].prod = NULL;
			grammar.rule[1].part[2].count = 0;
			grammar.rule[1].part[2].bits = 0;

			grammar.rule[0].part[0].prod = memManagedAllocate(&schema->memList, sizeof(Production));
			if(grammar.rule[0].part[0].prod == NULL)
				return MEMORY_ALLOCATION_ERROR;

			grammar.rule[0].part[0].prod[0].eventType = EVENT_CH;
			grammar.rule[0].part[0].prod[0].typeId = typeId;
			grammar.rule[0].part[0].prod[0].nonTermID = 1;
			grammar.rule[0].part[0].prod[0].qnameId.uriId = URI_MAX;
			grammar.rule[0].part[0].prod[0].qnameId.lnId = LN_MAX;
			grammar.rule[0].part[0].count = 1;
			grammar.rule[0].part[0].bits = 0;

			grammar.rule[1].part[0].prod = memManagedAllocate(&schema->memList, sizeof(Production));
			if(grammar.rule[1].part[0].prod == NULL)
				return MEMORY_ALLOCATION_ERROR;

			grammar.rule[1].part[0].prod[0].eventType = EVENT_EE;
			grammar.rule[1].part[0].prod[0].typeId = INDEX_MAX;
			grammar.rule[1].part[0].prod[0].nonTermID = GR_VOID_NON_TERMINAL;
			grammar.rule[1].part[0].prod[0].qnameId.uriId = URI_MAX;
			grammar.rule[1].part[0].prod[0].qnameId.lnId = LN_MAX;
			grammar.rule[1].part[0].count = 1;
			grammar.rule[1].part[0].bits = 0;
		}

		/** Add the grammar to the schema grammar table */
		addDynEntry(&schema->grammarTable.dynArray, &grammar, &dynArrId);
		schema->uriTable.uri[3].lnTable.ln[i].typeGrammar = dynArrId;
	}

	return ERR_OK;
}
Пример #2
0
errorCode generateBuiltInTypesGrammars(EXIPSchema* schema)
{
	unsigned int i;
	QNameID typeQnameID;
	Index typeId;
	EXIGrammar grammar;
	Index dynArrId;

	// URI id 3 -> http://www.w3.org/2001/XMLSchema
	typeQnameID.uriId = XML_SCHEMA_NAMESPACE_ID;

	grammar.count = 2;

	for(i = 0; i < schema->uriTable.uri[XML_SCHEMA_NAMESPACE_ID].lnTable.count; i++)
	{
		typeQnameID.lnId = i;
		typeId = typeQnameID.lnId;

		grammar.props = 0;
		SET_SCHEMA_GR(grammar.props);
		if(HAS_TYPE_FACET(schema->simpleTypeTable.sType[typeId].content, TYPE_FACET_NAMED_SUBTYPE_UNION))
			SET_NAMED_SUB_TYPE_OR_UNION(grammar.props);

		// One more rule slot for grammar augmentation when strict == FASLE
		grammar.rule = (GrammarRule*)memManagedAllocate(&schema->memList, sizeof(GrammarRule)*(grammar.count + 1));
		if(grammar.rule == NULL)
			return MEMORY_ALLOCATION_ERROR;

		if(typeId == SIMPLE_TYPE_ANY_TYPE)
		{
			// <xs:anyType> - The base complex type; complex ur-type
			SET_CONTENT_INDEX(grammar.props, 1);

			grammar.rule[0].production = memManagedAllocate(&schema->memList, sizeof(Production)*4);
			if(grammar.rule[0].production == NULL)
				return MEMORY_ALLOCATION_ERROR;

			SET_PROD_EXI_EVENT(grammar.rule[0].production[3].content, EVENT_AT_ALL);
			SET_PROD_NON_TERM(grammar.rule[0].production[3].content, 0);
			grammar.rule[0].production[3].typeId = INDEX_MAX;
			grammar.rule[0].production[3].qnameId.uriId = URI_MAX;
			grammar.rule[0].production[3].qnameId.lnId = LN_MAX;

			SET_PROD_EXI_EVENT(grammar.rule[0].production[2].content, EVENT_SE_ALL);
			SET_PROD_NON_TERM(grammar.rule[0].production[2].content, 1);
			grammar.rule[0].production[2].typeId = INDEX_MAX;
			grammar.rule[0].production[2].qnameId.uriId = URI_MAX;
			grammar.rule[0].production[2].qnameId.lnId = LN_MAX;

			SET_PROD_EXI_EVENT(grammar.rule[0].production[1].content, EVENT_EE);
			SET_PROD_NON_TERM(grammar.rule[0].production[1].content, GR_VOID_NON_TERMINAL);
			grammar.rule[0].production[1].typeId = INDEX_MAX;
			grammar.rule[0].production[1].qnameId.uriId = URI_MAX;
			grammar.rule[0].production[1].qnameId.lnId = LN_MAX;

			SET_PROD_EXI_EVENT(grammar.rule[0].production[0].content, EVENT_CH);
			SET_PROD_NON_TERM(grammar.rule[0].production[0].content, 1);
			grammar.rule[0].production[0].typeId = INDEX_MAX;
			grammar.rule[0].production[0].qnameId.uriId = URI_MAX;
			grammar.rule[0].production[0].qnameId.lnId = LN_MAX;

			grammar.rule[0].pCount = 4;

			grammar.rule[1].production = memManagedAllocate(&schema->memList, sizeof(Production)*3);
			if(grammar.rule[1].production == NULL)
				return MEMORY_ALLOCATION_ERROR;

			SET_PROD_EXI_EVENT(grammar.rule[1].production[2].content, EVENT_SE_ALL);
			SET_PROD_NON_TERM(grammar.rule[1].production[2].content, 1);
			grammar.rule[1].production[2].typeId = INDEX_MAX;
			grammar.rule[1].production[2].qnameId.uriId = URI_MAX;
			grammar.rule[1].production[2].qnameId.lnId = LN_MAX;

			SET_PROD_EXI_EVENT(grammar.rule[1].production[1].content, EVENT_EE);
			SET_PROD_NON_TERM(grammar.rule[1].production[1].content, GR_VOID_NON_TERMINAL);
			grammar.rule[1].production[1].typeId = INDEX_MAX;
			grammar.rule[1].production[1].qnameId.uriId = URI_MAX;
			grammar.rule[1].production[1].qnameId.lnId = LN_MAX;

			SET_PROD_EXI_EVENT(grammar.rule[1].production[0].content, EVENT_CH);
			SET_PROD_NON_TERM(grammar.rule[1].production[0].content, 1);
			grammar.rule[1].production[0].typeId = INDEX_MAX;
			grammar.rule[1].production[0].qnameId.uriId = URI_MAX;
			grammar.rule[1].production[0].qnameId.lnId = LN_MAX;

			grammar.rule[1].pCount = 3;
		}
		else // a regular simple type
		{
			grammar.rule[0].production = memManagedAllocate(&schema->memList, sizeof(Production));
			if(grammar.rule[0].production == NULL)
				return MEMORY_ALLOCATION_ERROR;

			SET_PROD_EXI_EVENT(grammar.rule[0].production[0].content, EVENT_CH);
			SET_PROD_NON_TERM(grammar.rule[0].production[0].content, 1);
			grammar.rule[0].production[0].typeId = typeId;
			grammar.rule[0].production[0].qnameId.uriId = URI_MAX;
			grammar.rule[0].production[0].qnameId.lnId = LN_MAX;
			grammar.rule[0].pCount = 1;

			grammar.rule[1].production = memManagedAllocate(&schema->memList, sizeof(Production));
			if(grammar.rule[1].production == NULL)
				return MEMORY_ALLOCATION_ERROR;

			SET_PROD_EXI_EVENT(grammar.rule[1].production[0].content, EVENT_EE);
			SET_PROD_NON_TERM(grammar.rule[1].production[0].content, GR_VOID_NON_TERMINAL);
			grammar.rule[1].production[0].typeId = INDEX_MAX;
			grammar.rule[1].production[0].qnameId.uriId = URI_MAX;
			grammar.rule[1].production[0].qnameId.lnId = LN_MAX;
			grammar.rule[1].pCount = 1;
		}

		/** Add the grammar to the schema grammar table */
		addDynEntry(&schema->grammarTable.dynArray, &grammar, &dynArrId);
		schema->uriTable.uri[3].lnTable.ln[i].typeGrammar = dynArrId;
	}

	return ERR_OK;
}