roza/lib/mod.c

129 lines
3.1 KiB
C

#include "mod.h"
#include "lib/commons.h"
void mod_init(mod_t* mod)
{
assert(mod);
mod->program.size = 0;
mod->program.cap = 0;
mod->program.ops = NULL;
mod->program.params = NULL;
mod->values.size = 0;
mod->values.cap = 0;
mod->values.data = NULL;
}
void mod_free(mod_t* mod)
{
assert(mod);
free(mod->program.ops);
free(mod->program.params);
mod->program.size = 0;
mod->program.cap = 0;
for (size_t i=0; i<mod->values.size; i++)
{
value_free(mod->values.data[i]);
free(mod->values.data[i]);
}
free(mod->values.data);
mod->values.data = NULL;
mod->values.size = 0;
mod->values.cap = 0;
}
void mod_push_instr(mod_t* mod, Opcode op, param_t param)
{
assert(mod);
if (mod->program.cap == 0)
{
mod->program.cap = 2;
mod->program.ops = malloc(sizeof(Opcode) * mod->program.cap);
mod->program.params = malloc(sizeof(param_t) * mod->program.cap);
}
if (mod->program.size >= mod->program.cap)
{
mod->program.cap *= 2;
mod->program.ops = realloc(mod->program.ops,
sizeof(Opcode) * mod->program.cap);
mod->program.params = realloc(mod->program.params,
sizeof(param_t) * mod->program.cap);
}
mod->program.ops[mod->program.size] = op;
mod->program.params[mod->program.size] = param;
mod->program.size++;
}
size_t mod_str(mod_t* mod, char* buffer, size_t size)
{
size_t sz = 0;
sz += snprintf(buffer + sz, size - sz, "======== VALUES ========\n");
for (size_t i=0; i<mod->values.size; i++)
{
sz += snprintf(buffer + sz, size - sz, "%d| ", (int) i);
sz += value_str(mod->values.data[i], buffer + sz, size - sz);
sz += snprintf(buffer + sz, size - sz, "\n");
}
sz += snprintf(buffer + sz, size - sz, "\n======== PROGRAM ========\n");
for (size_t i=0; i<mod->program.size; i++)
{
if (mod->program.params[i] != RZ_NO_PARAM)
{
sz += snprintf(buffer + sz, size - sz, "%d| %s %d\n",
(int) i,
OpcodeStr[mod->program.ops[i]] + strlen("OP_"),
mod->program.params[i]);
}
else
{
sz += snprintf(buffer + sz, size - sz, "%d| %s\n",
(int) i,
OpcodeStr[mod->program.ops[i]] + strlen("OP_"));
}
}
return sz;
}
size_t mod_push_new_value(mod_t* mod, value_t* value)
{
assert(mod);
assert(value);
for (size_t i=0; i<mod->values.size; i++)
{
if (value_eq(value, mod->values.data[i]))
{
value_free(value);
free(value);
return i;
}
}
if (mod->values.size == 0)
{
mod->values.cap = 2;
mod->values.data = malloc(sizeof(value_t*) * mod->values.cap);
}
if (mod->values.size >= mod->values.cap)
{
mod->values.cap *= 2;
mod->values.data = realloc(mod->values.data,
sizeof(value_t*) * mod->values.cap);
}
mod->values.data[mod->values.size] = value;
mod->values.size++;
return mod->values.size - 1;
}