From 75705ca3d91930a730743b5319268087fc7bc56e Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 19 Jul 2025 09:29:54 -0700 Subject: New filesystem API --- filesystem/src/filesystem.c | 65 +++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 26 deletions(-) (limited to 'filesystem/src/filesystem.c') diff --git a/filesystem/src/filesystem.c b/filesystem/src/filesystem.c index b0c207a..b30c072 100644 --- a/filesystem/src/filesystem.c +++ b/filesystem/src/filesystem.c @@ -5,21 +5,27 @@ #include #include -size_t get_file_size(FILE* file) { +size_t get_file_size(const char* filename) { + size_t size = 0; + WITH_FILE(filename, size = get_file_size_f(file)); + return size; +} + +size_t get_file_size_f(FILE* file) { assert(file); const long int starting_pos = ftell(file); if (starting_pos == -1) { - return (size_t)-1; + return 0; } if (fseek(file, 0, SEEK_END) != 0) { - return (size_t)-1; + return 0; } const size_t file_size = ftell(file); if (file_size == (size_t)-1) { - return (size_t)-1; + return 0; } if (fseek(file, starting_pos, SEEK_SET) != 0) { - return (size_t)-1; + return 0; } return file_size; } @@ -27,31 +33,38 @@ size_t get_file_size(FILE* file) { void* read_file(const char* filepath) { assert(filepath); - void* data = nullptr; + void* data = nullptr; + bool success = false; - FILE* file = fopen(filepath, "rb"); - if (!file) { - return nullptr; - } - const size_t file_size = get_file_size(file); - if (file_size == (size_t)-1) { - goto cleanup; - } + WITH_FILE(filepath, { + const size_t file_size = get_file_size_f(file); + if (file_size > 0) { + data = calloc(1, file_size); + if (data != nullptr) { + if (fread(data, 1, file_size, file) == file_size) { + success = true; + } + } + } + }); - data = calloc(1, file_size); - if (!data) { - goto cleanup; - } - if (fread(data, 1, file_size, file) != file_size) { - goto cleanup; + if (!success) { + free(data); + data = nullptr; } - return data; +} -cleanup: - fclose(file); - if (data) { - free(data); +bool read_file_f(FILE* file, void* buffer) { + assert(file); + assert(buffer); + + bool success = false; + const size_t file_size = get_file_size_f(file); + if (file_size > 0) { + if (fread(buffer, 1, file_size, file) == file_size) { + success = true; + } } - return nullptr; + return success; } -- cgit v1.2.3