wip: working on extern in VM

- Feat: add writer externs writing fns
- Feat: add VM reader functions
This commit is contained in:
samsonium
2026-11-05 21:48:40 +03:00
parent 84572edb0d
commit 1db42c1e8e
17 changed files with 608 additions and 16 deletions
+147
View File
@@ -0,0 +1,147 @@
#include <common/fzl_extern.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vm/fzl_vm_reader.h>
#include <vm/internals/reader.h>
char reader_err[256];
fzl_vm_reader_t *fzl_vm_mkreader(char *filepath)
{
if (!filepath)
{
snprintf(reader_err, sizeof(reader_err),
"init error - filepath is not defined");
return NULL;
}
fzl_vm_reader_t *reader = malloc(sizeof(fzl_vm_reader_t));
if (!reader)
{
snprintf(reader_err, sizeof(reader_err),
"init error - couldn't allocate memory for reader");
return NULL;
}
memset(reader, 0, sizeof(fzl_vm_reader_t));
reader->filepath = filepath;
return reader;
}
void wr_validation_err(char *section)
{
snprintf(reader_err, sizeof(reader_err),
"init error - section '%s' is not valid", section);
}
bool fzl_vm_read(fzl_vm_reader_t *reader)
{
if (!reader)
{
snprintf(reader_err, sizeof(reader_err),
"init error - reader is not provided");
return false;
}
FILE *fd = fopen(reader->filepath, "rb");
if (!fd)
{
snprintf(reader_err, sizeof(reader_err),
"init error - couldn't open file '%s'", reader->filepath);
return false;
}
bool result = vm_rd_header(reader, fd);
if (!result)
{
wr_validation_err("header");
fclose(fd);
return false;
}
result = vm_rd_sections_sz(reader, fd);
if (!result)
{
wr_validation_err("sizes");
fclose(fd);
return false;
}
result = vm_rd_consts(reader, fd);
if (!result)
{
wr_validation_err("constants table");
fclose(fd);
return false;
}
result = vm_rd_extern_libs(reader, fd);
if (!result)
{
wr_validation_err("extern libs");
fclose(fd);
return false;
}
result = vm_rd_extern_types(reader, fd);
if (!result)
{
wr_validation_err("extern types");
fclose(fd);
return false;
}
result = vm_rd_extern_fns(reader, fd);
if (!result)
{
wr_validation_err("extern functions");
fclose(fd);
return false;
}
result = vm_rd_ops(reader, fd);
if (!result)
{
wr_validation_err("opcodes");
fclose(fd);
return false;
}
return true;
}
char *fzl_vm_getreadererror() { return reader_err; }
void fzl_vm_freereader(fzl_vm_reader_t *reader)
{
if (!reader)
return;
if (reader->consts)
{
for (uint16_t i = 0; i < reader->consts_count; i++)
if (reader->consts[i].as.s.value)
free((void *)reader->consts[i].as.s.value);
free(reader->consts);
}
if (reader->extern_libs)
free(reader->extern_libs);
if (reader->extern_types)
free(reader->extern_types);
if (reader->extern_fns)
free(reader->extern_fns);
if (reader->ops)
free(reader->ops);
free(reader);
}