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