Clone::Clone(const vector<Directive *> &subdirectives)
: subdirectives(subdirectives) {}
-
+
+Clone::Clone(const vector<Substitute *> &subdirectives_subs)
+{
+ for (auto it : subdirectives_subs) {
+ subdirectives.push_back(static_cast<Directive *>(it));
+ }
+}
+
Clone::Clone(initializer_list<Directive *> subdirectives)
: subdirectives(subdirectives) {}
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);
clean_node(node);
}
}
+
+Alternate::Alternate(const string &attribute,
+ const vector<Substitute *> &subdirectives_subs,
+ const vector<string> &alternatives)
+ : Clone(subdirectives_subs)
+{
+ unsigned jx = 0;
+ for (unsigned ix = 0; ix < subdirectives_subs.size(); ++ix) {
+ if (subdirectives_subs[ix] == NULL) {
+ continue;
+ }
+ string value = alternatives[jx++ % alternatives.size()];
+ subdirectives_subs[ix]->substitution_map.insert(make_pair(
+ attribute,
+ new Replace { value }));
+ }
+}
Substitute::Substitute(const unordered_map<string, Directive*> &substitution_map)
: substitution_map(substitution_map) {}
string id;
xmlAttr *id_attr = NULL;
for (xmlAttr *attr = child->properties; attr != NULL; attr = attr->next) {
- if (strcmp(reinterpret_cast<const char *>(attr->ns->href), "http://template.sesse.net/") == 0 &&
+ if (attr->ns != NULL &&
+ strcmp(reinterpret_cast<const char *>(attr->ns->href), "http://template.sesse.net/") == 0 &&
strcmp(reinterpret_cast<const char *>(attr->name), "id") == 0) {
xmlChar *id_buf = xmlNodeGetContent(attr->children);
id = reinterpret_cast<const char *>(id_buf);
}
}
-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);
}