]> git.sesse.net Git - xml-template/blobdiff - php5-swig/xml-template.swig
In php5-swig, handle NULLs as empty strings instead of crashing on them in substitute.
[xml-template] / php5-swig / xml-template.swig
index 2feceba72843fada4f12226cfd7acf6ff36361cf..e39053c0e1f8a7a958c83023f79cb79f51cf1b13 100644 (file)
@@ -1,9 +1,22 @@
 %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) {
@@ -58,8 +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 NULL;
+               return new Replace { "" };
        default:
                printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
                break;
@@ -68,19 +88,52 @@ Directive* convert_php_objects_to_directive(zval *obj)
        return NULL;
 }
 
-xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean)
+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 ret;
+       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 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 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);