roza/lib/locals.c

91 lines
1.6 KiB
C
Raw Permalink Normal View History

2023-12-23 20:17:12 +00:00
#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; i<locals->size; 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; i<locals->size; 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; i<locals->size; 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;
}
}