#include #include #include #include #include #include #include #include int filereader_init(struct filereader* fw, const char* volume, const char* path) { memset(fw, 0, sizeof(*fw)); strncpy(fw->volume, volume, VOLUME_MAX); strncpy(fw->path, path, PATH_MAX); int ret; struct desc desc; if ((ret = volume_open(fw->volume)) < 0) return -FR_VOLUME_OPEN_ERROR; if ((ret = describe(fw->path, &desc)) < 0) { volume_close(); return -FR_DESC_ERROR; } if (desc.type != FS_FILE) { volume_close(); return -FR_NOT_FILE; } fw->file_size = desc.size; fw->flags |= FR_OPEN; return FR_OK; } int filereader_fini(struct filereader* fw) { if ((fw->flags & FR_OPEN)) { volume_close(); fw->flags &= ~FR_OPEN; } return FR_OK; } int filereader_read(struct filereader* fw, uint8_t* buffer, size_t buffer_size) { if (!(fw->flags & FR_OPEN)) return -FR_VOLUME_NOT_OPENED; int ret; if (buffer_size > 0) { if (!(fw->read_cursor + buffer_size <= fw->file_size)) return -FR_CURSOR_OOB; if ((ret = read_file(fw->path, fw->read_cursor, buffer, buffer_size)) < 0) return -FR_READ_ERROR; fw->read_cursor += buffer_size; } return FR_OK; }