From: sgunderson@bigfoot.com <> Date: Wed, 21 Sep 2011 23:24:40 +0000 (+0200) Subject: Make Clone and Alternate in C++0x handle embedded NULL values (kind of pointless... X-Git-Url: https://git.sesse.net/?p=xml-template;a=commitdiff_plain;h=62c782c572e33a1f03f57a71f63309165da47e73 Make Clone and Alternate in C++0x handle embedded NULL values (kind of pointless in C++, but it is good to have equivalent semantics everywhere). Add attribute3 test, which then passes. --- diff --git a/c++0x/Makefile b/c++0x/Makefile index 3f24295..837cb06 100644 --- a/c++0x/Makefile +++ b/c++0x/Makefile @@ -18,6 +18,9 @@ attribute: attribute.o $(LIBS) attribute2: attribute2.o $(LIBS) $(CXX) -o $@ $< $(LIBS) $(LDFLAGS) +attribute3: attribute3.o $(LIBS) + $(CXX) -o $@ $< $(LIBS) $(LDFLAGS) + namespace: namespace.o $(LIBS) $(CXX) -o $@ $< $(LIBS) $(LDFLAGS) diff --git a/c++0x/attribute3.cpp b/c++0x/attribute3.cpp new file mode 100644 index 0000000..a3f8b6e --- /dev/null +++ b/c++0x/attribute3.cpp @@ -0,0 +1,22 @@ +#include + +#include "xml-template.h" + +using namespace std; + +int main(int argc, char **argv) +{ + Substitute master_directive = { + make_pair("color", new Replace("blue")), + make_pair("#things", new Alternate { "li/class", { + new Substitute { make_pair("li", new Replace("Raindrops on roses")), }, + new Substitute { make_pair("li", new Replace("Whiskers on kittens")), }, + NULL, + new Substitute { make_pair("li", new Replace("Bright copper kettles")), }, + new Substitute { make_pair("li", new Replace("Warm, woolen mittens")), }, + }, { "odd", "even" } }), + }; + + process_file("../xml/clone.xml", argv[1], &master_directive); + return(0); +} diff --git a/c++0x/xml-template.cpp b/c++0x/xml-template.cpp index 9e19f09..30e5a7e 100644 --- a/c++0x/xml-template.cpp +++ b/c++0x/xml-template.cpp @@ -74,6 +74,9 @@ void Clone::process(xmlNode *node, bool clean) vector new_nodes; for (auto it : subdirectives) { + if (it == NULL) { + continue; + } xmlNode *new_node; xmlDOMWrapCloneNode(NULL, node->doc, node, &new_node, node->doc, NULL, 1, 0); it->process(new_node, clean); @@ -102,8 +105,12 @@ Alternate::Alternate(const string &attribute, const vector &alternatives) : Clone(subdirectives_subs) { + unsigned jx = 0; for (unsigned ix = 0; ix < subdirectives_subs.size(); ++ix) { - string value = alternatives[ix % alternatives.size()]; + if (subdirectives_subs[ix] == NULL) { + continue; + } + string value = alternatives[jx++ % alternatives.size()]; subdirectives_subs[ix]->substitution_map.insert(make_pair( attribute, new Replace { value }));