67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
#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/internals/reader.h>
|
|
|
|
// Read external lib names
|
|
bool vm_rd_extern_libs(fzl_vm_reader_t *reader, FILE *fd)
|
|
{
|
|
if (!reader || !fd)
|
|
return false;
|
|
|
|
uint16_t libs_count = reader->extern_libs_count;
|
|
if (!libs_count)
|
|
return true;
|
|
|
|
reader->extern_libs = malloc(sizeof(char *) * libs_count);
|
|
if (!reader->extern_libs)
|
|
{
|
|
snprintf(internal_error, sizeof(internal_error), "out of memory");
|
|
return false;
|
|
}
|
|
|
|
memset(reader->extern_libs, 0, sizeof(char *) * libs_count);
|
|
|
|
bool ok = false;
|
|
size_t name_sz = 0;
|
|
char name[256];
|
|
for (uint16_t i = 0; i < libs_count; i++)
|
|
{
|
|
memset(name, 0, sizeof(name));
|
|
|
|
ok = vm_rd_word(fd, 1, &name_sz);
|
|
if (!ok || name_sz < 1)
|
|
{
|
|
snprintf(internal_error, sizeof(internal_error),
|
|
"failed to read lib #%u name size", i);
|
|
return false;
|
|
}
|
|
|
|
ok = vm_rd_char(fd, name_sz, name);
|
|
if (!ok)
|
|
{
|
|
snprintf(internal_error, sizeof(internal_error),
|
|
"failed to read lib #%u name", i);
|
|
return false;
|
|
}
|
|
|
|
char *val = malloc(sizeof(char) * name_sz + 1);
|
|
if (!val)
|
|
{
|
|
snprintf(internal_error, sizeof(internal_error),
|
|
"out of memory on lib #%u name allocation", i);
|
|
return false;
|
|
}
|
|
|
|
memset(val, 0, sizeof(char) * name_sz + 1);
|
|
memcpy(val, name, sizeof(char) * name_sz);
|
|
reader->extern_libs[i] = val;
|
|
}
|
|
|
|
return true;
|
|
}
|