diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-02-17 19:47:10 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-02-17 19:47:10 -0800 |
| commit | dab73c05a0c4529bd26410beae0868ec2ff570c2 (patch) | |
| tree | b9a78a184c1369c53b3788df523bed3b50638fda /src/parse.c | |
| parent | 7703117d5cf08fd77e76c656d38436545b3406ea (diff) | |
fixed all the memory leaks
Diffstat (limited to 'src/parse.c')
| -rw-r--r-- | src/parse.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/src/parse.c b/src/parse.c index 4aafc32..0144f44 100644 --- a/src/parse.c +++ b/src/parse.c @@ -36,18 +36,10 @@ void destroy_sym(sym_t* symbol) { free(symbol); } void destroy_sym_tree(sym_t* origin) { - if (origin->province == KEY_REF) { - /* doesn't follow user-defined refs */ - if (is_internal((char*)origin->name)) { - for (int i = 0; i < origin->argCount; i++) { - destroy_sym_tree(origin->args[i]); - } - destroy_sym(origin); - } - } - else if (origin->province == LITERAL) { - destroy_sym(origin); + for (int i = 0; i < origin->argCount; i++) { + destroy_sym_tree(origin->args[i]); } + destroy_sym(origin); } int symtoi(sym_t* symbol) { return *((int*)symbol->name); @@ -56,7 +48,9 @@ float symtof(sym_t* symbol) { return *((float*)symbol->name); } char* symtos(sym_t* symbol) { - return (char*)symbol->name; + char* vp = malloc((strlen(symbol->name) + 1) * sizeof(char)); + strcpy(vp, symbol->name); + return vp; } void symbol_add_arg(sym_t* symbol, sym_t* arg) { symbol->argCount += 1; @@ -130,6 +124,10 @@ symset_t* parse_symbols(char** str) { for (int s = 0; s < symbols->count; s++) { symbol_add_arg(symbol, symbols->symbols[s]); } + if (symbols->count > 0) { + free(symbols->symbols); + } + free(symbols); symset_add_symbol(symbolSet, symbol); break; } @@ -148,19 +146,10 @@ sym_t* parse_symbol_final(char* str) { for (int s = 0; s < finalSymset->count; s++) { symbol_add_arg(root, finalSymset->symbols[s]); } + free(finalSymset->symbols); + free(finalSymset); return root; } -/* TODO: improve this system */ -int is_internal(char* name) { - unsigned int hash = get_hash(name); - if (hash == get_hash("root") || hash == get_hash("store") - || hash == get_hash("eq") || hash == get_hash("if") - || hash == get_hash("not") || hash == get_hash("sum") - || hash == get_hash("print")) { - return 1; - } - return 0; -} void write_symbol_visual(sym_t* symbol, int offset) { for (int o = 0; o < offset; o++) { printf(" "); |
