#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; ivalues.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; ivalues.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; iprogram.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; }