diff options
author | Bad Diode <bd@badd10de.dev> | 2021-05-24 19:11:54 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-05-24 19:11:54 +0200 |
commit | abe30b526dc5017d6c9adb61472ebe3cfc727482 (patch) | |
tree | fd6e3bbb3caa15c102ee7d6017c4f1ef44b13e0a /src | |
parent | b98e1e643f98531f33404d67e23b691a7d3094d9 (diff) | |
download | uxngba-abe30b526dc5017d6c9adb61472ebe3cfc727482.tar.gz uxngba-abe30b526dc5017d6c9adb61472ebe3cfc727482.zip |
Add different seek modes
Diffstat (limited to 'src')
-rw-r--r-- | src/filesystem.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/filesystem.c b/src/filesystem.c index 3fe95ab..327b613 100644 --- a/src/filesystem.c +++ b/src/filesystem.c | |||
@@ -274,10 +274,27 @@ _fs_write_to_block(u8 *src, u16 n_bytes, u16 blk_offset, | |||
274 | _fs_write(&block, block_pos, sizeof(FileBlock)); | 274 | _fs_write(&block, block_pos, sizeof(FileBlock)); |
275 | } | 275 | } |
276 | 276 | ||
277 | typedef enum { | ||
278 | FS_SEEK_SET, | ||
279 | FS_SEEK_CUR, | ||
280 | FS_SEEK_END, | ||
281 | } SeekMode; | ||
282 | |||
277 | int | 283 | int |
278 | fs_seek(File *file, int offset) { | 284 | fs_seek(File *file, int offset, SeekMode mode) { |
279 | u16 file_size = fs_file_size(file); | 285 | u16 file_size = fs_file_size(file); |
280 | u16 new_offset = MAX((int)file->offset + offset, 0); | 286 | u16 new_offset = 0; |
287 | switch (mode) { | ||
288 | case FS_SEEK_SET: { | ||
289 | new_offset = offset; | ||
290 | } break; | ||
291 | case FS_SEEK_CUR: { | ||
292 | new_offset = MAX((int)file->offset + offset, 0); | ||
293 | } break; | ||
294 | case FS_SEEK_END: { | ||
295 | new_offset = MAX((int)file_size - 1 + offset, 0); | ||
296 | } break; | ||
297 | } | ||
281 | if (new_offset >= file_size) { | 298 | if (new_offset >= file_size) { |
282 | return -1; | 299 | return -1; |
283 | } | 300 | } |