X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=templates%2Fenvironment.c;fp=templates%2Fenvironment.c;h=4ed53024093c25c1179a95055c558bc5e0acfd1a;hp=0000000000000000000000000000000000000000;hb=b7a244b6319f5c770582283097f6184e5a6ec192;hpb=c45c61444aae3df328e4dc84acf7e31e58a1f64e diff --git a/templates/environment.c b/templates/environment.c new file mode 100644 index 0000000..4ed5302 --- /dev/null +++ b/templates/environment.c @@ -0,0 +1,63 @@ +struct _EnvironmentNode; +typedef struct _EnvironmentNode _EnvironmentNode; +struct _EnvironmentNode { + const char* symbol; + Object value; + _EnvironmentNode* next; +}; + +struct Environment; +typedef struct Environment Environment; +struct Environment { + _EnvironmentNode* top; +}; + +struct Environment_get_Result; +typedef struct Environment_get_Result Environment_get_Result; +struct Environment_get_Result { + bool found; + Object result; +}; + +void Environment_initialize(Environment* self) { + self->top = NULL; +} + +void Environment_deinitialize(Environment* self) { + while(self->top != NULL) { + _EnvironmentNode* en = self->top; + self->top = en->next; + Object_deinitialize(&(en->value)); + free(en); + } +} + +Environment* Environment_construct() { + Environment* result = malloc(sizeof(Environment)); + Environment_initialize(result); + return result; +} + +void Environment_destruct(Environment* self) { + Environment_deinitialize(self); + free(self); +} + +Environment_get_Result Environment_get(Environment* self, char* symbol) { + for(_EnvironmentNode* current = self->top; current != NULL; current = current->next) { + if(strcmp(current->symbol, symbol) == 0) { + return (Environment_get_Result) { true, current->value }; + } + } + return (Environment_get_Result) { false, BUILTIN_NIL }; +} + +void Environment_set(Environment* self, char* symbol, Object value) { + assert(!(Environment_get(self, symbol).found)); + + _EnvironmentNode* en = malloc(sizeof(_EnvironmentNode)); + en->symbol = symbol; + en->value = value; + en->next = self->top; + self->top = en; +}