@@ -249,21 +249,20 @@ bool parseUInt8AttributeEzXml(ezxml_t element, const char *attributeName, uint8_
249249 return false;
250250}
251251
252- bool parseModelStructureElement (fmi3ModelStructureElement * output , ezxml_t * element )
252+ bool parseModelStructureElement (fmi3ModelStructureElement * output , ezxml_t * element , fmiHandle * fmu )
253253{
254254 //Count number of dependencies
255255 output -> numberOfDependencies = 0 ;
256256 const char * dependencies = NULL ;
257- if (parseStringAttributeEzXml (* element , "dependencies" , & dependencies )) {
257+ if (parseStringAttributeEzXmlAndRememberPointer (* element , "dependencies" , & dependencies , fmu )) {
258258
259259 if (dependencies == NULL || dependencies [0 ] == '\0' ) {
260260 //If dependencies is empty, no need to parse further
261261 return true;
262262 }
263263
264264 //Duplicate the dependencies string to make it mutable
265- char * nonConstDependencies = _strdup (dependencies );
266- free ((char * )dependencies );
265+ char * nonConstDependencies = duplicateAndRememberString (fmu , dependencies );
267266
268267 if (nonConstDependencies == NULL ) {
269268 return false; //strdup failed, handle as an error
@@ -279,7 +278,7 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
279278
280279
281280 //Allocate memory for dependencies
282- output -> dependencies = malloc ( output -> numberOfDependencies * sizeof (fmi3ValueReference ));
281+ output -> dependencies = mallocAndRememberPointer ( fmu , output -> numberOfDependencies * sizeof (fmi3ValueReference ));
283282
284283 //Read dependencies
285284 const char * delim = " " ;
@@ -294,14 +293,12 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
294293
295294 //Parse depenendency kinds element if present
296295 const char * dependencyKinds = NULL ;
297- parseStringAttributeEzXml (* element , "dependencyKinds" , & dependencyKinds );
296+ parseStringAttributeEzXmlAndRememberPointer (* element , "dependencyKinds" , & dependencyKinds , fmu );
298297 if (dependencyKinds ) {
299- char * nonConstDependencyKinds = _strdup (dependencyKinds );
300- free ((char * )dependencyKinds );
298+ char * nonConstDependencyKinds = duplicateAndRememberString (fmu , dependencyKinds );
301299
302300 //Allocate memory for dependencies (assume same number as dependencies, according to FMI3 specification)
303- output -> dependencies = malloc (output -> numberOfDependencies * sizeof (fmi3ValueReference ));
304-
301+ output -> dependencies = mallocAndRememberPointer (fmu , output -> numberOfDependencies * sizeof (fmi3ValueReference ));
305302 //Read dependency kinds
306303 for (int j = 0 ; j < output -> numberOfDependencies ; ++ j ) {
307304 const char * kind ;
@@ -313,9 +310,7 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
313310 }
314311
315312 if (!strcmp (kind , "independent" )) {
316- fmi4cErrorMessage = _strdup ("Dependency kind = \"independent\" is not allowed for output dependencies." );
317- free (nonConstDependencyKinds );
318- free (nonConstDependencies );
313+ fmi4cErrorMessage = duplicateAndRememberString (fmu , "Dependency kind = \"independent\" is not allowed for output dependencies." );
319314 return false;
320315 }
321316 else if (!strcmp (kind , "constant" )) {
@@ -334,15 +329,11 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
334329 output -> dependencyKinds [j ] = fmi3Dependent ;
335330 }
336331 else {
337- fmi4cErrorMessage = _strdup ("Unknown dependency kind for output dependency." );
338- free (nonConstDependencyKinds );
339- free (nonConstDependencies );
332+ fmi4cErrorMessage = duplicateAndRememberString (fmu , "Unknown dependency kind for output dependency." );
340333 return false;
341334 }
342335 }
343- free (nonConstDependencyKinds );
344336 }
345- free (nonConstDependencies );
346337 }
347338
348339 return true;
0 commit comments