miniffs/includes/miniffs.h

127 lines
4.2 KiB
C

/******************************************************************************
* MiniFFS : Mini Flat File System
* miniffs.h: MiniFFS main header
*
* Copyright (c) 2008-2022 986-Studio. All rights reserved.
*
******************************************************************************/
#ifndef MINIFFS_H
#define MINIFFS_H
#include <stdint.h>
#include <stdbool.h>
#define MINIFFS_VERSION_MAJOR (1)
#define MINIFFS_VERSION_MINOR (0)
#define MINIFFS_FILENAME_LENGTH (8)
#define MINIFFS_EXTENSION_LENGTH (3)
/* the full name is FILENAME + '.' + EXTENSION */
#define MINIFFS_FULLNAME_LENGTH (MINIFFS_FILENAME_LENGTH + MINIFFS_EXTENSION_LENGTH + 1)
/*
* The pack(1) may not be needed, but better be safe than sorry to
* have a consistent binary representation across architectures
*/
#pragma pack(1)
typedef struct fileentry_t
{
char name[MINIFFS_FILENAME_LENGTH];
char ext[MINIFFS_EXTENSION_LENGTH];
uint32_t size;
uint32_t offset;
} fileentry_t;
typedef struct miniffs_header_t
{
uint32_t magic;
uint8_t fs_version_major;
uint8_t fs_version_minor;
uint8_t fs_filename_len;
uint8_t fs_extention_len;
uint32_t entry_count;
fileentry_t fent[];
} miniffs_header_t;
#pragma pack()
#if BUILD_PLATFORM_MEMORY
#include <platform/memory.h>
#elif BUILD_PLATFORM_FILE
#include <platform/file.h>
#else
#error Unknown build target.
#endif
/* Somewhat similar structure to the plain C FILE structure */
typedef struct file_t
{
void *private;
fileentry_t *fent; /***< file linked to this structure */
uint32_t offset; /***< current position in the file */
} file_t;
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define MAKE4(_a, _b, _c, _d) ((((_a) & 0xFF) << 24) | (((_b) & 0xFF) << 16) | (((_c) & 0xFF) << 8) | ((_d) & 0xFF))
#else
#define MAKE4(_d, _c, _b, _a) ((((_a) & 0xFF) << 24) | (((_b) & 0xFF) << 16) | (((_c) & 0xFF) << 8) | ((_d) & 0xFF))
#endif
#define MINIFFS_MAGIC MAKE4('M', 'F', 'F', 'S')
enum {
MFFS_SEEK_SET, /***< Seek from beginning of file */
MFFS_SEEK_CUR, /***< Seek from current position */
MFFS_SEEK_END /***< Seek from end of file */
};
/*
* Public functions used reading the filesystem
* This implementation is system dependant as it relly on how the memory is architectured and where the MiniFFS is stored.
*/
/* miniffs_openfs is backend specific and will be found in the backend header file */
file_t *miniffs_open(miniffs_t *fs, char *filename); /***< Open a file */
int miniffs_close(file_t *file); /***< Close a file */
void *miniffs_map(file_t *file); /***< Map a file to memory */
int miniffs_read_blocks(void *ptr, size_t size, size_t nmemb, file_t *file); /***< Read blocks of bytes from a file */
uint8_t miniffs_read(file_t *file); /***< Read a single byte from a file */
int miniffs_seek(file_t *file, size_t offset, int whence); /***< Set position in a file */
size_t miniffs_tell(file_t *file); /***< Get current position in a file*/
typedef enum miniffs_error_t
{
MINIFFS_NOERROR = 0,
MINIFFS_INVALID_FS,
MINIFFS_INVALID_NAME,
MINIFFS_INVALID_PARAMS,
MINIFFS_FILE_NOT_FOUND,
MINIFFS_ALLOCATION_ERROR,
MINIFFS_END_OF_FILE,
//MINIFFS_,
} miniffs_error_t;
miniffs_error_t miniffs_geterror(); /***< Return last error */
#ifdef BUILD_HOST_TOOLS
/*
* Functions used for offline creation of the filesystem
*/
miniffs_t *miniffs_createfs();
int miniffs_addfile(miniffs_t *fs, char *name, char *ext, char *host_path);
int miniffs_delfile(miniffs_t *fs, char *name, char *ext, char *host_path);
int miniffs_writeimage(miniffs_t *fs, char *host_path);
int miniffs_closefs(miniffs_t *fs);
#endif /* BUILD_HOST_TOOLS */
#ifdef __miniffs_internal
/*
* Function that are private to the library
*/
bool miniffs_isvalidfs(miniffs_t *fs);
fileentry_t *miniffs_findfile(miniffs_t *fs, char *filename);
void miniffs_seterror(miniffs_error_t err);
void *miniffs_getfileaddr(miniffs_t *fs, fileentry_t *fent);
#endif /* __miniffs_internal */
#endif /* MINIFFS_H */