basic support for builtins
[m6w6/ext-psi] / src / types / cpp_macro_call.c
index 0df9adbbbca8037add029de607dd616d88473215..e1277ca9640f9215e212d525a95422f38b2ed193 100644 (file)
 #include "cpp.h"
 #include "data.h"
 
-struct psi_cpp_macro_call *psi_cpp_macro_call_init(const char *name,
+struct psi_cpp_macro_call *psi_cpp_macro_call_init(zend_string *name,
                struct psi_plist *args)
 {
-       struct psi_cpp_macro_call *call = calloc(1, sizeof(*call));
-       call->name = strdup(name);
+       struct psi_cpp_macro_call *call = pecalloc(1, sizeof(*call), 1);
+       call->name = zend_string_copy(name);
        call->args = args;
        return call;
 }
@@ -40,14 +40,14 @@ struct psi_cpp_macro_call *psi_cpp_macro_call_init(const char *name,
 struct psi_cpp_macro_call *psi_cpp_macro_call_copy(
                struct psi_cpp_macro_call *call)
 {
-       struct psi_cpp_macro_call *copy = calloc(1, sizeof(*copy));
-       copy->name = strdup(call->name);
+       struct psi_cpp_macro_call *copy = pecalloc(1, sizeof(*copy), 1);
+       copy->name = zend_string_copy(call->name);
        if (call->token) {
                copy->token = psi_token_copy(call->token);
        }
        if (call->args) {
                copy->args = psi_plist_copy(call->args,
-                               (void (*)(void*)) psi_token_copy_ctor);
+                               (void (*)(void*)) psi_num_exp_copy_ctor);
        }
        return copy;
 }
@@ -59,14 +59,26 @@ void psi_cpp_macro_call_free(struct psi_cpp_macro_call **call_ptr)
 
                *call_ptr = NULL;
 
-               free(call->name);
+               zend_string_release(call->name);
                if (call->args) {
                        psi_plist_free(call->args);
                }
-               if (call->token) {
-                       free(call->token);
-               }
+               psi_token_free(&call->token);
                free(call);
        }
 }
 
+void psi_cpp_macro_call_dump(int fd, struct psi_cpp_macro_call *call)
+{
+       size_t i = 0;
+       struct psi_num_exp *num;
+
+       dprintf(fd, "%s(", call->name->val);
+       while (psi_plist_get(call->args, i++, &num)) {
+               if (i > 1) {
+                       dprintf(fd, ", ");
+               }
+               psi_num_exp_dump(fd, num);
+       }
+       dprintf(fd, ")");
+}