4ed53024093c25c1179a95055c558bc5e0acfd1a
[fur] / templates / environment.c
1 struct _EnvironmentNode;
2 typedef struct _EnvironmentNode _EnvironmentNode;
3 struct _EnvironmentNode {
4   const char* symbol;
5   Object value;
6   _EnvironmentNode* next;
7 };
8
9 struct Environment;
10 typedef struct Environment Environment;
11 struct Environment {
12   _EnvironmentNode* top;
13 };
14
15 struct Environment_get_Result;
16 typedef struct Environment_get_Result Environment_get_Result;
17 struct Environment_get_Result {
18   bool found;
19   Object result;
20 };
21
22 void Environment_initialize(Environment* self) {
23   self->top = NULL;
24 }
25
26 void Environment_deinitialize(Environment* self) {
27   while(self->top != NULL) {
28     _EnvironmentNode* en = self->top;
29     self->top = en->next;
30     Object_deinitialize(&(en->value));
31     free(en);
32   }
33 }
34
35 Environment* Environment_construct() {
36   Environment* result = malloc(sizeof(Environment));
37   Environment_initialize(result);
38   return result;
39 }
40
41 void Environment_destruct(Environment* self) {
42   Environment_deinitialize(self);
43   free(self);
44 }
45
46 Environment_get_Result Environment_get(Environment* self, char* symbol) {
47   for(_EnvironmentNode* current = self->top; current != NULL; current = current->next) {
48     if(strcmp(current->symbol, symbol) == 0) {
49       return (Environment_get_Result) { true, current->value };
50     }
51   }
52   return (Environment_get_Result) { false, BUILTIN_NIL };
53 }
54
55 void Environment_set(Environment* self, char* symbol, Object value) {
56   assert(!(Environment_get(self, symbol).found));
57
58   _EnvironmentNode* en = malloc(sizeof(_EnvironmentNode));
59   en->symbol = symbol;
60   en->value = value;
61   en->next = self->top;
62   self->top = en;
63 }