// vim:fileencoding=utf-8:foldmethod=marker #include "file.h" #include "../cpath/cpath.h" #include "../../common/assert/assert.h" #include "../../common/aliases/aliases.h" #include "../../base/array/array.h" #include "../../base/strings/str8/str8.h" WpFile *wpFileOpen(const WpAllocator *allocator, WpStr8RO *filepath, WpFileAccessMode mode) { wpDebugAssert(allocator != NULL && filepath != NULL, "`allocator` and `filepath` should not be NULL"); wpDebugAssert(filepath->size < WP_PATH_MAX, "`filepath` exceeds max path limit."); return fileOpen(allocator, filepath, mode); } i64 wpFileGetCurrentPosition(WpFile *file) { wpDebugAssert(file != NULL, "`file` should not be NULL."); return fileSeek(file, 0, WP_SEEK_CURRENT); } i64 wpFileSeek(WpFile *file, i64 offset, WpFileSeekOrigin origin) { wpDebugAssert(file != NULL, "`file` should not be NULL."); return fileSeek(file, offset, origin); } i64 wpFileGetLength(WpFile *file) { wpDebugAssert(file != NULL, "`file` should not be NULL."); i64 current = wpFileGetCurrentPosition(file); fileSeek(file, 0, WP_SEEK_END); i64 output = wpFileGetCurrentPosition(file); // Restore position fileSeek(file, current, WP_SEEK_START); return output; } u64 wpFileRead(void *dst_buf, WpFile *file, u64 byte_count) { wpDebugAssert(dst_buf != NULL && file != NULL, "`dst_buf` and `file` should not be NULL."); i64 file_length = wpFileGetLength(file); if (file_length < 0) { return 0; } return fileRead(dst_buf, byte_count, file, file_length); } i64 wpFileWrite(const void *src_buf, WpFile *file, u64 byte_count) { wpDebugAssert(src_buf != NULL && file != NULL, "`src_buf` and `file` should not be NULL."); return fileWrite(src_buf, file, byte_count); } u64 wpFileReadStr8(WpStr8 *str, WpFile *file) { wpDebugAssert(str != NULL, "`str` should not be NULL."); return wpFileRead((void *)(str->buf), file, str->size); } i64 wpFileWriteStr8(WpStr8RO *str, WpFile *file) { wpDebugAssert(str != NULL, "`str` should not be NULL."); return wpFileWrite((void *)(str->buf), file, str->size); } u64 wpFileReadArray(WpArray dst_buf, WpFile *file, u64 item_count) { wpDebugAssert(dst_buf != NULL && file != NULL, "`dst_buf` and `file` should not be NULL."); i64 _file_length = wpFileGetLength(file); if (_file_length < 0) { return 0; } u64 file_length = (u64)_file_length; u64 item_size = wpArrayItemSize(dst_buf); u64 dst_byte_capacity = wpArrayCapacity(dst_buf) * item_size; u64 req_byte_count = item_count * item_size; u64 copy_byte_count = 0; if (req_byte_count <= file_length && req_byte_count <= dst_byte_capacity) { copy_byte_count = req_byte_count; } else { copy_byte_count = file_length <= dst_byte_capacity ? file_length : dst_byte_capacity; } u64 byte_count = fileRead(dst_buf, copy_byte_count, file, file_length); if (byte_count == 0) { return 0; } wpArraySetCount(dst_buf, byte_count / item_size); return wpArrayCount(dst_buf); } i64 wpFileWriteArray(const WpArray src_buf, WpFile *file, u64 item_count) { wpDebugAssert(src_buf != NULL && file != NULL, "`src_buf` and `file` should not be NULL."); u64 item_size = wpArrayItemSize(src_buf); u64 src_byte_count = wpArrayCount(src_buf) * item_size; u64 req_byte_count = item_count * item_size; u64 to_copy = req_byte_count <= src_byte_count ? req_byte_count : src_byte_count; i64 bytes_written = fileWrite(src_buf, file, to_copy); if (bytes_written < 0) { return 0; } return (u64)bytes_written / item_size; } i32 wpFileFlush(WpFile *file) { wpDebugAssert(file != NULL, "`file` should not be NULL."); return fileFlush(file); } i32 wpFileClose(WpFile *file) { wpDebugAssert(file != NULL, "`file` should not be NULL."); return fileClose(file); } i32 wpFileRename(WpStr8RO *old_filepath, WpStr8RO *new_filepath) { wpDebugAssert(old_filepath != NULL && new_filepath != NULL, "`old_filepath` and `new_filepath` should not be NULL"); wpDebugAssert(old_filepath->size < WP_PATH_MAX, "`old_filepath` exceeds max path limit."); wpDebugAssert(new_filepath->size < WP_PATH_MAX, "`new_filepath` exceeds max path limit."); return fileRename(old_filepath, new_filepath); } i32 wpFileRemove(WpStr8RO *filepath) { wpDebugAssert(filepath != NULL, "`filepath` should not be NULL"); wpDebugAssert(filepath->size < WP_PATH_MAX, "`filepath` exceeds max path limit."); return fileRemove(filepath); }