1 %module XML_Template_SWIG
5 #include "../c++11/xml-template.h"
7 bool is_associative_array(HashTable *ht)
9 if (ht->nNumOfElements == 0) {
12 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
13 if (!zend_hash_index_exists(ht, i)) {
20 Directive* convert_php_objects_to_directive(zval *obj)
22 switch (Z_TYPE_P(obj)) {
24 HashTable *ht = Z_ARRVAL_P(obj);
25 if (is_associative_array(ht)) {
26 std::unordered_map<std::string, Directive *> my_map;
27 for (zend_hash_internal_pointer_reset(ht); zend_hash_has_more_elements(ht) == SUCCESS; zend_hash_move_forward(ht)) {
30 zend_hash_get_current_key(ht, &str_key, &num_key, 0);
33 if (zend_hash_get_current_key_type(ht) == HASH_KEY_IS_STRING) {
37 sprintf(buf, "%lu", num_key);
42 zend_hash_get_current_data(ht, (void **)&data);
43 my_map.insert(make_pair(key, convert_php_objects_to_directive(*data)));
45 return new Substitute(my_map);
47 std::vector<Directive *> subdirectives;
48 for (unsigned i = 0; i < ht->nNumOfElements; ++i) {
50 zend_hash_index_find(ht, i, (void **)&data);
51 subdirectives.push_back(convert_php_objects_to_directive(*data));
53 return new Clone(subdirectives);
58 char *str = Z_STRVAL_P(obj);
59 return new Replace(str);
64 printf("WARNING: Unknown type %d!\n", Z_TYPE_P(obj));
71 xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean)
73 xmlDocPtr ret = process_file(input_filename, root_directive, clean);
74 delete root_directive;
80 %typemap(in) Directive* {
81 $1 = convert_php_objects_to_directive(*$input);
84 xmlDocPtr XML_Template_process_file(const char *input_filename, Directive *root_directive, bool clean);
85 void output_to_fd_and_free(xmlDocPtr doc, int fd);