]> git.sesse.net Git - xml-template/blobdiff - php5-swig/xml-template.swig
Do weird dances to get php5-swig garbage collection going. Something tells me this...
[xml-template] / php5-swig / xml-template.swig
index 5a560cee6883bf4bce903964fe653ee2755a71c5..225f8bbd2e2d9a4c17df0d3937bef0721a15beff 100644 (file)
@@ -1,18 +1,28 @@
 %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 true;
        }
        for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
-               char buf[32];
-               sprintf(buf, "%u", i);
-               if (!zend_hash_exists(ht, buf, strlen(buf))) {
+               if (!zend_hash_index_exists(ht, i)) {
                        return true;
                }
        }
@@ -46,7 +56,13 @@ Directive* convert_php_objects_to_directive(zval *obj)
                        }
                        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;
        }
@@ -54,6 +70,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->get()->ptr, 1));
+       }
+       case IS_NULL:
+               return NULL;
        default:
                printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
                break;
@@ -62,12 +87,25 @@ Directive* convert_php_objects_to_directive(zval *obj)
        return NULL;
 }
 
+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 XmlDocPtrWrapper(new XmlDocWrapper { ret });
+}
+       
+void output_to_fd(XmlDocPtrWrapper doc, int fd)
+{
+       xmlOutputBufferPtr buf = xmlOutputBufferCreateFd(fd, NULL);
+       xmlSaveFileTo(buf, doc->ptr, NULL);
+}
+
 %}
 
 %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 char *input_filename, Directive *root_directive, bool clean);
+void output_to_fd(XmlDocPtrWrapper doc, int fd);