diff options
Diffstat (limited to 'src/filesystem.c')
-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 | } |