summaryrefslogtreecommitdiff
path: root/src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.c')
-rw-r--r--src/parse.c35
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(" ");