diff --git a/meson.build b/meson.build index b50dcf4..c67a581 100644 --- a/meson.build +++ b/meson.build @@ -46,10 +46,10 @@ endif sources = [ 'src/benchmark.c', - 'src/filesystem.c', 'src/engine/audio.c', 'src/engine/audio_sample.c', 'src/engine/audio_stream.c', + 'src/filesystem.c', 'src/json/bson_parse.c', 'src/json/bson_write.c', 'src/json/json_base.c', @@ -59,6 +59,7 @@ sources = [ 'src/memory.c', 'src/strings.c', 'src/vector.c', + 'src/virtual_file.c', ] dependencies = [ diff --git a/src/virtual_file.c b/src/virtual_file.c new file mode 100644 index 0000000..4e2065c --- /dev/null +++ b/src/virtual_file.c @@ -0,0 +1,83 @@ +#include "virtual_file.h" + +#include "memory.h" + +#include +#include + +VFILE *VFile_CreateFromBuffer(const char *data, size_t size) +{ + VFILE *const file = Memory_Alloc(sizeof(VFILE)); + file->content = Memory_Dup(data, size); + file->size = size; + file->cur_ptr = file->content; + return file; +} + +void VFile_Close(VFILE *file) +{ + Memory_FreePointer(&file->content); + Memory_FreePointer(&file); +} + +size_t VFile_GetPos(const VFILE *file) +{ + return file->cur_ptr - file->content; +} + +void VFile_Skip(VFILE *file, int32_t offset) +{ + const size_t cur_pos = VFile_GetPos(file); + assert(cur_pos + offset <= file->size); + file->cur_ptr += offset; +} + +void VFile_Read(VFILE *file, void *target, size_t size) +{ + const size_t cur_pos = VFile_GetPos(file); + assert(cur_pos + size <= file->size); + memcpy(target, file->cur_ptr, size); + file->cur_ptr += size; +} + +int8_t VFile_ReadS8(VFILE *file) +{ + int8_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} + +int16_t VFile_ReadS16(VFILE *file) +{ + int16_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} + +int32_t VFile_ReadS32(VFILE *file) +{ + int32_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} + +uint8_t VFile_ReadU8(VFILE *file) +{ + uint8_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} + +uint16_t VFile_ReadU16(VFILE *file) +{ + uint16_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} + +uint32_t VFile_ReadU32(VFILE *file) +{ + uint32_t result; + VFile_Read(file, &result, sizeof(result)); + return result; +} diff --git a/src/virtual_file.h b/src/virtual_file.h new file mode 100644 index 0000000..1791ede --- /dev/null +++ b/src/virtual_file.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +typedef struct { + char *content; + size_t size; + char *cur_ptr; +} VFILE; + +VFILE *VFile_CreateFromBuffer(const char *data, size_t size); +void VFile_Close(VFILE *file); + +size_t VFile_GetPos(const VFILE *file); +void VFile_Skip(VFILE *file, int32_t offset); + +void VFile_Read(VFILE *file, void *target, size_t size); +int8_t VFile_ReadS8(VFILE *file); +int16_t VFile_ReadS16(VFILE *file); +int32_t VFile_ReadS32(VFILE *file); +uint8_t VFile_ReadU8(VFILE *file); +uint16_t VFile_ReadU16(VFILE *file); +uint32_t VFile_ReadU32(VFILE *file);