91 lines
1.6 KiB
C
91 lines
1.6 KiB
C
#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;
|
|
}
|
|
}
|