#include "libhost.h" #include "stdio.h" os_u32 libhost_readRoutine(os_u32 amount, void* buffer, void* user_data) { if (user_data == 0) { return 0; } FILE* f = (FILE*)user_data; os_u32 read_bytes = fread(buffer, 1, amount, f); return read_bytes; } os_u32 libhost_writeRoutine(os_u32 amount, void* buffer, void* user_data) { if (user_data == 0) { return 0; } FILE* f = (FILE*)user_data; os_u32 written_bytes = fwrite(buffer, 1, amount, f); return written_bytes; } os_bool libhost_seekRoutine(os_u32 offset, os_u32 direction, void* user_data) { if (user_data == 0) { return OS_FALSE; } FILE* f = (FILE*)user_data; int seek_dir = SEEK_SET; switch(direction) { case LIBFAT_SEEK_ORIGIN: seek_dir = SEEK_SET; break; case LIBFAT_SEEK_CURRENT: seek_dir = SEEK_CUR; break; case LIBFAT_SEEK_END: seek_dir = SEEK_END; break; } int result = fseek(f, offset, seek_dir); return result == 0 ? OS_TRUE : OS_FALSE; } os_u32 libhost_tellRoutine(void* user_data) { if (user_data == 0) { return 0; } FILE* f = (FILE*)user_data; os_u32 result = ftell(f); return result; } void libhost_printRoutine(os_s8* data, os_u16 size) { if (size == 0) { printf("%s\n", data); return; } for(os_u16 s = 0; s < size; s++) { printf("%c", *data); data++; } printf("\n"); } void libhost_printNumber(os_u32 number) { printf("%#x\n", number); } extern LFFileHandle libhost_create_handle(FILE* f) { LFFileHandle h; h.read = libhost_readRoutine; h.write = libhost_writeRoutine; h.seek = libhost_seekRoutine; h.tell = libhost_tellRoutine; h.user_data = (void*)f; return h; }