miniffs/includes/miniffs.h
Godzil 73d9d4b861 Add a primitive write function and function to get the version.
MiniFFS is not really meant to write in the files, but in some cases it could be needed so that was added for that reason. If the changes are applied or not to the actual file is implementation dependent. So be careful.
2022-05-30 15:40:29 +01:00

141 lines
4.4 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 <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
#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_data;
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, const 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*/
int miniffs_write(file_t *file, char value);
char *miniffs_getversion();
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_SEEK_OUT_OF_BOUNDARIES,
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, const char *filename);
void miniffs_seterror(miniffs_error_t err);
void *miniffs_getfileaddr(miniffs_t *fs, fileentry_t *fent);
#endif /* __miniffs_internal */
#ifdef __cplusplus
}
#endif
#endif /* MINIFFS_H */