summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-03-04 00:50:41 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-03-04 00:50:41 -0800
commitf52050d53e698975d6598da86ddd99100ae70fdf (patch)
tree0eb68351e86d2e96a5ca95c6746ff2277f53f634 /src
parent2b06f74c5a95e95d3c98137c9498cc3bc51e1968 (diff)
added while loop. simplified some hashtable code
Diffstat (limited to 'src')
-rw-r--r--src/eval.c42
-rw-r--r--src/hashtable.c7
2 files changed, 30 insertions, 19 deletions
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];
}