diff options
author | 2016-06-25 19:01:45 +0200 | |
---|---|---|
committer | 2016-06-25 19:54:44 +0200 | |
commit | 8042037fd9e6d012f04f8dcc13c2215d72ccee06 (patch) | |
tree | 3babbd12b19f6b0cd8515da6f5f3d502369ec4ae /3rdparty/pugixml/docs/samples/include.cpp | |
parent | 3739530a86b94869daecea75f8a0938a14e5741a (diff) |
Added PugiXML and used it for hashfile (nw)
Diffstat (limited to '3rdparty/pugixml/docs/samples/include.cpp')
-rw-r--r-- | 3rdparty/pugixml/docs/samples/include.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/3rdparty/pugixml/docs/samples/include.cpp b/3rdparty/pugixml/docs/samples/include.cpp new file mode 100644 index 00000000000..84f9dd0e1ee --- /dev/null +++ b/3rdparty/pugixml/docs/samples/include.cpp @@ -0,0 +1,64 @@ +#include "pugixml.hpp" + +#include <string.h> +#include <iostream> + +// tag::code[] +bool load_preprocess(pugi::xml_document& doc, const char* path); + +bool preprocess(pugi::xml_node node) +{ + for (pugi::xml_node child = node.first_child(); child; ) + { + if (child.type() == pugi::node_pi && strcmp(child.name(), "include") == 0) + { + pugi::xml_node include = child; + + // load new preprocessed document (note: ideally this should handle relative paths) + const char* path = include.value(); + + pugi::xml_document doc; + if (!load_preprocess(doc, path)) return false; + + // insert the comment marker above include directive + node.insert_child_before(pugi::node_comment, include).set_value(path); + + // copy the document above the include directive (this retains the original order!) + for (pugi::xml_node ic = doc.first_child(); ic; ic = ic.next_sibling()) + { + node.insert_copy_before(ic, include); + } + + // remove the include node and move to the next child + child = child.next_sibling(); + + node.remove_child(include); + } + else + { + if (!preprocess(child)) return false; + + child = child.next_sibling(); + } + } + + return true; +} + +bool load_preprocess(pugi::xml_document& doc, const char* path) +{ + pugi::xml_parse_result result = doc.load_file(path, pugi::parse_default | pugi::parse_pi); // for <?include?> + + return result ? preprocess(doc) : false; +} +// end::code[] + +int main() +{ + pugi::xml_document doc; + if (!load_preprocess(doc, "character.xml")) return -1; + + doc.print(std::cout); +} + +// vim:et |