/****************************************************************************** * 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 #include #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 #elif BUILD_PLATFORM_FILE #include #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, 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 */ #ifdef __cplusplus } #endif #endif /* MINIFFS_H */