fmi1_xml_vendor_t* fmi1_xml_get_vendor(fmi1_xml_vendor_list_t* v, unsigned int index) { jm_vector(jm_voidp)* vl; if(!v) { assert(v && "Vendor list cannot be NULL"); return 0; } vl = &v->vendors; if(index >= jm_vector_get_size(jm_voidp)(vl)) return 0; return (fmi1_xml_vendor_t*)jm_vector_get_item(jm_voidp)(vl, index); }
/* Get the list of all the variables in the model in alphabetical order */ fmi1_import_variable_list_t* fmi1_import_get_variable_list_alphabetical_order(fmi1_import_t* fmu) { jm_vector(jm_named_ptr)* vars; fmi1_import_variable_list_t* vl; size_t nv, i; if(!fmu->md) { jm_log_error(fmu->callbacks, module,"No FMU is loaded"); return 0; } vars = fmi1_xml_get_variables_alphabetical_order(fmu->md); nv = jm_vector_get_size(jm_named_ptr)(vars); vl = fmi1_import_alloc_variable_list(fmu, nv); if(!vl) return 0; for(i = 0; i< nv; i++) { jm_vector_set_item(jm_voidp)(&vl->variables, i, jm_vector_get_item(jm_named_ptr)(vars, i).ptr); } return vl; }
if(!md->variablesByVR) return 0; if(v->aliasKind == fmi1_variable_is_not_alias) return v; key = *v; key.aliasKind = fmi1_variable_is_not_alias; found = jm_vector_bsearch(jm_voidp)(md->variablesByVR,(void**)&pkey, fmi1_xml_compare_vr); assert(found); base = *found; return base; } /* Return the list of all the variables aliased to the given one (including the base one. The list is ordered: base variable, aliases, negated aliases. */ jm_status_enu_t fmi1_xml_get_variable_aliases(fmi1_xml_model_description_t* md,fmi1_xml_variable_t* v, jm_vector(jm_voidp)* list) { fmi1_xml_variable_t key, *cur; fmi1_value_reference_t vr = fmi1_xml_get_variable_vr(v); size_t baseIndex, i, num = jm_vector_get_size(jm_voidp)(md->variablesByVR); key = *v; key.aliasKind = 0; cur = &key; baseIndex = jm_vector_bsearch_index(jm_voidp)(md->variablesByVR,(void**)&cur, fmi1_xml_compare_vr); cur = (fmi1_xml_variable_t*)jm_vector_get_item(jm_voidp)(md->variablesByVR, baseIndex); assert(cur); i = baseIndex + 1; while(fmi1_xml_get_variable_vr(cur) == vr) { if(!jm_vector_push_back(jm_voidp)(list, cur)) { jm_log_fatal(md->callbacks,module,"Could not allocate memory"); return jm_status_error; };
fmi2_xml_parse_fatal(context, "Could not allocate memory"); return -1; } } if(!jm_vector_push_back(size_t)(&deps->startIndex, totNumDep + numDepInd)) { fmi2_xml_parse_fatal(context, "Could not allocate memory"); return -1; } return 0; } int fmi2_xml_parse_unknown(fmi2_xml_parser_context_t *context, fmi2_xml_elm_enu_t parentElmID, jm_vector(jm_voidp) *destVarList, fmi2_xml_dependencies_t* deps) { fmi2_xml_model_description_t* md = context->modelDescription; fmi2_xml_model_structure_t* ms = md->modelStructure; unsigned int index; fmi2_xml_variable_t* variable; /* <xs:attribute name="index" type="xs:unsignedInt" use="required"> */ if (fmi2_xml_set_attr_uint(context, fmi2_xml_elmID_Unknown, fmi_attr_id_index, 1, &index, 0)) return -1; index--; /* Convert from one- to zero-based indexing */ /* Ok to just check upper bound since index is unsigned. */ if (index >= jm_vector_get_size(jm_voidp)(md->variablesOrigOrder)) { fmi2_xml_parse_error(context, "The index attribute must have a value between 1 and the number of model variables.");
/** \brief Collect model information by counting the number of variables with specific properties and fillinf in fmi1_import_model_counts_t struct. \param fmu - An fmu object as returned by fmi1_import_parse_xml(). \param counts - a pointer to a preallocated struct. */ void fmi1_import_collect_model_counts(fmi1_import_t* fmu, fmi1_import_model_counts_t* counts) { jm_vector(jm_voidp)* vars = fmi1_xml_get_variables_original_order(fmu->md); size_t nv, i; memset(counts,0,sizeof(fmi1_import_model_counts_t)); if(!vars) return; nv = jm_vector_get_size(jm_voidp)(vars); for(i = 0; i< nv; i++) { fmi1_xml_variable_t* var = (fmi1_xml_variable_t*)jm_vector_get_item(jm_voidp)(vars, i); switch (fmi1_xml_get_variability(var)) { case fmi1_variability_enu_constant: counts->num_constants++; break; case fmi1_variability_enu_parameter: counts->num_parameters++; break; case fmi1_variability_enu_discrete: counts->num_discrete++; break; case fmi1_variability_enu_continuous: counts->num_continuous++; break; default: assert(0); } switch(fmi1_xml_get_causality(var)) { case fmi1_causality_enu_none: counts->num_causality_none++; break; case fmi1_causality_enu_input: counts->num_inputs++; break; case fmi1_causality_enu_output: counts->num_outputs++; break; case fmi1_causality_enu_internal: counts->num_internal++; break; default: assert(0); } switch(fmi1_xml_get_variable_base_type(var)) { case fmi1_base_type_real: counts->num_real_vars++; break; case fmi1_base_type_int: counts->num_integer_vars++; break; case fmi1_base_type_bool: counts->num_bool_vars++; break; case fmi1_base_type_str: counts->num_string_vars++; break; case fmi1_base_type_enum: counts->num_enum_vars++; break; default: assert(0); } } return; }
if(!fmi2_import_check_has_FMU(fmu)) return 0; return fmi2_xml_get_unit_definitions(fmu->md); } unsigned int fmi2_import_get_unit_definitions_number(fmi2_import_unit_definitions_t* ud) { return fmi2_xml_get_unit_definitions_number(ud); } fmi2_import_type_definitions_t* fmi2_import_get_type_definitions(fmi2_import_t* fmu) { if(!fmi2_import_check_has_FMU(fmu)) return 0; return fmi2_xml_get_type_definitions(fmu->md); } fmi2_import_variable_list_t* fmi2_import_vector_to_varlist(fmi2_import_t* fmu, jm_vector(jm_voidp)* vars) { fmi2_import_variable_list_t* vl; size_t nv, i; if(!vars) return 0; nv = jm_vector_get_size(jm_voidp)(vars); vl = fmi2_import_alloc_variable_list(fmu, nv); if(!vl) return 0; for(i = 0; i< nv; i++) { jm_vector_set_item(jm_voidp)(&vl->variables, i, jm_vector_get_item(jm_voidp)(vars, i)); } return vl; } /* Get the list of all the variables in the model */