diff options
author | Marvin Borner | 2023-05-27 10:07:24 +0200 |
---|---|---|
committer | Marvin Borner | 2023-05-27 10:07:24 +0200 |
commit | abf68e0ad6c9f6d6cd14693894c609faca925e22 (patch) | |
tree | 0ac1a7f74f1543d8343ed346c577dbf1cda93bfe | |
parent | 337ec809393b709b36ca7b64d77489ae4bc1af1c (diff) |
Moved term logic
-rw-r--r-- | inc/parse.h | 22 | ||||
-rw-r--r-- | inc/term.h | 33 | ||||
-rw-r--r-- | src/map.c | 14 | ||||
-rw-r--r-- | src/parse.c | 31 | ||||
-rw-r--r-- | src/term.c | 40 |
5 files changed, 80 insertions, 60 deletions
diff --git a/inc/parse.h b/inc/parse.h index e79fb26..9dfa388 100644 --- a/inc/parse.h +++ b/inc/parse.h @@ -5,27 +5,7 @@ #define CALM_PARSE_H #include <lib/hash.h> - -typedef enum { INV, ABS, APP, VAR } term_type_t; - -struct term { - term_type_t type; - hash_t hash; - size_t refs; - size_t depth; - union { - struct { - struct term *term; - } abs; - struct { - struct term *lhs; - struct term *rhs; - } app; - struct { - int index; - } var; - } u; -}; +#include <term.h> struct term_handle { struct term *term; diff --git a/inc/term.h b/inc/term.h new file mode 100644 index 0000000..b64b106 --- /dev/null +++ b/inc/term.h @@ -0,0 +1,33 @@ +// Copyright (c) 2023, Marvin Borner <dev@marvinborner.de> +// SPDX-License-Identifier: MIT + +#ifndef CALM_TERM_H +#define CALM_TERM_H + +#include <lib/hash.h> + +typedef enum { INV, ABS, APP, VAR } term_type_t; + +struct term { + term_type_t type; + hash_t hash; + size_t refs; + size_t depth; + union { + struct { + struct term *term; + } abs; + struct { + struct term *lhs; + struct term *rhs; + } app; + struct { + int index; + } var; + } u; +}; + +struct term *term_new(term_type_t type, hash_t hash, size_t depth); +void term_refer(struct term *term, size_t depth); + +#endif @@ -9,20 +9,6 @@ static struct hashmap *all_terms; -static void deref_term(struct term *term) -{ - if (term->type == ABS) { - deref_term(term->u.abs.term); - } else if (term->type == APP) { - deref_term(term->u.app.lhs); - deref_term(term->u.app.rhs); - } - - // TODO: remove from hashmap? - if (--term->refs == 0) - free(term); -} - static void hashmap_free_term(void *item) { struct term *term = *(struct term **)item; diff --git a/src/parse.c b/src/parse.c index 5445aea..b10a698 100644 --- a/src/parse.c +++ b/src/parse.c @@ -10,25 +10,6 @@ static size_t max_depth = 0; -static struct term *new_term(term_type_t type, hash_t hash, size_t depth) -{ - struct term *term = malloc(sizeof(*term)); - if (!term) - fatal("out of memory!\n"); - term->type = type; - term->refs = 1; - term->hash = hash; - term->depth = depth; - return term; -} - -static void update_term(struct term *term, size_t depth) -{ - term->refs++; - if (depth < term->depth) // lower depths are more important - term->depth = depth; -} - static struct term_handle abs_blc(char **term, size_t depth) { term_type_t res_type = ABS; @@ -37,9 +18,9 @@ static struct term_handle abs_blc(char **term, size_t depth) struct term *res_term; if ((res_term = map_get(res))) { - update_term(res_term, depth); + term_refer(res_term, depth); } else { - res_term = new_term(res_type, res, depth); + res_term = term_new(res_type, res, depth); res_term->u.abs.term = inner.term; map_set(res_term, res); } @@ -58,9 +39,9 @@ static struct term_handle app_blc(char **term, size_t depth) struct term *res_term; if ((res_term = map_get(res))) { - update_term(res_term, depth); + term_refer(res_term, depth); } else { - res_term = new_term(res_type, res, depth); + res_term = term_new(res_type, res, depth); res_term->u.app.lhs = lhs.term; res_term->u.app.rhs = rhs.term; map_set(res_term, res); @@ -76,9 +57,9 @@ static struct term_handle var_blc(int index, size_t depth) struct term *res_term; if ((res_term = map_get(res))) { - update_term(res_term, depth); + term_refer(res_term, depth); } else { - res_term = new_term(res_type, res, depth); + res_term = term_new(res_type, res, depth); res_term->u.var.index = index; map_set(res_term, res); } diff --git a/src/term.c b/src/term.c new file mode 100644 index 0000000..b2202cc --- /dev/null +++ b/src/term.c @@ -0,0 +1,40 @@ +// Copyright (c) 2023, Marvin Borner <dev@marvinborner.de> +// SPDX-License-Identifier: MIT + +#include <stdlib.h> + +#include <log.h> +#include <term.h> + +struct term *term_new(term_type_t type, hash_t hash, size_t depth) +{ + struct term *term = malloc(sizeof(*term)); + if (!term) + fatal("out of memory!\n"); + term->type = type; + term->refs = 1; + term->hash = hash; + term->depth = depth; + return term; +} + +void term_refer(struct term *term, size_t depth) +{ + term->refs++; + if (depth < term->depth) // lower depths are more important + term->depth = depth; +} + +/* void deref_term(struct term *term) */ +/* { */ +/* if (term->type == ABS) { */ +/* deref_term(term->u.abs.term); */ +/* } else if (term->type == APP) { */ +/* deref_term(term->u.app.lhs); */ +/* deref_term(term->u.app.rhs); */ +/* } */ + +/* // TODO: remove from hashmap? */ +/* if (--term->refs == 0) */ +/* free(term); */ +/* } */ |