summaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-02-17 16:17:44 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-02-17 16:17:44 -0800
commit4c7d2719a27d3c2fc81cb9264fac1332bfb8848e (patch)
tree7614bcede5be2246be6b67d390f437a31aa537ca /src/parse.c
parent5bb8f72816e7bbcffdc5053f9e7dd3d819fcd840 (diff)
added more frees
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c49
1 files changed, 38 insertions, 11 deletions
diff --git a/src/parse.c b/src/parse.c
index b84a3f6..4aafc32 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -13,13 +13,20 @@ sym_t* init_sym(prov_t province, litType_t litType, void* name) {
symbol->argCount = 0;
return symbol;
}
+sym_t* init_sym_key(char* value) {
+ char* vp = malloc((strlen(value) + 1) * sizeof(char));
+ strcpy(vp, value);
+ return init_sym(KEY_REF, NO_TYPE, vp);
+}
sym_t* init_sym_int(int value) {
int* vp = malloc(sizeof(int));
*vp = value;
return init_sym(LITERAL, INT, vp);
}
sym_t* init_sym_str(char* value) {
- return init_sym(LITERAL, STRING, value);
+ char* vp = malloc((strlen(value) + 1) * sizeof(char));
+ strcpy(vp, value);
+ return init_sym(LITERAL, STRING, vp);
}
void destroy_sym(sym_t* symbol) {
free(symbol->name);
@@ -28,6 +35,20 @@ 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);
+ }
+}
int symtoi(sym_t* symbol) {
return *((int*)symbol->name);
}
@@ -37,7 +58,6 @@ float symtof(sym_t* symbol) {
char* symtos(sym_t* symbol) {
return (char*)symbol->name;
}
-
void symbol_add_arg(sym_t* symbol, sym_t* arg) {
symbol->argCount += 1;
if (symbol->argCount == 1) {
@@ -92,7 +112,6 @@ symset_t* parse_symbols(char** str) {
else {
int v = atoi(symbolName);
symbol = init_sym_int(v);
- free(symbolName);
}
symset_add_symbol(symbolSet, symbol);
break;
@@ -102,13 +121,10 @@ symset_t* parse_symbols(char** str) {
symbolName[i] = '\0';
sym_t* symbol;
if (i > 1) {
- symbol = init_sym(KEY_REF, NO_TYPE, symbolName);
+ symbol = init_sym_key(symbolName);
}
else {
- free(symbolName);
- char* memName = malloc(5 * sizeof(char));
- strcpy(memName, "root");
- symbol = init_sym(KEY_REF, NO_TYPE, memName);
+ symbol = init_sym_key("root");
}
symset_t* symbols = parse_symbols(str);
for (int s = 0; s < symbols->count; s++) {
@@ -120,20 +136,31 @@ symset_t* parse_symbols(char** str) {
i++;
(*str)++;
}
+ free(symbolName);
}
}
sym_t* parse_symbol_final(char* str) {
char** strp = malloc(sizeof(char**));
*strp = str;
symset_t* finalSymset = parse_symbols(strp);
- char* memName = malloc(5 * sizeof(char));
- strcpy(memName, "root");
- sym_t* root = init_sym(KEY_REF, NO_TYPE, memName);
+ free(strp);
+ sym_t* root = init_sym_key("root");
for (int s = 0; s < finalSymset->count; s++) {
symbol_add_arg(root, finalSymset->symbols[s]);
}
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(" ");