int fmi1_xml_handle_Tool(fmi1_xml_parser_context_t *context, const char* data) { if(!data) { fmi1_xml_model_description_t* md = context->modelDescription; jm_vector(char)* bufName = fmi1_xml_reserve_parse_buffer(context,1,100); fmi1_xml_vendor_t* vendor = 0; fmi1_xml_vendor_t dummyV; jm_voidp *pvendor; if(!bufName) return -1; /* <xs:attribute name="name" type="xs:normalizedString" use="required"> */ if( fmi1_xml_set_attr_string(context, fmi1_xml_elmID_Tool, fmi_attr_id_name, 1, bufName)) return -1; pvendor = jm_vector_push_back(jm_voidp)(&md->vendorList, vendor); if(pvendor ) *pvendor = vendor = jm_named_alloc_v(bufName,sizeof(fmi1_xml_vendor_t), dummyV.name - (char*)&dummyV, context->callbacks).ptr; if(!pvendor || !vendor) { fmi1_xml_parse_fatal(context, "Could not allocate memory"); return -1; } jm_vector_init(jm_named_ptr)(&vendor->annotations,0, context->callbacks); } else { /* don't do anything. might give out a warning if(data[0] != 0) */ return 0; } return 0; }
static int fmi1_get_attr_str(fmi1_xml_parser_context_t *context, fmi1_xml_elm_enu_t elmID, fmi1_xml_attr_enu_t attrID, int required,const char** valp) { jm_string elmName, attrName, value; elmName = fmi1_element_handle_map[elmID].elementName; attrName = fmi1_xmlAttrNames[attrID]; value = jm_vector_get_item(jm_string)(context->attrBuffer, attrID); *valp = value; jm_vector_set_item(jm_string)(context->attrBuffer, attrID, 0); if(!(*valp)) { if (required) { fmi1_xml_parse_fatal(context, "Parsing XML element '%s': required attribute '%s' not found", elmName, attrName); return -1; } else return 0; } return 0; }
int fmi1_xml_handle_fmiModelDescription(fmi1_xml_parser_context_t *context, const char* data) { jm_name_ID_map_t namingConventionMap[] = {{"flat",fmi1_naming_enu_flat},{"structured", fmi1_naming_enu_structured},{0,0}}; fmi1_xml_model_description_t* md = context->modelDescription; if(!data) { if(context -> currentElmID != fmi1_xml_elmID_none) { fmi1_xml_parse_fatal(context, "fmi1_xml_model_description must be the root XML element"); return -1; } jm_log_verbose(context->callbacks, module, "Parsing XML element fmiModelDescription"); /* process the attributes */ return ( /* <xs:attribute name="fmiVersion" type="xs:normalizedString" use="required" fixed="1.0"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_fmiVersion, 1, &(md->fmi1_xml_standard_version)) || /* <xs:attribute name="modelName" type="xs:normalizedString" use="required"> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_modelName, 1, &(md->modelName)) || /* <xs:attribute name="modelIdentifier" type="xs:normalizedString" use="required"> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_modelIdentifier, 1, &(md->modelIdentifier)) || /* <xs:attribute name="guid" type="xs:normalizedString" use="required"> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_guid, 1, &(md->GUID)) || /* <xs:attribute name="description" type="xs:string"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_description, 0, &(md->description)) || /* <xs:attribute name="author" type="xs:string"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_author, 0, &(md->author)) || /* <xs:attribute name="version" type="xs:normalizedString"> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_version, 0, &(md->version)) || /* <xs:attribute name="generationTool" type="xs:normalizedString"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_generationTool, 0, &(md->generationTool)) || /* <xs:attribute name="generationDateAndTime" type="xs:dateTime"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_generationDateAndTime, 0, &(md->generationDateAndTime)) || /* <xs:attribute name="variableNamingConvention" use="optional" default="flat"> */ fmi1_xml_set_attr_enum(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_variableNamingConvention, 0, (unsigned*)&(md->namingConvension), fmi1_naming_enu_flat, namingConventionMap) || /* <xs:attribute name="numberOfContinuousStates" type="xs:unsignedInt" use="required"/> */ fmi1_xml_set_attr_uint(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_numberOfContinuousStates, 1, &(md->numberOfContinuousStates),0) || /* <xs:attribute name="numberOfEventIndicators" type="xs:unsignedInt" use="required"/> */ fmi1_xml_set_attr_uint(context, fmi1_xml_elmID_fmiModelDescription, fmi_attr_id_numberOfEventIndicators, 1, &(md->numberOfEventIndicators),0) ); } else { /* don't do anything. might give out a warning if(data[0] != 0) */ return 0; } }
int fmi1_xml_handle_Annotation(fmi1_xml_parser_context_t *context, const char* data) { if(!data) { fmi1_xml_model_description_t* md = context->modelDescription; size_t numVendors = jm_vector_get_size(jm_voidp)(&(md->vendorList)); fmi1_xml_vendor_t* vendor =(fmi1_xml_vendor_t*)jm_vector_get_item(jm_voidp)(&(md->vendorList), numVendors-1); jm_vector(char)* bufName = fmi1_xml_reserve_parse_buffer(context,1,100); jm_vector(char)* bufValue = fmi1_xml_reserve_parse_buffer(context,2,100); jm_named_ptr named, *pnamed; fmi1_xml_annotation_t* annotation = 0; size_t vallen; if(!bufName || !bufValue || /* <xs:attribute name="name" type="xs:normalizedString" use="required"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_Annotation, fmi_attr_id_name, 1, bufName) || /* <xs:attribute name="value" type="xs:string" use="required"/> */ fmi1_xml_set_attr_string(context, fmi1_xml_elmID_Annotation, fmi_attr_id_value, 1, bufValue) ) return -1; vallen = jm_vector_get_size(char)(bufValue); named.ptr = 0; named.name = 0; pnamed = jm_vector_push_back(jm_named_ptr)(&vendor->annotations, named); if(pnamed) *pnamed = named = jm_named_alloc_v(bufName,sizeof(fmi1_xml_annotation_t)+vallen+1,sizeof(fmi1_xml_annotation_t)+vallen,context->callbacks); annotation = named.ptr; if( !pnamed || !annotation ) { fmi1_xml_parse_fatal(context, "Could not allocate memory"); return -1; } annotation->name = named.name; if(vallen) memcpy(annotation->value,jm_vector_get_itemp(char)(bufValue,0), vallen); annotation->value[vallen] = 0; } else { /* don't do anything. might give out a warning if(data[0] != 0) */ return 0; } return 0; }