X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=c%2B%2B0x%2Fxml-template.cpp;h=e8fc0edb086678d12ebea5eddc04fe355478d7e9;hb=ad45bc892752571fec46b21564e4683c074f1d46;hp=9e19f0914c03a9a14f7a6d9ad8db6dcf68920441;hpb=a87410331a3cf42444d92930a9a796a384278c8d;p=xml-template diff --git a/c++0x/xml-template.cpp b/c++0x/xml-template.cpp index 9e19f09..e8fc0ed 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 })); @@ -189,17 +196,21 @@ void Substitute::process(xmlNode *node, bool clean) } } -void process_file(const string &input_filename, - const string &output_filename, - Directive *root_directive) +xmlDocPtr process_file(const string &input_filename, + Directive *root_directive) { LIBXML_TEST_VERSION xmlDocPtr doc = xmlParseFile(input_filename.c_str()); root_directive->process(xmlDocGetRootElement(doc), true); - xmlSaveFile(output_filename.c_str(), doc); - xmlFreeDoc(doc); - xmlCleanupParser(); xmlMemoryDump(); + return doc; +} + +void output_to_fd_and_free(xmlDocPtr doc, int fd) +{ + xmlOutputBufferPtr buf = xmlOutputBufferCreateFd(fd, NULL); + xmlSaveFileTo(buf, doc, NULL); + xmlFreeDoc(doc); }