diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-03-04 00:50:41 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-03-04 00:50:41 -0800 |
| commit | f52050d53e698975d6598da86ddd99100ae70fdf (patch) | |
| tree | 0eb68351e86d2e96a5ca95c6746ff2277f53f634 | |
| parent | 2b06f74c5a95e95d3c98137c9498cc3bc51e1968 (diff) | |
added while loop. simplified some hashtable code
| -rw-r--r-- | src/eval.c | 42 | ||||
| -rw-r--r-- | src/hashtable.c | 7 |
2 files changed, 30 insertions, 19 deletions
@@ -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]; } |
