#include #include #include #include struct file { _file_handle_t handle; uint32_t position; uint32_t length; }; const char *remove_prefix(const char *path, uint8_t *dn_out) { if ((path[0] != 's') || (path[1] != 'd')) goto no_prefix; const char *num_part = path + 2; for (uint32_t i = 0; num_part[i]; ++i) if (num_part[i] == ':') { uint32_t dn_large; if (!try_sntoi(num_part, i, &dn_large) || dn_large > 255) goto no_prefix; *dn_out = (uint8_t)dn_large; return num_part + i + 1; } no_prefix: *dn_out = current_drive; return path; } struct file *open_file(const char *path) { uint8_t dn; path = remove_prefix(path, &dn); _file_handle_t h = _open_file(dn, path); if (!h) return 0; struct file *f = get_block(sizeof(struct file)); f->handle = h; f->position = 0; f->length = _file_size(h); return f; } void close_file(struct file *f) { _close_file(f->handle); free_block(f); } uint32_t read_from_file(struct file *f, uint32_t max, void *buf) { if (f->position + max > f->length) max = f->length - f->position; uint32_t read = _file_read(f->handle, f->position, max, buf); f->position += read; return read; } uint32_t seek_file_to(struct file *f, uint32_t to) { if (to > f->length) to = f->length; return f->position = to; } int32_t seek_file_by(struct file *f, int32_t by) { uint32_t old = f->position; uint32_t to = old + by > f->length ? f->length : old + by; f->position = to; return to - old; } __attribute__ ((pure)) uint32_t file_size(struct file *f) { return f->length; }