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; }
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; }
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; }
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; }