Archived
1
0
Fork 0
This repository has been archived on 2023-11-10. You can view files and clone it, but cannot push or open issues or pull requests.
lispy/lval/operations.c

79 lines
1.9 KiB
C
Raw Normal View History

2018-06-07 19:10:53 -04:00
#include <string.h>
#include <stdlib.h>
#include "numbers.h"
#include "expressions.h"
#include "operations.h"
lval* lval_sym(char* s) {
lval* v = (lval *) malloc(sizeof(lval));
v->type = LVAL_SYM;
v->sym = (char *) malloc(strlen(s) + 1);
strcpy(v->sym, s);
return v;
}
lval* lval_read(mpc_ast_t* t) {
// If symbol or number, convert
if (strstr(t->tag, "long")) { return lval_read_long(t); }
if (strstr(t->tag, "double")) { return lval_read_double(t); }
if (strstr(t->tag, "symbol")) { return lval_sym(t->contents); }
// If root or sexpr, then create an empty list
lval* x = NULL;
if (strcmp(t->tag, ">") == 0 || strstr(t->tag, "sexpr")) {
x = lval_sexpr();
}
if (strstr(t->tag, "qexpr")) {
x = lval_qexpr();
}
// Fill the list with any valid expression contained
for (int i = 0; i < t->children_num; i++) {
if (strcmp(t->children[i]->contents, "(") == 0) { continue; }
if (strcmp(t->children[i]->contents, ")") == 0) { continue; }
if (strcmp(t->children[i]->contents, "{") == 0) { continue; }
if (strcmp(t->children[i]->contents, "}") == 0) { continue; }
if (strcmp(t->children[i]->tag, "regex") == 0) { continue; }
x = lval_add(x, lval_read(t->children[i]));
}
return x;
}
lval* lval_eval(lval* v) {
// Evauluate sexpressions
if (v->type == LVAL_SEXPR) { return lval_eval_sexpr(v); }
// All other lval types remail the same
return v;
}
void lval_del(lval* v) {
switch (v->type) {
case LVAL_LONG: break;
case LVAL_DOUBLE: break;
// Free the string data
case LVAL_ERR: free(v->err); break;
case LVAL_SYM: free(v->sym); break;
// Delete all elements inside SEXPR or QEXPR
case LVAL_QEXPR:
case LVAL_SEXPR:
for (int i = 0; i < v->count; i++) {
lval_del(v->cell[i]);
}
// Also free the memory allocated to contain the pointers
free(v->cell);
break;
}
// // Free the memory allocated for the lval struct itself
free(v);
}