aboutsummaryrefslogtreecommitdiff
path: root/src_c/mem.h
diff options
context:
space:
mode:
Diffstat (limited to 'src_c/mem.h')
-rw-r--r--src_c/mem.h189
1 files changed, 189 insertions, 0 deletions
diff --git a/src_c/mem.h b/src_c/mem.h
new file mode 100644
index 0000000..7d72ba9
--- /dev/null
+++ b/src_c/mem.h
@@ -0,0 +1,189 @@
+#ifndef LISP16_MEM_H
+#define LISP16_MEM_H
+
+#include "cell.h"
+#include "status.h"
+
+
+typedef struct {
+ lsp_addr_t nil;
+ lsp_addr_t zero;
+ lsp_addr_t one;
+ lsp_addr_t quote;
+ lsp_addr_t quasiquote;
+ lsp_addr_t unquote;
+ lsp_addr_t unquote_splicing;
+
+ // internal
+ lsp_uint16_t size;
+ lsp_addr_t last_addr;
+ lsp_addr_t root;
+ lsp_cell_t cells[];
+} lsp_mem_t;
+
+
+lsp_status_t lsp_mem_init(lsp_mem_t *m, lsp_uint16_t size);
+lsp_status_t lsp_mem_inc_ref(lsp_mem_t *m, lsp_addr_t addr);
+void lsp_mem_dec_ref(lsp_mem_t *m, lsp_addr_t addr);
+
+lsp_status_t lsp_mem_create_number(lsp_mem_t *m, lsp_int32_t value,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_pair(lsp_mem_t *m, lsp_addr_t first,
+ lsp_addr_t second, lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_string(lsp_mem_t *m, lsp_uint16_t data_len,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_symbol_from_string(lsp_mem_t *m, lsp_addr_t str,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_symbol_from_char(lsp_mem_t *m, char *name,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_builtin_function(lsp_mem_t *m, lsp_uint16_t index,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_builtin_syntax(lsp_mem_t *m, lsp_uint16_t index,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_function(lsp_mem_t *m, lsp_addr_t parent_ctx,
+ lsp_addr_t args, lsp_addr_t body,
+ lsp_addr_t *addr);
+lsp_status_t lsp_mem_create_syntax(lsp_mem_t *m, lsp_addr_t parent_ctx,
+ lsp_addr_t args, lsp_addr_t body,
+ lsp_addr_t *addr);
+
+lsp_bool_t lsp_mem_eq(lsp_mem_t *m, lsp_addr_t a1, lsp_addr_t a2);
+lsp_bool_t lsp_mem_equal(lsp_mem_t *m, lsp_addr_t a1, lsp_addr_t a2);
+
+
+static inline lsp_bool_t lsp_mem_is_number(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_number(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_pair(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_pair(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_string(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_string(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_symbol(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_symbol(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_builtin_function(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_is_builtin_function(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_builtin_syntax(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_is_builtin_syntax(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_function(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_function(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_syntax(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_syntax(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_string_or_symbol(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_is_string_or_symbol(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_builtin(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_is_builtin(m->cells + addr);
+}
+
+static inline lsp_bool_t lsp_mem_is_function_or_syntax(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_is_function_or_syntax(m->cells + addr);
+}
+
+
+static inline lsp_int32_t lsp_mem_get_number(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_get_number(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_pair_first(lsp_mem_t *m, lsp_addr_t addr) {
+ return lsp_cell_get_pair_first(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_pair_second(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_pair_second(m->cells + addr);
+}
+
+static inline lsp_uint16_t lsp_mem_get_string_len(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_string_len(m->cells + addr);
+}
+
+static inline lsp_uint8_t lsp_mem_get_string_data(lsp_mem_t *m, lsp_addr_t addr,
+ lsp_uint16_t i) {
+ return lsp_cell_get_string_data(m->cells + addr, i);
+}
+
+static inline lsp_uint16_t lsp_mem_get_symbol_len(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_symbol_len(m->cells + addr);
+}
+
+static inline lsp_uint8_t lsp_mem_get_symbol_name(lsp_mem_t *m, lsp_addr_t addr,
+ lsp_uint16_t i) {
+ return lsp_cell_get_symbol_name(m->cells + addr, i);
+}
+
+static inline lsp_uint16_t lsp_mem_get_builtin_index(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_builtin_index(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_function_parent_ctx(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_function_parent_ctx(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_function_args(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_function_args(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_function_body(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_function_body(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_syntax_parent_ctx(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_syntax_parent_ctx(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_syntax_args(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_syntax_args(m->cells + addr);
+}
+
+static inline lsp_addr_t lsp_mem_get_syntax_body(lsp_mem_t *m,
+ lsp_addr_t addr) {
+ return lsp_cell_get_syntax_body(m->cells + addr);
+}
+
+
+static inline void lsp_mem_set_pair_first(lsp_mem_t *m, lsp_addr_t addr,
+ lsp_addr_t first) {
+ lsp_cell_set_pair(m->cells + addr, first,
+ lsp_cell_get_pair_second(m->cells + addr));
+}
+
+static inline void lsp_mem_set_pair_second(lsp_mem_t *m, lsp_addr_t addr,
+ lsp_addr_t second) {
+ lsp_cell_set_pair(m->cells + addr, lsp_cell_get_pair_first(m->cells + addr),
+ second);
+}
+
+static inline void lsp_mem_set_string_data(lsp_mem_t *m, lsp_addr_t addr,
+ lsp_uint16_t i, lsp_uint8_t data_i) {
+ lsp_cell_set_string_data(m->cells + addr, i, data_i);
+}
+
+#endif