fix gdbinit; postprocessing macros
[m6w6/ext-psi] / src / types / num_exp.c
index 4b8846a6312cd56b00727755f57f87c066a4e5e1..9388ad3dcc2d12d4365cf9575951c0bb5b94ce79 100644 (file)
@@ -36,7 +36,7 @@ struct psi_num_exp *psi_num_exp_init_ternary(token_t op,
                struct psi_num_exp *cond, struct psi_num_exp *truthy,
                struct psi_num_exp *falsy)
 {
-       struct psi_num_exp *exp = calloc(1, sizeof(*exp));
+       struct psi_num_exp *exp = pecalloc(1, sizeof(*exp), 1);
 
        exp->op = op;
        exp->data.t.cond = cond;
@@ -49,7 +49,7 @@ struct psi_num_exp *psi_num_exp_init_ternary(token_t op,
 struct psi_num_exp *psi_num_exp_init_binary(token_t op,
                struct psi_num_exp *lhs, struct psi_num_exp *rhs)
 {
-       struct psi_num_exp *exp = calloc(1, sizeof(*exp));
+       struct psi_num_exp *exp = pecalloc(1, sizeof(*exp), 1);
 
        exp->op = op;
        exp->data.b.lhs = lhs;
@@ -61,7 +61,7 @@ struct psi_num_exp *psi_num_exp_init_binary(token_t op,
 struct psi_num_exp *psi_num_exp_init_unary(token_t op,
                struct psi_num_exp *u)
 {
-       struct psi_num_exp *exp = calloc(1, sizeof(*exp));
+       struct psi_num_exp *exp = pecalloc(1, sizeof(*exp), 1);
 
        exp->op = op;
        exp->data.u = u;
@@ -71,7 +71,7 @@ struct psi_num_exp *psi_num_exp_init_unary(token_t op,
 
 struct psi_num_exp *psi_num_exp_init_num(struct psi_number *n)
 {
-       struct psi_num_exp *exp = calloc(1, sizeof(*exp));
+       struct psi_num_exp *exp = pecalloc(1, sizeof(*exp), 1);
 
        exp->op = PSI_T_NUMBER;
        exp->data.n = n;
@@ -82,7 +82,7 @@ struct psi_num_exp *psi_num_exp_init_num(struct psi_number *n)
 struct psi_num_exp *psi_num_exp_init_cast(struct psi_decl_type *typ,
                struct psi_num_exp *num)
 {
-       struct psi_num_exp *exp = calloc(1, sizeof(*exp));
+       struct psi_num_exp *exp = pecalloc(1, sizeof(*exp), 1);
 
        exp->op = PSI_T_CAST;
        exp->data.c.typ = typ;
@@ -99,7 +99,7 @@ struct psi_num_exp *psi_num_exp_copy(struct psi_num_exp *exp)
                return NULL;
        }
 
-       cpy = malloc(sizeof(*cpy));
+       cpy = pemalloc(sizeof(*cpy), 1);
        *cpy = *exp;
 
        switch (exp->op) {
@@ -159,6 +159,11 @@ struct psi_num_exp *psi_num_exp_copy(struct psi_num_exp *exp)
        return cpy;
 }
 
+void psi_num_exp_copy_ctor(struct psi_num_exp **exp_ptr)
+{
+       *exp_ptr = psi_num_exp_copy(*exp_ptr);
+}
+
 void psi_num_exp_free(struct psi_num_exp **c_ptr)
 {
        if (*c_ptr) {
@@ -216,9 +221,7 @@ void psi_num_exp_free(struct psi_num_exp **c_ptr)
                        assert(0);
                }
 
-               if (c->token) {
-                       free(c->token);
-               }
+               psi_token_free(&c->token);
 
                free(c);
        }
@@ -291,6 +294,7 @@ struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
                struct psi_plist *list)
 {
        struct psi_token *ntoken;
+
        if (!list) {
                list = psi_plist_init((psi_plist_dtor) psi_token_free);
        }
@@ -306,7 +310,7 @@ struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
                list = psi_plist_add(list, &ntoken);
                ntoken = psi_token_copy(exp->data.c.typ->token);
                list = psi_plist_add(list, &ntoken);
-               ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+               ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
                list = psi_plist_add(list, &ntoken);
                break;
 
@@ -323,7 +327,7 @@ struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
                list = psi_plist_add(list, &ntoken);
                list = psi_num_exp_tokens(exp->data.u, list);
                psi_plist_top(list, &ntoken);
-               ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+               ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
                list = psi_plist_add(list, &ntoken);
                break;
 
@@ -363,7 +367,7 @@ struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
                list = psi_plist_add(list, &ntoken);
                list = psi_num_exp_tokens(exp->data.t.truthy, list);
                psi_plist_top(list, &ntoken);
-               ntoken = psi_token_init(PSI_T_COLON, ":", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+               ntoken = psi_token_init(PSI_T_COLON, ":", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
                list = psi_plist_add(list, &ntoken);
                list = psi_plist_add(list, &ntoken);
                list = psi_num_exp_tokens(exp->data.t.falsy, list);
@@ -376,30 +380,30 @@ struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
        return list;
 }
 
-void psi_num_exp_dump(int fd, struct psi_num_exp *exp)
+void psi_num_exp_dump(struct psi_dump *dump, struct psi_num_exp *exp)
 {
        switch (exp->op) {
        case PSI_T_NUMBER:
-               psi_number_dump(fd, exp->data.n);
+               psi_number_dump(dump, exp->data.n);
                break;
 
        case PSI_T_CAST:
-               dprintf(fd, "(");
-               psi_decl_type_dump(1, exp->data.c.typ, 0);
-               dprintf(fd, ")");
+               PSI_DUMP(dump, "(");
+               psi_decl_type_dump(dump, exp->data.c.typ, 0);
+               PSI_DUMP(dump, ")");
                break;
 
        case PSI_T_NOT:
        case PSI_T_TILDE:
        unary:
-               dprintf(fd, "%s", psi_num_exp_op_tok(exp->op));
-               psi_num_exp_dump(fd, exp->data.u);
+               PSI_DUMP(dump, "%s", psi_num_exp_op_tok(exp->op));
+               psi_num_exp_dump(dump, exp->data.u);
                break;
 
        case PSI_T_LPAREN:
-               dprintf(fd, "(");
-               psi_num_exp_dump(fd, exp->data.u);
-               dprintf(fd, ")");
+               PSI_DUMP(dump, "(");
+               psi_num_exp_dump(dump, exp->data.u);
+               PSI_DUMP(dump, ")");
                break;
 
        case PSI_T_PLUS:
@@ -425,17 +429,17 @@ void psi_num_exp_dump(int fd, struct psi_num_exp *exp)
        case PSI_T_CMP_GE:
        case PSI_T_RCHEVR:
        case PSI_T_LCHEVR:
-               psi_num_exp_dump(fd, exp->data.b.lhs);
-               dprintf(fd, " %s ", psi_num_exp_op_tok(exp->op));
-               psi_num_exp_dump(fd, exp->data.b.rhs);
+               psi_num_exp_dump(dump, exp->data.b.lhs);
+               PSI_DUMP(dump, " %s ", psi_num_exp_op_tok(exp->op));
+               psi_num_exp_dump(dump, exp->data.b.rhs);
                break;
 
        case PSI_T_IIF:
-               psi_num_exp_dump(fd, exp->data.t.cond);
-               dprintf(fd, " ? ");
-               psi_num_exp_dump(fd, exp->data.t.truthy);
-               dprintf(fd, " : ");
-               psi_num_exp_dump(fd, exp->data.t.falsy);
+               psi_num_exp_dump(dump, exp->data.t.cond);
+               PSI_DUMP(dump, " ? ");
+               psi_num_exp_dump(dump, exp->data.t.truthy);
+               PSI_DUMP(dump, " : ");
+               psi_num_exp_dump(dump, exp->data.t.falsy);
                break;
 
        default:
@@ -628,7 +632,7 @@ static inline void psi_num_exp_verify_result(token_t t, impl_val *res, struct ps
 }
 
 static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **output_ptr,
-               struct psi_plist **input_ptr, struct psi_call_frame *frame, HashTable *defs)
+               struct psi_plist **input_ptr, struct psi_call_frame *frame, struct psi_cpp *cpp)
 {
        struct psi_plist *output = *output_ptr, *input = *input_ptr;
        struct element {
@@ -642,14 +646,14 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
 
        switch (exp->op) {
        case PSI_T_NUMBER:
-               entry.type = psi_number_eval(exp->data.n, &entry.data.value, frame, defs, exp);
+               entry.type = psi_number_eval(exp->data.n, &entry.data.value, frame, cpp, exp);
                output = psi_plist_add(output, &entry);
                break;
 
        case PSI_T_LPAREN:
                entry.type = exp->op;
                input = psi_plist_add(input, &entry);
-               psi_num_exp_reduce(exp->data.u, &output, &input, frame, defs);
+               psi_num_exp_reduce(exp->data.u, &output, &input, frame, cpp);
                while (psi_plist_pop(input, &entry)) {
                        if (entry.type == PSI_T_LPAREN) {
                                break;
@@ -672,7 +676,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                entry.type = exp->op;
                entry.data.cast = exp->data.c.typ;
                input = psi_plist_add(input, &entry);
-               psi_num_exp_reduce(exp->data.c.num, &output, &input, frame, defs);
+               psi_num_exp_reduce(exp->data.c.num, &output, &input, frame, cpp);
                break;
 
        case PSI_T_NOT:
@@ -689,19 +693,19 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                entry.type = exp->op;
                entry.data.calc = exp->calc;
                input = psi_plist_add(input, &entry);
-               psi_num_exp_reduce(exp->data.u, &output, &input, frame, defs);
+               psi_num_exp_reduce(exp->data.u, &output, &input, frame, cpp);
                break;
 
        case PSI_T_IIF:
                {
                        impl_val cond_val = {0};
-                       token_t cond_typ = psi_num_exp_exec(exp->data.t.cond, &cond_val, frame, defs);
+                       token_t cond_typ = psi_num_exp_exec(exp->data.t.cond, &cond_val, frame, cpp);
 
                        psi_calc_bool_not(cond_typ, &cond_val, 0, NULL, &cond_val);
                        if (cond_val.u8) {
-                               psi_num_exp_reduce(exp->data.t.falsy, &output, &input, frame, defs);
+                               psi_num_exp_reduce(exp->data.t.falsy, &output, &input, frame, cpp);
                        } else {
-                               psi_num_exp_reduce(exp->data.t.truthy, &output, &input, frame, defs);
+                               psi_num_exp_reduce(exp->data.t.truthy, &output, &input, frame, cpp);
                        }
                }
                break;
@@ -710,7 +714,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
        case PSI_T_PLUS:
                /* unary */
                if (!exp->data.b.rhs) {
-                       entry.type = psi_num_exp_exec(exp->data.b.lhs, &entry.data.value, frame, defs);
+                       entry.type = psi_num_exp_exec(exp->data.b.lhs, &entry.data.value, frame, cpp);
 
                        if (exp->calc) {
                                entry.type = exp->calc(entry.type, &entry.data.value, 0, NULL, &entry.data.value);
@@ -720,7 +724,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                }
                /* no break */
        default:
-               psi_num_exp_reduce(exp->data.b.lhs, &output, &input, frame, defs);
+               psi_num_exp_reduce(exp->data.b.lhs, &output, &input, frame, cpp);
                while (psi_plist_top(input, &entry)) {
                        /* bail out if exp->op > entry.type */
                        if (psi_calc_oper(exp->op, entry.type) == -1) {
@@ -733,7 +737,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
                entry.type = exp->op;
                entry.data.calc = exp->calc;
                input = psi_plist_add(input, &entry);
-               psi_num_exp_reduce(exp->data.b.rhs, &output, &input, frame, defs);
+               psi_num_exp_reduce(exp->data.b.rhs, &output, &input, frame, cpp);
                break;
        }
 
@@ -742,7 +746,7 @@ static void psi_num_exp_reduce(struct psi_num_exp *exp, struct psi_plist **outpu
 }
 
 token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
-               struct psi_call_frame *frame, HashTable *defs)
+               struct psi_call_frame *frame, struct psi_cpp *cpp)
 {
        struct psi_plist *output, *input;
        struct element {
@@ -757,7 +761,7 @@ token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
        output = psi_plist_init_ex(sizeof(entry), NULL);
        input = psi_plist_init_ex(sizeof(entry), NULL);
 
-       psi_num_exp_reduce(exp, &output, &input, frame, defs);
+       psi_num_exp_reduce(exp, &output, &input, frame, cpp);
 
        while (psi_plist_pop(input, &entry)) {
                if (frame) PSI_DEBUG_PRINT(frame->context, " %s", psi_num_exp_op_tok(entry.type));