#include #include #include #include #include #include #include #include // 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; }