예제 #1
0
errorCode createBuiltInTypesDefinitions(SimpleTypeTable* simpleTypeTable, AllocList* memList)
{
	errorCode tmp_err_code = UNEXPECTED_ERROR;
	SimpleType sType;
	Index elID;

	// entities
	sType.exiType = VALUE_TYPE_LIST;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = SIMPLE_TYPE_ENTITY;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// entity
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// id
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// idref
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// idrefs
	sType.exiType = VALUE_TYPE_LIST;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = SIMPLE_TYPE_IDREF;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// ncname
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// nmtoken
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// nmtokens
	sType.exiType = VALUE_TYPE_LIST;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = SIMPLE_TYPE_NMTOKEN;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// notation
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// name
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// qname
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// any simple type
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// any type
	sType.exiType = VALUE_TYPE_NONE;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// any uri
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// base64 binary
	sType.exiType = VALUE_TYPE_BINARY;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// boolean
	sType.exiType = VALUE_TYPE_BOOLEAN;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// byte
	sType.exiType = VALUE_TYPE_SMALL_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 127;
	sType.min = -128;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// date
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// date time
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// decimal
	sType.exiType = VALUE_TYPE_DECIMAL;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// double
	sType.exiType = VALUE_TYPE_FLOAT;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// duration
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// float
	sType.exiType = VALUE_TYPE_FLOAT;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// gDay
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// gMonth
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// gMonthDay
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// gYear
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// gYearMonth
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// hex binary
	sType.exiType = VALUE_TYPE_BINARY;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Int
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// integer
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// language
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// long
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// negativeInteger
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.max = -1;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// NonNegativeInteger
	sType.exiType = VALUE_TYPE_NON_NEGATIVE_INT;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// NonPositiveInteger
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// normalizedString
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Positive Integer
	sType.exiType = VALUE_TYPE_NON_NEGATIVE_INT;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 0;
	sType.min = 1;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// short
	sType.exiType = VALUE_TYPE_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 32767;
	sType.min = -32768;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// String
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// time
	sType.exiType = VALUE_TYPE_DATE_TIME;
	sType.facetPresenceMask = 0;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// token
	sType.exiType = VALUE_TYPE_STRING;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Unsigned byte
	sType.exiType = VALUE_TYPE_SMALL_INTEGER;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.max = 255;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Unsigned int
	sType.exiType = VALUE_TYPE_NON_NEGATIVE_INT;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Unsigned Long
	sType.exiType = VALUE_TYPE_NON_NEGATIVE_INT;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 0;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	// Unsigned short
	sType.exiType = VALUE_TYPE_NON_NEGATIVE_INT;
	sType.facetPresenceMask = 0;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_NAMED_SUBTYPE_UNION;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MAX_INCLUSIVE;
	sType.facetPresenceMask = sType.facetPresenceMask | TYPE_FACET_MIN_INCLUSIVE;
	sType.max = 65535;
	sType.min = 0;
	sType.length = 0;
	tmp_err_code = addDynEntry(&simpleTypeTable->dynArray, &sType, &elID);
	if(tmp_err_code != ERR_OK)
		return tmp_err_code;

	return ERR_OK;
}
예제 #2
0
errorCode addValueEntry(EXIStream* strm, String valueStr, QNameID qnameID)
{
	errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;
	ValueEntry* valueEntry = NULL;
	Index valueEntryId;

#if VALUE_CROSSTABLE_USE
	Index vxEntryId;
	{
		struct LnEntry* lnEntry;
		VxEntry vxEntry;

		// Find the local name entry from QNameID
		lnEntry = &GET_LN_URI_QNAME(strm->schema->uriTable, qnameID);

		// Add entry to the local name entry's value cross table (vxTable)
		if(lnEntry->vxTable == NULL)
		{
			lnEntry->vxTable = memManagedAllocate(&strm->memList, sizeof(VxTable));
			if(lnEntry->vxTable == NULL)
				return EXIP_MEMORY_ALLOCATION_ERROR;

			// First value entry - create the vxTable
			TRY(createDynArray(&lnEntry->vxTable->dynArray, sizeof(VxEntry), DEFAULT_VX_ENTRIES_NUMBER));
		}

		assert(lnEntry->vxTable->vx);

		// Set the global ID in the value cross table entry
		vxEntry.globalId = strm->valueTable.globalId;

		// Add the entry
		TRY(addDynEntry(&lnEntry->vxTable->dynArray, (void*) &vxEntry, &vxEntryId));
	}
#endif

	// If the global ID is less than the actual array size, we must have wrapped around
	// In this case, we must reuse an existing entry
	if(strm->valueTable.globalId < strm->valueTable.count)
	{
		// Get the existing value entry
		valueEntry = &strm->valueTable.value[strm->valueTable.globalId];

#if VALUE_CROSSTABLE_USE
		assert(GET_LN_URI_QNAME(strm->schema->uriTable, valueEntry->locValuePartition.forQNameId).vxTable);
		// Null out the existing cross table entry
		GET_LN_URI_QNAME(strm->schema->uriTable, valueEntry->locValuePartition.forQNameId).vxTable->vx[valueEntry->locValuePartition.vxEntryId].globalId = INDEX_MAX;
#endif

#if HASH_TABLE_USE
		// Remove existing value string from hash table (if present)
		if(strm->valueTable.hashTbl != NULL)
		{
			hashtable_remove(strm->valueTable.hashTbl, valueEntry->valueStr);
		}
#endif
		// Free the memory allocated by the previous string entry
		EXIP_MFREE(valueEntry->valueStr.str);
	}
	else
	{
		// We are filling up the array and have not wrapped round yet
		// See http://www.w3.org/TR/exi/#encodingOptimizedForMisses
		TRY(addEmptyDynEntry(&strm->valueTable.dynArray, (void**)&valueEntry, &valueEntryId));
	}

	// Set the value entry fields
	valueEntry->valueStr = valueStr;
#if VALUE_CROSSTABLE_USE
	valueEntry->locValuePartition.forQNameId = qnameID;
	valueEntry->locValuePartition.vxEntryId = vxEntryId;
#endif

#if HASH_TABLE_USE
	// Add value string to hash table (if present)
	if(strm->valueTable.hashTbl != NULL)
	{
		TRY(hashtable_insert(strm->valueTable.hashTbl, valueStr, strm->valueTable.globalId));
	}
#endif

	// Increment global ID
	strm->valueTable.globalId++;

	// The value table is limited by valuePartitionCapacity. If we have exceeded, we wrap around
	// to the beginning of the value table and null out existing IDs in the corresponding
	// cross table IDs
	if(strm->valueTable.globalId == strm->header.opts.valuePartitionCapacity)
		strm->valueTable.globalId = 0;

	return EXIP_OK;
}
예제 #3
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;
}
예제 #4
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;
}