From e7cd6e1598c8fa0b11b4ddc23b9037be7749e920 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 16 May 2022 19:01:52 +0200 Subject: Update file device to support multiple file devs --- src/file.c | 69 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 36 insertions(+), 33 deletions(-) (limited to 'src/file.c') diff --git a/src/file.c b/src/file.c index a45d59f..6dba2f9 100644 --- a/src/file.c +++ b/src/file.c @@ -13,65 +13,68 @@ WITH REGARD TO THIS SOFTWARE. #include "posprintf.h" -static File f = {0}; -static char *current_filename = ""; +typedef struct { + File f; + char *filename; + enum { + IDLE, + FILE_READ, + FILE_WRITE, + } state; +} UxnFile; -static enum { - IDLE, - FILE_READ, - FILE_WRITE, -} file_state; +static UxnFile uxn_file[2]; void -file_reset(void) { - f = (File){0}; - file_state = IDLE; +file_reset(UxnFile *f) { + f->f = (File){0}; + f->state = IDLE; } u16 -file_init(void *filename) { - file_reset(); - current_filename = filename; +file_init(UxnFile *f, void *filename) { + file_reset(f); + f->filename = filename; return 0; } u16 -file_read(void *dest, u16 len) { - if(file_state != FILE_READ) { - file_reset(); - f = fs_open_file(current_filename, FS_OPEN_READ); - file_state = FILE_READ; +file_read(UxnFile *f, void *dest, u16 len) { + if(f->state != FILE_READ) { + file_reset(f); + f->f = fs_open_file(f->filename, FS_OPEN_READ); + f->state = FILE_READ; } - if (f.index == FS_NULL) { + if (f->f.index == FS_NULL) { return 0; } - return fs_read(dest, len, &f); + return fs_read(dest, len, &f->f); } u16 -file_write(void *src, u16 len, u8 flags) { - if(file_state != FILE_WRITE) { - file_reset(); +file_write(UxnFile *f, void *src, u16 len, u8 flags) { + if(f->state != FILE_WRITE) { + file_reset(f); OpenMode mode = (flags & 0x01) ? FS_OPEN_APPEND : FS_OPEN_WRITE; - f = fs_open_file(current_filename, mode); - file_state = FILE_WRITE; + f->f = fs_open_file(f->filename, mode); + f->state = FILE_WRITE; } - if (f.index == FS_NULL) { + if (f->f.index == FS_NULL) { return 0; } - return fs_write(src, len, &f); + return fs_write(src, len, &f->f); } u16 -file_stat(void *dest, u16 len) { - if(len < strlen(current_filename) + 7) { +file_stat(UxnFile *f, void *dest, u16 len) { + if(len < strlen(f->filename) + 7) { return 0; } - if (f.index == FS_NULL) { - posprintf(dest, "!!!! %s\n", current_filename); + if (f->f.index == FS_NULL) { + posprintf(dest, "!!!! %s\n", f->filename); } else { - u16 file_size = fs_file_size(&f); - posprintf(dest, "%04x %s\n", (unsigned int)file_size, current_filename); + u16 file_size = fs_file_size(&f->f); + posprintf(dest, "%04x %s\n", (unsigned int)file_size, f->filename); } return 0; } -- cgit v1.2.1