From 21a0a4edab8bc05cb6fdc0ab91f2c1179b56dcc9 Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sun, 7 May 2023 12:58:11 -0400 Subject: [PATCH] add clone lispenv function --- src/mumble.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/mumble.c b/src/mumble.c index 45be3b5..e58d3a4 100644 --- a/src/mumble.c +++ b/src/mumble.c @@ -358,6 +358,23 @@ void insert_in_lispenv(char* sym, lispval* v, lispenv* env) } } +lispenv* clone_lispenv(lispenv* origin_env){ + lispenv* new_env = malloc(sizeof(lispenv)); + new_env->count = origin_env->count; + new_env->parent = origin_env->parent; + + new_env->syms = malloc(sizeof(char*) * origin_env->count); + new_env->vals = malloc(sizeof(lispval*) * origin_env->count); + + for(int i=0;icount; i++){ + new_env->syms[i] = malloc(strlen(origin_env->syms[i]) + 1); + strcpy(new_env->syms[i], origin_env->syms[i]); + new_env->vals[i] = clone_lispval(origin_env->vals[i]); + } + return new_env; +} + + // Read ast into a lispval object lispval* lispval_append_child(lispval* parent, lispval* child) { @@ -538,7 +555,7 @@ void print_ast(mpc_ast_t* ast, int indent_level) indent = NULL; } -// Lispval helpers +// Cloners lispval* clone_lispval(lispval* old) { lispval* new;