Mercurial > minori
comparison dep/pugixml/docs/samples/include.cpp @ 55:d10b6c6b432e
add xml lib, we will need to use it eventually
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Tue, 26 Sep 2023 12:37:08 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
54:466ac9870df9 | 55:d10b6c6b432e |
---|---|
1 #include "pugixml.hpp" | |
2 | |
3 #include <string.h> | |
4 #include <iostream> | |
5 | |
6 // tag::code[] | |
7 bool load_preprocess(pugi::xml_document& doc, const char* path); | |
8 | |
9 bool preprocess(pugi::xml_node node) | |
10 { | |
11 for (pugi::xml_node child = node.first_child(); child; ) | |
12 { | |
13 if (child.type() == pugi::node_pi && strcmp(child.name(), "include") == 0) | |
14 { | |
15 pugi::xml_node include = child; | |
16 | |
17 // load new preprocessed document (note: ideally this should handle relative paths) | |
18 const char* path = include.value(); | |
19 | |
20 pugi::xml_document doc; | |
21 if (!load_preprocess(doc, path)) return false; | |
22 | |
23 // insert the comment marker above include directive | |
24 node.insert_child_before(pugi::node_comment, include).set_value(path); | |
25 | |
26 // copy the document above the include directive (this retains the original order!) | |
27 for (pugi::xml_node ic = doc.first_child(); ic; ic = ic.next_sibling()) | |
28 { | |
29 node.insert_copy_before(ic, include); | |
30 } | |
31 | |
32 // remove the include node and move to the next child | |
33 child = child.next_sibling(); | |
34 | |
35 node.remove_child(include); | |
36 } | |
37 else | |
38 { | |
39 if (!preprocess(child)) return false; | |
40 | |
41 child = child.next_sibling(); | |
42 } | |
43 } | |
44 | |
45 return true; | |
46 } | |
47 | |
48 bool load_preprocess(pugi::xml_document& doc, const char* path) | |
49 { | |
50 pugi::xml_parse_result result = doc.load_file(path, pugi::parse_default | pugi::parse_pi); // for <?include?> | |
51 | |
52 return result ? preprocess(doc) : false; | |
53 } | |
54 // end::code[] | |
55 | |
56 int main() | |
57 { | |
58 pugi::xml_document doc; | |
59 if (!load_preprocess(doc, "character.xml")) return -1; | |
60 | |
61 doc.print(std::cout); | |
62 } | |
63 | |
64 // vim:et |