X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=php5-swig%2Fxml-template.swig;h=e39053c0e1f8a7a958c83023f79cb79f51cf1b13;hb=c1442a39c69a0e27eaf47165e53c801672390acc;hp=fa9e7aa81d4bf0fbb6ee4b358c885549657025f7;hpb=015976d7d24ac1ae6deb474b9d70e5703f54f449;p=xml-template diff --git a/php5-swig/xml-template.swig b/php5-swig/xml-template.swig index fa9e7aa..e39053c 100644 --- a/php5-swig/xml-template.swig +++ b/php5-swig/xml-template.swig @@ -1,9 +1,22 @@ %module XML_Template_SWIG +%include + +struct XmlDocPtrWrapper { + ~XmlDocPtrWrapper(); +}; %{ +#include + #include "../c++11/xml-template.h" - + +struct XmlDocWrapper { + ~XmlDocWrapper() { xmlFreeDoc(ptr); } + xmlDocPtr ptr; +}; +typedef std::shared_ptr XmlDocPtrWrapper; + bool is_associative_array(HashTable *ht) { if (ht->nNumOfElements == 0) { @@ -58,6 +71,15 @@ Directive* convert_php_objects_to_directive(zval *obj) 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 new Replace { "" }; default: printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj)); break; @@ -66,12 +88,52 @@ Directive* convert_php_objects_to_directive(zval *obj) 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(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);