diff --git a/include/tlibc/errors.h b/include/tlibc/errors.h index 12a380a..ef37432 100755 --- a/include/tlibc/errors.h +++ b/include/tlibc/errors.h @@ -93,4 +93,4 @@ typedef struct Result_ { }\ } while(0) -#define try_assert(EXPR) if(!(EXPR)) { Return RESULT_ERROR((#EXPR), false); } +#define try_assert(EXPR) if(!(EXPR)) { Return RESULT_ERROR(("try_assert(" #EXPR ")"), false); } diff --git a/include/tlibc/filesystem.h b/include/tlibc/filesystem.h index e14d9c7..6bd57fe 100644 --- a/include/tlibc/filesystem.h +++ b/include/tlibc/filesystem.h @@ -62,6 +62,10 @@ Result(FILE*) file_open(cstr file_name, cstr fopen_mode); Result(FILE*) file_openOrCreateReadWrite(cstr file_name); bool file_exists(cstr path); + +///@return current position in file +Result(i64) file_tellPos(FILE* f); +///@return total size of file Result(i64) file_getSize(FILE* f); @@ -71,6 +75,7 @@ typedef enum SeekOrigin { SeekOrigin_End = SEEK_END, } SeekOrigin; +/// @brief changes current position in file Result(void) file_seek(FILE* f, i64 offset, SeekOrigin origin); diff --git a/src/filesystem/file.c b/src/filesystem/file.c index ab64d86..930e85b 100644 --- a/src/filesystem/file.c +++ b/src/filesystem/file.c @@ -47,7 +47,7 @@ Result(FILE*) file_openOrCreateReadWrite(cstr file_name){ -Result(i64) file_getSize(FILE* f){ +Result(i64) file_tellPos(FILE* f){ i64 r = IFWIN(_ftelli64, ftello64)(f); if(r < 0){ return RESULT_ERROR_ERRNO(); @@ -64,6 +64,18 @@ Result(void) file_seek(FILE* f, i64 offset, SeekOrigin origin){ return RESULT_VOID; } +Result(i64) file_getSize(FILE* f){ + Deferral(4); + // get current position + try(i64 original_pos, i, file_tellPos(f)); + // seek to end + try_void(file_seek(f, 0, SeekOrigin_End)); + try(i64 size, i, file_tellPos(f)); + // restore original position + try_void(file_seek(f, original_pos, SeekOrigin_Start)); + Return RESULT_VALUE(i, size); +} + Result(void) file_writeStructs(FILE* f, const void* src, u64 struct_size, u64 count){ u64 r = fwrite(src, struct_size, count, f);