1 %module XML_Template_SWIG
3 struct XmlDocPtrWrapper {
11 #include "../c++11/xml-template.h"
13 struct XmlDocWrapper {
14 ~XmlDocWrapper() { xmlFreeDoc(ptr); }
17 typedef std::shared_ptr<XmlDocWrapper> XmlDocPtrWrapper;
19 bool is_associative_array(HashTable *ht)
21 if (ht->nNumOfElements == 0) {
24 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
25 if (!zend_hash_index_exists(ht, i)) {
32 Directive* convert_php_objects_to_directive(zval *obj)
34 switch (Z_TYPE_P(obj)) {
36 HashTable *ht = Z_ARRVAL_P(obj);
37 if (is_associative_array(ht)) {
38 std::unordered_map<std::string, Directive *> my_map;
39 for (zend_hash_internal_pointer_reset(ht); zend_hash_has_more_elements(ht) == SUCCESS; zend_hash_move_forward(ht)) {
42 zend_hash_get_current_key(ht, &str_key, &num_key, 0);
45 if (zend_hash_get_current_key_type(ht) == HASH_KEY_IS_STRING) {
49 sprintf(buf, "%lu", num_key);
54 zend_hash_get_current_data(ht, (void **)&data);
55 my_map.insert(make_pair(key, convert_php_objects_to_directive(*data)));
57 return new Substitute(my_map);
59 std::vector<Directive *> subdirectives;
60 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
62 zend_hash_index_find(ht, i, (void **)&data);
63 subdirectives.push_back(convert_php_objects_to_directive(*data));
65 return new Clone(subdirectives);
70 char *str = Z_STRVAL_P(obj);
71 return new Replace(str);
74 XmlDocPtrWrapper *doc;
75 if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_XmlDocPtrWrapper, 0) < 0 || doc == NULL) {
78 return new ReplaceInclude(xmlCopyDoc(doc->get()->ptr, 1));
83 printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
90 XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean)
92 xmlDocPtr ret = process_file(input_filename, root_directive, clean);
93 delete root_directive;
94 return XmlDocPtrWrapper(new XmlDocWrapper { ret });
97 void output_to_fd(XmlDocPtrWrapper doc, int fd)
99 xmlOutputBufferPtr buf = xmlOutputBufferCreateFd(fd, NULL);
100 xmlSaveFileTo(buf, doc->ptr, NULL);
105 %typemap(in) Directive* {
106 $1 = convert_php_objects_to_directive(*$input);
109 XmlDocPtrWrapper XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean);
110 void output_to_fd(XmlDocPtrWrapper doc, int fd);