%module XML_Template_SWIG
+struct XmlDocPtrWrapper {
+ ~XmlDocPtrWrapper();
+};
+
%{
+#include <memory>
+
#include "../c++11/xml-template.h"
-
+
+struct XmlDocWrapper {
+ ~XmlDocWrapper() { xmlFreeDoc(ptr); }
+ xmlDocPtr ptr;
+};
+typedef std::shared_ptr<XmlDocWrapper> XmlDocPtrWrapper;
+
bool is_associative_array(HashTable *ht)
{
if (ht->nNumOfElements == 0) {
return new Replace(str);
}
case IS_RESOURCE: {
- xmlDocPtr *doc;
- if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_xmlDocPtr, 0) < 0 || doc == NULL) {
+ XmlDocPtrWrapper *doc;
+ if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_XmlDocPtrWrapper, 0) < 0 || doc == NULL) {
return NULL;
}
- return new ReplaceInclude(xmlCopyDoc(*doc, 1));
+ return new ReplaceInclude(xmlCopyDoc(doc->get()->ptr, 1));
}
case IS_NULL:
return NULL;
return NULL;
}
-xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean)
+XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean)
{
xmlDocPtr ret = process_file(input_filename, root_directive, clean);
delete root_directive;
- return ret;
+ return XmlDocPtrWrapper(new XmlDocWrapper { ret });
+}
+
+void output_to_fd(XmlDocPtrWrapper doc, int fd)
+{
+ xmlOutputBufferPtr buf = xmlOutputBufferCreateFd(fd, NULL);
+ xmlSaveFileTo(buf, doc->ptr, NULL);
}
%}
$1 = convert_php_objects_to_directive(*$input);
}
-xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean);
-void output_to_fd_and_free(xmlDocPtr doc, int fd);
+XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean);
+void output_to_fd(XmlDocPtrWrapper doc, int fd);