From f52050d53e698975d6598da86ddd99100ae70fdf Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sat, 4 Mar 2023 00:50:41 -0800 Subject: added while loop. simplified some hashtable code --- src/eval.c | 42 +++++++++++++++++++++++++++++------------- src/hashtable.c | 7 +------ 2 files changed, 30 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/eval.c b/src/eval.c index 8ffe965..b583fc6 100644 --- a/src/eval.c +++ b/src/eval.c @@ -107,23 +107,26 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { } else if (hash == get_hash("store")) { /* first arg is value, second arg is key */ - sym_t* v = eval(symbol->args[1], symbolScope); - char* k = symtos(v); - destroy_sym(v); - sym_t* value = eval(symbol->args[0], symbolScope); - pair_t p = init_pair(k, (void*)value); - free(k); - hashtable_add_pair(symbolScope->parent, p); + sym_t* k = eval(symbol->args[1], symbolScope); + char* key = symtos(k); + destroy_sym(k); + sym_t* v = eval(symbol->args[0], symbolScope); + pair_t p = init_pair(key, (void*)v); + int result = hashtable_add_pair(symbolScope->parent, p); + if (result == 0) { + printf("Hashtable full when attempting to store pair with key %s\n", key); + } + free(key); return init_sym_int(1); } else if (hash == get_hash("update")) { /* first arg is value, second arg is key */ - sym_t* v = eval(symbol->args[1], symbolScope); - char* k = symtos(v); - destroy_sym(v); - sym_t* value = symbol->args[0]; - pair_t p = init_pair(k, (void*)value); - free(k); + sym_t* k = eval(symbol->args[1], symbolScope); + char* key = symtos(k); + destroy_sym(k); + sym_t* v = eval(symbol->args[0], symbolScope); + pair_t p = init_pair(key, (void*)v); + free(key); hashtable_update_pair_recurse(symbolScope->parent, p); return init_sym_int(1); } @@ -196,6 +199,19 @@ sym_t* try_eval_internal(sym_t* symbol, hashtable_t* symbolScope) { } return init_sym_int(0); } + else if (hash == get_hash("while")) { + while (1) { + sym_t* c = eval(symbol->args[0], symbolScope); + if (symtoi(c) != 0) { + destroy_sym(c); + exec_all(symbol->args + 1, symbol->argCount - 1, symbolScope); + } + else { + destroy_sym(c); + return init_sym_int(1); + } + } + } else if (hash == get_hash("not")) { sym_t* v = eval(symbol->args[0], symbolScope); int b = symtoi(v); diff --git a/src/hashtable.c b/src/hashtable.c index 84676a9..bf46963 100644 --- a/src/hashtable.c +++ b/src/hashtable.c @@ -73,12 +73,7 @@ pair_t hashtable_get_pair(hashtable_t* hashtable, char* key) { unsigned int ha = hash + i; unsigned int ia = ha % hashtable->capacity; pair_t p = hashtable->pairs[ia]; - if (p.key != NULL && strcmp(p.key, key) == 0) { - return p; - } - else if (p.key == NULL) { - return init_pair(NULL, NULL); - } + return p; } return hashtable->pairs[(hash) % hashtable->capacity]; } -- cgit v1.3.1