aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-05-24 19:11:54 +0200
committerBad Diode <bd@badd10de.dev>2021-05-24 19:11:54 +0200
commitabe30b526dc5017d6c9adb61472ebe3cfc727482 (patch)
treefd6e3bbb3caa15c102ee7d6017c4f1ef44b13e0a
parentb98e1e643f98531f33404d67e23b691a7d3094d9 (diff)
downloaduxngba-abe30b526dc5017d6c9adb61472ebe3cfc727482.tar.gz
uxngba-abe30b526dc5017d6c9adb61472ebe3cfc727482.zip
Add different seek modes
-rw-r--r--src/filesystem.c21
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
277typedef enum {
278 FS_SEEK_SET,
279 FS_SEEK_CUR,
280 FS_SEEK_END,
281} SeekMode;
282
277int 283int
278fs_seek(File *file, int offset) { 284fs_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 }