]> git.sesse.net Git - xml-template/commitdiff
Make Clone and Alternate in C++0x handle embedded NULL values (kind of pointless...
authorsgunderson@bigfoot.com <>
Wed, 21 Sep 2011 23:24:40 +0000 (01:24 +0200)
committersgunderson@bigfoot.com <>
Wed, 21 Sep 2011 23:24:40 +0000 (01:24 +0200)
c++0x/Makefile
c++0x/attribute3.cpp [new file with mode: 0644]
c++0x/xml-template.cpp

index 3f24295a1ffdbeb0ccb930029a650203ebb175fb..837cb06780733ff353f328f7696d17c426ac73f7 100644 (file)
@@ -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 (file)
index 0000000..a3f8b6e
--- /dev/null
@@ -0,0 +1,22 @@
+#include <stdio.h>
+
+#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);
+}
index 9e19f0914c03a9a14f7a6d9ad8db6dcf68920441..30e5a7e1e3f96a6d740ebefdb68ea1c2d1c6bfb4 100644 (file)
@@ -74,6 +74,9 @@ void Clone::process(xmlNode *node, bool clean)
        vector<xmlNode *> 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<string> &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 }));