1 %module XML_Template_SWIG
2 %include <std_string.i>
4 struct XmlDocPtrWrapper {
12 #include "../c++11/xml-template.h"
14 struct XmlDocWrapper {
15 ~XmlDocWrapper() { xmlFreeDoc(ptr); }
18 typedef std::shared_ptr<XmlDocWrapper> XmlDocPtrWrapper;
20 bool is_associative_array(HashTable *ht)
22 if (ht->nNumOfElements == 0) {
25 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
26 if (!zend_hash_index_exists(ht, i)) {
33 Directive* convert_php_objects_to_directive(zval *obj)
35 switch (Z_TYPE_P(obj)) {
37 HashTable *ht = Z_ARRVAL_P(obj);
38 if (is_associative_array(ht)) {
39 std::unordered_map<std::string, Directive *> my_map;
40 for (zend_hash_internal_pointer_reset(ht); zend_hash_has_more_elements(ht) == SUCCESS; zend_hash_move_forward(ht)) {
43 zend_hash_get_current_key(ht, &str_key, &num_key, 0);
46 if (zend_hash_get_current_key_type(ht) == HASH_KEY_IS_STRING) {
50 sprintf(buf, "%lu", num_key);
55 zend_hash_get_current_data(ht, (void **)&data);
56 my_map.insert(make_pair(key, convert_php_objects_to_directive(*data)));
58 return new Substitute(my_map);
60 std::vector<Directive *> subdirectives;
61 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
63 zend_hash_index_find(ht, i, (void **)&data);
64 subdirectives.push_back(convert_php_objects_to_directive(*data));
66 return new Clone(subdirectives);
71 char *str = Z_STRVAL_P(obj);
72 return new Replace(str);
75 XmlDocPtrWrapper *doc;
76 if (SWIG_ConvertPtr(obj, (void **)&doc, SWIGTYPE_p_XmlDocPtrWrapper, 0) < 0 || doc == NULL) {
79 return new ReplaceInclude(xmlCopyDoc((*doc)->ptr, 1));
84 printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
91 XmlDocPtrWrapper XML_Template_process_file(const std::string &input_filename, Directive *root_directive, bool clean)
93 xmlDocPtr ret = process_file(input_filename, root_directive, clean);
94 delete root_directive;
95 return XmlDocPtrWrapper(new XmlDocWrapper { ret });
98 XmlDocPtrWrapper XML_Template_process(XmlDocPtrWrapper doc, Directive *root_directive, bool clean)
100 xmlDocPtr new_doc = xmlCopyDoc(doc->ptr, 1);
101 root_directive->process(xmlDocGetRootElement(new_doc), clean);
102 delete root_directive;
103 return XmlDocPtrWrapper(new XmlDocWrapper { new_doc });
108 int write_to_string(void *context, const char *buffer, int len)
110 std::string *str = reinterpret_cast<std::string *>(context);
111 str->append(buffer, len);
115 int close_string(void *context)
122 std::string XML_Template_convert_doc_to_string(XmlDocPtrWrapper doc)
125 xmlOutputBufferPtr buf = xmlOutputBufferCreateIO(write_to_string, close_string, &ret, NULL);
126 xmlSaveFileTo(buf, doc->ptr, NULL);
132 %typemap(in) Directive* {
133 $1 = convert_php_objects_to_directive(*$input);
136 XmlDocPtrWrapper XML_Template_process_file(const std::string &input_filename, Directive *root_directive, bool clean);
137 XmlDocPtrWrapper XML_Template_process(XmlDocPtrWrapper doc, Directive *root_directive, bool clean);
138 std::string XML_Template_convert_doc_to_string(XmlDocPtrWrapper doc);