@@ -107,7 +107,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
107107 return Error (BAD_XML);
108108
109109 if (strcmp (rootnode->Name ()," def" ) != 0 )
110- return Error (BAD_ELEMENT , rootnode->Name ());
110+ return Error (UNSUPPORTED_FORMAT , rootnode->Name ());
111111
112112 const char * format_string = rootnode->Attribute (" format" );
113113 int format = 1 ;
@@ -117,6 +117,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
117117 if (format > 1 )
118118 return Error (UNSUPPORTED_FORMAT);
119119
120+ std::set<std::string> unknown_elements;
121+
120122 for (const tinyxml2::XMLElement *node = rootnode->FirstChildElement (); node; node = node->NextSiblingElement ()) {
121123 const std::string nodename = node->Name ();
122124 if (nodename == " memory" || nodename == " resource" ) {
@@ -153,7 +155,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
153155 else if (memorynodename == " use" )
154156 use.insert (memorynode->GetText ());
155157 else
156- return Error (BAD_ELEMENT, memorynodename);
158+ unknown_elements. insert ( memorynodename);
157159 }
158160 }
159161
@@ -273,7 +275,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
273275 }
274276
275277 else
276- return Error (BAD_ATTRIBUTE, argnodename);
278+ unknown_elements. insert ( argnodename);
277279 }
278280 argumentChecks[name][nr].notbool = notbool;
279281 argumentChecks[name][nr].notnull = notnull;
@@ -287,14 +289,16 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
287289 const tinyxml2::XMLAttribute* secure = functionnode->FindAttribute (" secure" );
288290 _formatstr[name] = std::make_pair (scan && scan->BoolValue (), secure && secure->BoolValue ());
289291 } else
290- return Error (BAD_ELEMENT, functionnodename);
292+ unknown_elements. insert ( functionnodename);
291293 }
292294 }
293295
294296 else if (nodename == " reflection" ) {
295297 for (const tinyxml2::XMLElement *reflectionnode = node->FirstChildElement (); reflectionnode; reflectionnode = reflectionnode->NextSiblingElement ()) {
296- if (strcmp (reflectionnode->Name (), " call" ) != 0 )
297- return Error (BAD_ELEMENT, reflectionnode->Name ());
298+ if (strcmp (reflectionnode->Name (), " call" ) != 0 ) {
299+ unknown_elements.insert (reflectionnode->Name ());
300+ continue ;
301+ }
298302
299303 const char * const argString = reflectionnode->Attribute (" arg" );
300304 if (!argString)
@@ -325,14 +329,16 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
325329 return Error (MISSING_ATTRIBUTE, " name" );
326330 _keywords[extension].insert (nodeName);
327331 } else
328- return Error (BAD_ELEMENT, librarynode->Name ());
332+ unknown_elements. insert ( librarynode->Name ());
329333 }
330334 }
331335
332336 else if (markupnodename == " exported" ) {
333337 for (const tinyxml2::XMLElement *exporter = markupnode->FirstChildElement (); exporter; exporter = exporter->NextSiblingElement ()) {
334- if (strcmp (exporter->Name (), " exporter" ) != 0 )
335- return Error (BAD_ELEMENT, exporter->Name ());
338+ if (strcmp (exporter->Name (), " exporter" ) != 0 ) {
339+ unknown_elements.insert (exporter->Name ());
340+ continue ;
341+ }
336342
337343 const char * const prefix = exporter->Attribute (" prefix" );
338344 if (!prefix)
@@ -345,7 +351,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
345351 else if (ename == " suffix" )
346352 _exporters[prefix].addSuffix (e->GetText ());
347353 else
348- return Error (BAD_ELEMENT, ename);
354+ unknown_elements. insert ( ename);
349355 }
350356 }
351357 }
@@ -355,7 +361,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
355361 if (strcmp (librarynode->Name (), " importer" ) == 0 )
356362 _importers[extension].insert (librarynode->GetText ());
357363 else
358- return Error (BAD_ELEMENT, librarynode->Name ());
364+ unknown_elements. insert ( librarynode->Name ());
359365 }
360366 }
361367
@@ -379,12 +385,12 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
379385 }
380386
381387 else
382- return Error (BAD_ELEMENT, blocknodename);
388+ unknown_elements. insert ( blocknodename);
383389 }
384390 }
385391
386392 else
387- return Error (BAD_ELEMENT, markupnodename);
393+ unknown_elements. insert ( markupnodename);
388394 }
389395 }
390396
@@ -415,8 +421,10 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
415421 const std::string containerNodeName = containerNode->Name ();
416422 if (containerNodeName == " size" || containerNodeName == " access" || containerNodeName == " other" ) {
417423 for (const tinyxml2::XMLElement *functionNode = containerNode->FirstChildElement (); functionNode; functionNode = functionNode->NextSiblingElement ()) {
418- if (std::string (functionNode->Name ()) != " function" )
419- return Error (BAD_ELEMENT, functionNode->Name ());
424+ if (std::string (functionNode->Name ()) != " function" ) {
425+ unknown_elements.insert (functionNode->Name ());
426+ continue ;
427+ }
420428
421429 const char * const functionName = functionNode->Attribute (" name" );
422430 if (!functionName)
@@ -486,7 +494,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
486494 if (string)
487495 container.stdStringLike = std::string (string) == " std-like" ;
488496 } else
489- return Error (BAD_ELEMENT, containerNodeName);
497+ unknown_elements. insert ( containerNodeName);
490498 }
491499 }
492500
@@ -534,7 +542,7 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
534542 else if (typenodename == " const_ptr" )
535543 type._const_ptr = true ;
536544 else
537- return Error (BAD_ELEMENT, typenodename);
545+ unknown_elements. insert ( typenodename);
538546 }
539547 if (platform.empty ()) {
540548 const PlatformType * const type_ptr = platform_type (type_name, " " );
@@ -559,7 +567,16 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
559567 }
560568
561569 else
562- return Error (BAD_ELEMENT, nodename);
570+ unknown_elements.insert (nodename);
571+ }
572+ if (!unknown_elements.empty ()) {
573+ std::string str;
574+ for (std::set<std::string>::const_iterator i = unknown_elements.begin (); i != unknown_elements.end ();) {
575+ str += *i;
576+ if (++i != unknown_elements.end ())
577+ str += " , " ;
578+ }
579+ return Error (UNKNOWN_ELEMENT, str);
563580 }
564581 return Error (OK);
565582}
0 commit comments