aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2023-05-27 10:07:24 +0200
committerMarvin Borner2023-05-27 10:07:24 +0200
commitabf68e0ad6c9f6d6cd14693894c609faca925e22 (patch)
tree0ac1a7f74f1543d8343ed346c577dbf1cda93bfe
parent337ec809393b709b36ca7b64d77489ae4bc1af1c (diff)
Moved term logic
-rw-r--r--inc/parse.h22
-rw-r--r--inc/term.h33
-rw-r--r--src/map.c14
-rw-r--r--src/parse.c31
-rw-r--r--src/term.c40
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
diff --git a/src/map.c b/src/map.c
index 1862c9c..327af8d 100644
--- a/src/map.c
+++ b/src/map.c
@@ -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); */
+/* } */