wip: working on extern in VM
- Feat: add writer externs writing fns - Feat: add VM reader functions
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user