diff options
author | Bad Diode <bd@badd10de.dev> | 2022-05-16 19:01:52 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-05-16 19:01:52 +0200 |
commit | e7cd6e1598c8fa0b11b4ddc23b9037be7749e920 (patch) | |
tree | bebf41fc3df5ff2f335772cc0d658d7d63341dc0 /src/file.c | |
parent | aea3279d8730b9e921c7c23387ee3a803d91a7cc (diff) | |
download | uxngba-e7cd6e1598c8fa0b11b4ddc23b9037be7749e920.tar.gz uxngba-e7cd6e1598c8fa0b11b4ddc23b9037be7749e920.zip |
Update file device to support multiple file devs
Diffstat (limited to 'src/file.c')
-rw-r--r-- | src/file.c | 69 |
1 files changed, 36 insertions, 33 deletions
@@ -13,65 +13,68 @@ WITH REGARD TO THIS SOFTWARE. | |||
13 | 13 | ||
14 | #include "posprintf.h" | 14 | #include "posprintf.h" |
15 | 15 | ||
16 | static File f = {0}; | 16 | typedef struct { |
17 | static char *current_filename = ""; | 17 | File f; |
18 | char *filename; | ||
19 | enum { | ||
20 | IDLE, | ||
21 | FILE_READ, | ||
22 | FILE_WRITE, | ||
23 | } state; | ||
24 | } UxnFile; | ||
18 | 25 | ||
19 | static enum { | 26 | static UxnFile uxn_file[2]; |
20 | IDLE, | ||
21 | FILE_READ, | ||
22 | FILE_WRITE, | ||
23 | } file_state; | ||
24 | 27 | ||
25 | void | 28 | void |
26 | file_reset(void) { | 29 | file_reset(UxnFile *f) { |
27 | f = (File){0}; | 30 | f->f = (File){0}; |
28 | file_state = IDLE; | 31 | f->state = IDLE; |
29 | } | 32 | } |
30 | 33 | ||
31 | u16 | 34 | u16 |
32 | file_init(void *filename) { | 35 | file_init(UxnFile *f, void *filename) { |
33 | file_reset(); | 36 | file_reset(f); |
34 | current_filename = filename; | 37 | f->filename = filename; |
35 | return 0; | 38 | return 0; |
36 | } | 39 | } |
37 | 40 | ||
38 | u16 | 41 | u16 |
39 | file_read(void *dest, u16 len) { | 42 | file_read(UxnFile *f, void *dest, u16 len) { |
40 | if(file_state != FILE_READ) { | 43 | if(f->state != FILE_READ) { |
41 | file_reset(); | 44 | file_reset(f); |
42 | f = fs_open_file(current_filename, FS_OPEN_READ); | 45 | f->f = fs_open_file(f->filename, FS_OPEN_READ); |
43 | file_state = FILE_READ; | 46 | f->state = FILE_READ; |
44 | } | 47 | } |
45 | if (f.index == FS_NULL) { | 48 | if (f->f.index == FS_NULL) { |
46 | return 0; | 49 | return 0; |
47 | } | 50 | } |
48 | return fs_read(dest, len, &f); | 51 | return fs_read(dest, len, &f->f); |
49 | } | 52 | } |
50 | 53 | ||
51 | u16 | 54 | u16 |
52 | file_write(void *src, u16 len, u8 flags) { | 55 | file_write(UxnFile *f, void *src, u16 len, u8 flags) { |
53 | if(file_state != FILE_WRITE) { | 56 | if(f->state != FILE_WRITE) { |
54 | file_reset(); | 57 | file_reset(f); |
55 | OpenMode mode = (flags & 0x01) ? FS_OPEN_APPEND : FS_OPEN_WRITE; | 58 | OpenMode mode = (flags & 0x01) ? FS_OPEN_APPEND : FS_OPEN_WRITE; |
56 | f = fs_open_file(current_filename, mode); | 59 | f->f = fs_open_file(f->filename, mode); |
57 | file_state = FILE_WRITE; | 60 | f->state = FILE_WRITE; |
58 | } | 61 | } |
59 | if (f.index == FS_NULL) { | 62 | if (f->f.index == FS_NULL) { |
60 | return 0; | 63 | return 0; |
61 | } | 64 | } |
62 | return fs_write(src, len, &f); | 65 | return fs_write(src, len, &f->f); |
63 | } | 66 | } |
64 | 67 | ||
65 | u16 | 68 | u16 |
66 | file_stat(void *dest, u16 len) { | 69 | file_stat(UxnFile *f, void *dest, u16 len) { |
67 | if(len < strlen(current_filename) + 7) { | 70 | if(len < strlen(f->filename) + 7) { |
68 | return 0; | 71 | return 0; |
69 | } | 72 | } |
70 | if (f.index == FS_NULL) { | 73 | if (f->f.index == FS_NULL) { |
71 | posprintf(dest, "!!!! %s\n", current_filename); | 74 | posprintf(dest, "!!!! %s\n", f->filename); |
72 | } else { | 75 | } else { |
73 | u16 file_size = fs_file_size(&f); | 76 | u16 file_size = fs_file_size(&f->f); |
74 | posprintf(dest, "%04x %s\n", (unsigned int)file_size, current_filename); | 77 | posprintf(dest, "%04x %s\n", (unsigned int)file_size, f->filename); |
75 | } | 78 | } |
76 | return 0; | 79 | return 0; |
77 | } | 80 | } |