libioutil Implement a file reader
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m23s

This commit is contained in:
2026-03-02 23:25:34 +01:00
parent 0ca5f0a3f3
commit af66f1ed44
4 changed files with 132 additions and 24 deletions

61
libioutil/filereader.c Normal file
View File

@@ -0,0 +1,61 @@
#include <desc.h>
#include <filereader.h>
#include <path_defs.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <system.h>
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)
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;
}

33
libioutil/filereader.h Normal file
View File

@@ -0,0 +1,33 @@
#ifndef _LIBIOUTIL_FILEREADER_H
#define _LIBIOUTIL_FILEREADER_H
#include <path_defs.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#define FR_OK 0
#define FR_VOLUME_OPEN_ERROR 1
#define FR_DESC_ERROR 2
#define FR_NOT_FILE 3
#define FR_VOLUME_NOT_OPENED 4
#define FR_READ_ERROR 5
#define FR_CURSOR_OOB 6
#define FR_OPEN (1 << 31)
struct filereader {
char volume[VOLUME_MAX];
char path[PATH_MAX];
size_t read_cursor;
size_t file_size;
uint32_t flags;
};
int filereader_init (struct filereader* fw, const char* volume, const char* path);
int filereader_fini (struct filereader* fw);
int filereader_read (struct filereader* fw, uint8_t* buffer, size_t buffer_size);
#endif // _LIBIOUTIL_FILEREADER_H

View File

@@ -1,3 +1,5 @@
c += filewriter.c
c += filewriter.c \
filereader.c
o += filewriter.o
o += filewriter.o \
filereader.o