| 47 | } |
| 48 | |
| 49 | static CppcheckLibraryData::Container loadContainer(QXmlStreamReader &xmlReader) |
| 50 | { |
| 51 | CppcheckLibraryData::Container container; |
| 52 | container.id = xmlReader.attributes().value("id").toString(); |
| 53 | container.inherits = xmlReader.attributes().value("inherits").toString(); |
| 54 | container.startPattern = xmlReader.attributes().value("startPattern").toString(); |
| 55 | container.endPattern = xmlReader.attributes().value("endPattern").toString(); |
| 56 | container.opLessAllowed = xmlReader.attributes().value("opLessAllowed").toString(); |
| 57 | container.itEndPattern = xmlReader.attributes().value("itEndPattern").toString(); |
| 58 | |
| 59 | QXmlStreamReader::TokenType type; |
| 60 | while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 61 | xmlReader.name().toString() != "container") { |
| 62 | if (type != QXmlStreamReader::StartElement) |
| 63 | continue; |
| 64 | const QString elementName = xmlReader.name().toString(); |
| 65 | if (elementName == "type") { |
| 66 | container.type.templateParameter = xmlReader.attributes().value("templateParameter").toString(); |
| 67 | container.type.string = xmlReader.attributes().value("string").toString(); |
| 68 | } else if (elementName == "size" || elementName == "access" || elementName == "other" || elementName == "rangeItemRecordType") { |
| 69 | const QString indexOperator = xmlReader.attributes().value("indexOperator").toString(); |
| 70 | if (elementName == "access" && indexOperator == "array-like") |
| 71 | container.access_arrayLike = true; |
| 72 | const QString templateParameter = xmlReader.attributes().value("templateParameter").toString(); |
| 73 | if (elementName == "size" && !templateParameter.isEmpty()) |
| 74 | container.size_templateParameter = templateParameter.toInt(); |
| 75 | for (;;) { |
| 76 | type = xmlReader.readNext(); |
| 77 | if (xmlReader.name().toString() == elementName) |
| 78 | break; |
| 79 | if (type != QXmlStreamReader::StartElement) |
| 80 | continue; |
| 81 | CppcheckLibraryData::Container::Function function; |
| 82 | function.name = xmlReader.attributes().value("name").toString(); |
| 83 | function.action = xmlReader.attributes().value("action").toString(); |
| 84 | function.yields = xmlReader.attributes().value("yields").toString(); |
| 85 | if (elementName == "size") |
| 86 | container.sizeFunctions.append(function); |
| 87 | else if (elementName == "access") |
| 88 | container.accessFunctions.append(function); |
| 89 | else if (elementName == "rangeItemRecordType") { |
| 90 | CppcheckLibraryData::Container::RangeItemRecordType rangeItemRecordType; |
| 91 | rangeItemRecordType.name = xmlReader.attributes().value("name").toString(); |
| 92 | rangeItemRecordType.templateParameter = xmlReader.attributes().value("templateParameter").toString(); |
| 93 | container.rangeItemRecordTypeList.append(rangeItemRecordType); |
| 94 | } else |
| 95 | container.otherFunctions.append(function); |
| 96 | } |
| 97 | } else { |
| 98 | unhandledElement(xmlReader); |
| 99 | } |
| 100 | } |
| 101 | return container; |
| 102 | } |
| 103 | |
| 104 | static CppcheckLibraryData::Define loadDefine(const QXmlStreamReader &xmlReader) |
| 105 | { |