119 lines
2.9 KiB
C
119 lines
2.9 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);
|
|
|
|
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;
|
|
}
|