#include #include #include "utils/Variables.h" void vInit(Variables* v) { v->capacity = 16; vReset(v); v->data = malloc(sizeof(Variable) * v->capacity); } void vDelete(Variables* v) { for(int i = 0; i < v->entries; i++) { free(v->data[i].name); } free(v->data); } static Variable* vSearchUntil(Variables* v, const char* s, int index) { for(int i = v->entries - 1; i >= index; i--) { if(strcmp(s, v->data[i].name) == 0) { return v->data + i; } } return NULL; } Variable* vSearch(Variables* v, const char* s) { return vSearchUntil(v, s, 0); } Variable* vSearchScope(Variables* v, const char* s) { return vSearchUntil(v, s, v->scope); } Variable* vAdd(Variables* v, const char* s, DataType type) { if(v->entries >= v->capacity) { v->capacity *= 2; v->data = realloc(v->data, sizeof(Variable) * v->capacity); } int index = v->entries++; v->data[index] = (Variable){strdup(s), type, v->address}; v->address += dtGetSize(type); if(v->address > v->maxAddress) { v->maxAddress = v->address; } return v->data + index; } void vReset(Variables* v) { v->entries = 0; v->address = 0; v->scope = 0; v->maxAddress = 0; } void vEnterScope(Variables* v, Scope* s) { s->address = v->address; s->entries = v->entries; s->scope = v->scope; v->scope = v->entries; } void vLeaveScope(Variables* v, Scope* s) { v->address = s->address; v->entries = s->entries; v->scope = s->scope; }