%module XML_Template_SWIG
+%include <std_string.i>
+
+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 Substitute(my_map);
} else {
- printf("ARRAY\n");
+ std::vector<Directive *> subdirectives;
+ for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
+ zval **data;
+ zend_hash_index_find(ht, i, (void **)&data);
+ subdirectives.push_back(convert_php_objects_to_directive(*data));
+ }
+ return new Clone(subdirectives);
}
break;
}
char *str = Z_STRVAL_P(obj);
return new Replace(str);
}
+ case IS_RESOURCE: {
+ XmlDocPtrWrapper *doc;
+ if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_XmlDocPtrWrapper, 0) < 0 || doc == NULL) {
+ return NULL;
+ }
+ return new ReplaceInclude(xmlCopyDoc((*doc)->ptr, 1));
+ }
+ case IS_NULL:
+ return NULL;
default:
printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
break;
return NULL;
}
+XmlDocPtrWrapper XML_Template_process_file(const std::string &input_filename, Directive *root_directive, bool clean)
+{
+ xmlDocPtr ret = process_file(input_filename, root_directive, clean);
+ delete root_directive;
+ return XmlDocPtrWrapper(new XmlDocWrapper { ret });
+}
+
+XmlDocPtrWrapper XML_Template_process(XmlDocPtrWrapper doc, Directive *root_directive, bool clean)
+{
+ xmlDocPtr new_doc = xmlCopyDoc(doc->ptr, 1);
+ root_directive->process(xmlDocGetRootElement(new_doc), clean);
+ delete root_directive;
+ return XmlDocPtrWrapper(new XmlDocWrapper { new_doc });
+}
+
+namespace {
+
+int write_to_string(void *context, const char *buffer, int len)
+{
+ std::string *str = reinterpret_cast<std::string *>(context);
+ str->append(buffer, len);
+ return len;
+}
+
+int close_string(void *context)
+{
+ return 0;
+}
+
+} // namespace
+
+std::string XML_Template_convert_doc_to_string(XmlDocPtrWrapper doc)
+{
+ std::string ret;
+ xmlOutputBufferPtr buf = xmlOutputBufferCreateIO(write_to_string, close_string, &ret, NULL);
+ xmlSaveFileTo(buf, doc->ptr, NULL);
+ return ret;
+}
+
%}
%typemap(in) Directive* {
$1 = convert_php_objects_to_directive(*$input);
}
-xmlDocPtr 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 std::string &input_filename, Directive *root_directive, bool clean);
+XmlDocPtrWrapper XML_Template_process(XmlDocPtrWrapper doc, Directive *root_directive, bool clean);
+std::string XML_Template_convert_doc_to_string(XmlDocPtrWrapper doc);