#include "locals.h" void locals_init(locals_t* locals) { assert(locals); locals->cap = 0; locals->size = 0; locals->data = NULL; } locals_t* locals_new_clone(locals_t* locals) { assert(locals); locals_t* clone = malloc(sizeof(locals_t)); locals_init(clone); for (size_t i=0; isize; i++) { locals_store(clone, locals->data[i]->id, locals->data[i]->addr); } return clone; } void locals_free(locals_t* locals) { assert(locals); for (size_t i=0; isize; i++) { free(locals->data[i]); } free(locals->data); locals->data = NULL; locals->size = 0; locals->cap = 0; } local_t* locals_try_load(locals_t* locals, int id) { assert(locals); for (size_t i=0; isize; i++) { if (locals->data[i]->id == id) { return locals->data[i]; } } return NULL; } void locals_store(locals_t* locals, int id, int addr) { assert(locals); local_t* loc = locals_try_load(locals, id); if (!loc) { if (locals->data == NULL) { locals->cap = 2; locals->data = malloc(sizeof(local_t*) * locals->cap); } if (locals->size >= locals->cap) { locals->cap *= 2; locals->data = realloc(locals->data, sizeof(local_t*) * locals->cap); } locals->data[locals->size] = malloc(sizeof(local_t)); locals->data[locals->size]->id = id; locals->data[locals->size]->addr = addr; locals->size++; } else { loc->id = id; loc->addr = addr; } }