コード例 #1
0
ファイル: initSchemaInstance.c プロジェクト: actility/ong
errorCode initSchema(EXIPSchema* schema, InitSchemaType initializationType)
{
	errorCode tmp_err_code = UNEXPECTED_ERROR;

	TRY(initAllocList(&schema->memList));

	schema->staticGrCount = 0;
	SET_CONTENT_INDEX(schema->docGrammar.props, 0);
	schema->docGrammar.count = 0;
	schema->docGrammar.props = 0;
	schema->docGrammar.rule = NULL;
	schema->simpleTypeTable.count = 0;
	schema->simpleTypeTable.sType = NULL;
	schema->grammarTable.count = 0;
	schema->grammarTable.grammar = NULL;
	schema->enumTable.count = 0;
	schema->enumTable.enumDef = NULL;

	/* Create and initialize initial string table entries */
	TRY_CATCH(createDynArray(&schema->uriTable.dynArray, sizeof(UriEntry), DEFAULT_URI_ENTRIES_NUMBER), freeAllocList(&schema->memList));
	TRY_CATCH(createUriTableEntries(&schema->uriTable, initializationType != INIT_SCHEMA_SCHEMA_LESS_MODE), freeAllocList(&schema->memList));

	if(initializationType == INIT_SCHEMA_SCHEMA_ENABLED)
	{
		/* Create and initialize enumDef table */
		TRY_CATCH(createDynArray(&schema->enumTable.dynArray, sizeof(EnumDefinition), DEFAULT_ENUM_TABLE), freeAllocList(&schema->memList));
	}

	/* Create the schema grammar table */
	TRY_CATCH(createDynArray(&schema->grammarTable.dynArray, sizeof(EXIGrammar), DEFAULT_GRAMMAR_TABLE), freeAllocList(&schema->memList));

	if(initializationType != INIT_SCHEMA_SCHEMA_LESS_MODE)
	{
		/* Create and initialize simple type table */
		TRY_CATCH(createDynArray(&schema->simpleTypeTable.dynArray, sizeof(SimpleType), DEFAULT_SIMPLE_GRAMMAR_TABLE), freeAllocList(&schema->memList));
		TRY_CATCH(createBuiltInTypesDefinitions(&schema->simpleTypeTable, &schema->memList), freeAllocList(&schema->memList));

		// Must be done after createBuiltInTypesDefinitions()
		TRY_CATCH(generateBuiltInTypesGrammars(schema), freeAllocList(&schema->memList));

		schema->staticGrCount = SIMPLE_TYPE_COUNT;
	}

	return tmp_err_code;
}
コード例 #2
0
ファイル: protoGrammars.c プロジェクト: kjussakov/exip-eval
errorCode convertProtoGrammar(AllocList* memlist, ProtoGrammar* pg, EXIGrammar* exiGrammar)
{
	Index ruleIter;
	Index prodIter;
	uint16_t attrCount;
	boolean hasEE;

	exiGrammar->props = 0;
	SET_SCHEMA_GR(exiGrammar->props);
	SET_CONTENT_INDEX(exiGrammar->props, pg->contentIndex);
	exiGrammar->count = pg->count;

	exiGrammar->rule = (GrammarRule*) memManagedAllocate(memlist, sizeof(GrammarRule)*(pg->count));
	if(exiGrammar->rule == NULL)
		return EXIP_MEMORY_ALLOCATION_ERROR;

	for(ruleIter = 0; ruleIter < pg->count; ruleIter++)
	{
		attrCount = 0;
		hasEE = FALSE;

		exiGrammar->rule[ruleIter].production = (Production*) memManagedAllocate(memlist, sizeof(Production)*pg->rule[ruleIter].count);
		if(exiGrammar->rule[ruleIter].production == NULL)
			return EXIP_MEMORY_ALLOCATION_ERROR;

		exiGrammar->rule[ruleIter].pCount = pg->rule[ruleIter].count;
		exiGrammar->rule[ruleIter].meta = 0;

		for(prodIter = 0; prodIter < pg->rule[ruleIter].count; prodIter++)
		{
			if(GET_PROD_EXI_EVENT_CLASS(pg->rule[ruleIter].prod[prodIter].content) == EVENT_AT_CLASS)
				attrCount++;
			else if(GET_PROD_EXI_EVENT(pg->rule[ruleIter].prod[prodIter].content) == EVENT_EE)
				hasEE = TRUE;
			exiGrammar->rule[ruleIter].production[prodIter] = pg->rule[ruleIter].prod[prodIter];
		}

		RULE_SET_AT_COUNT(exiGrammar->rule[ruleIter].meta, attrCount);
		if(hasEE)
			RULE_SET_CONTAIN_EE(exiGrammar->rule[ruleIter].meta);
	}

	return EXIP_OK;
}
コード例 #3
0
ファイル: initSchemaInstance.c プロジェクト: actility/ong
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;
}