summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/test/CMakeLists.txt1
-rw-r--r--data/test/Makefile.am1
-rw-r--r--data/test/testintmap.xml11
-rw-r--r--src/utils/xmlutils.cpp54
-rw-r--r--src/utils/xmlutils.h9
-rw-r--r--src/utils/xmlutils_unittest.cc29
6 files changed, 105 insertions, 0 deletions
diff --git a/data/test/CMakeLists.txt b/data/test/CMakeLists.txt
index e300301d8..4a3dbfb63 100644
--- a/data/test/CMakeLists.txt
+++ b/data/test/CMakeLists.txt
@@ -11,6 +11,7 @@ SET(FILES
quests.xml
serverlistplus.xml
simplefile.txt
+ testintmap.xml
units.xml
)
diff --git a/data/test/Makefile.am b/data/test/Makefile.am
index 5000dbadb..8a3f82be9 100644
--- a/data/test/Makefile.am
+++ b/data/test/Makefile.am
@@ -13,6 +13,7 @@ test_DATA = \
quests.xml \
serverlistplus.xml \
simplefile.txt \
+ testintmap.xml \
units.xml
EXTRA_DIST = \
diff --git a/data/test/testintmap.xml b/data/test/testintmap.xml
new file mode 100644
index 000000000..342591f9c
--- /dev/null
+++ b/data/test/testintmap.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Author: 4144
+Copyright (C) 2016 ManaPlus developers -->
+
+<tests>
+ <sub>
+ <item id="1" val="2"/>
+ <item id="10" val="20"/>
+ <item id="3"/>
+ </sub>
+</tests>
diff --git a/src/utils/xmlutils.cpp b/src/utils/xmlutils.cpp
index fdcc272ec..5cc14f517 100644
--- a/src/utils/xmlutils.cpp
+++ b/src/utils/xmlutils.cpp
@@ -130,3 +130,57 @@ void readXmlStringMap(const std::string &fileName,
}
}
}
+
+void readXmlIntMap(const std::string &fileName,
+ const std::string &rootName,
+ const std::string &sectionName,
+ const std::string &itemName,
+ const std::string &attributeKeyName,
+ const std::string &attributeValueName,
+ std::map<int32_t, int32_t> &arr,
+ const SkipError skipError)
+{
+ XML::Document doc(fileName, UseResman_true, skipError);
+ const XmlNodePtrConst rootNode = doc.rootNode();
+
+ if (!rootNode || !xmlNameEqual(rootNode, rootName.c_str()))
+ {
+ logger->log("Error while loading %s!", fileName.c_str());
+ return;
+ }
+
+ for_each_xml_child_node(sectionNode, rootNode)
+ {
+ if (!xmlNameEqual(sectionNode, sectionName.c_str()))
+ continue;
+ for_each_xml_child_node(childNode, sectionNode)
+ {
+ if (xmlNameEqual(childNode, itemName.c_str()))
+ {
+ const std::string key = XML::getProperty(childNode,
+ attributeKeyName.c_str(), "");
+ if (key.empty())
+ continue;
+ const int32_t val = XML::getProperty(childNode,
+ attributeValueName.c_str(), 0);
+ arr[atoi(key.c_str())] = val;
+ }
+ else if (xmlNameEqual(childNode, "include"))
+ {
+ const std::string name = XML::getProperty(
+ childNode, "name", "");
+ if (!name.empty())
+ {
+ readXmlIntMap(name,
+ rootName,
+ sectionName,
+ itemName,
+ attributeKeyName,
+ attributeValueName,
+ arr,
+ skipError);
+ }
+ }
+ }
+ }
+}
diff --git a/src/utils/xmlutils.h b/src/utils/xmlutils.h
index 928519267..d80758848 100644
--- a/src/utils/xmlutils.h
+++ b/src/utils/xmlutils.h
@@ -44,4 +44,13 @@ void readXmlStringMap(const std::string &fileName,
std::map<std::string, std::string> &arr,
const SkipError skipError);
+void readXmlIntMap(const std::string &fileName,
+ const std::string &rootName,
+ const std::string &sectionName,
+ const std::string &itemName,
+ const std::string &attributeKeyName,
+ const std::string &attributeValueName,
+ std::map<int32_t, int32_t> &arr,
+ const SkipError skipError);
+
#endif // UTILS_XMLUTILS_H
diff --git a/src/utils/xmlutils_unittest.cc b/src/utils/xmlutils_unittest.cc
index 3fc27c598..55e6397d2 100644
--- a/src/utils/xmlutils_unittest.cc
+++ b/src/utils/xmlutils_unittest.cc
@@ -89,3 +89,32 @@ TEST_CASE("xmlutils readXmlStringMap 1")
REQUIRE(arr["Metal"] == "26");
ResourceManager::deleteInstance();
}
+
+TEST_CASE("xmlutils readXmlIntMap 1")
+{
+ client = new Client;
+ PHYSFS_init("manaplus");
+ dirSeparator = "/";
+ XML::initXML();
+ logger = new Logger();
+ ResourceManager::init();
+ resourceManager->addToSearchPath("data/test", Append_false);
+ resourceManager->addToSearchPath("../data/test", Append_false);
+
+ std::map<int32_t, int32_t> arr;
+
+ readXmlIntMap("testintmap.xml",
+ "tests",
+ "sub",
+ "item",
+ "id",
+ "val",
+ arr,
+ SkipError_false);
+
+ REQUIRE(arr.size() == 3);
+ REQUIRE(arr[1] == 2);
+ REQUIRE(arr[10] == 20);
+ REQUIRE(arr[3] == 0);
+ ResourceManager::deleteInstance();
+}