commit 0c5ef936c213b330507e19c85cc35948b5bbaf4f Author: Godzil Date: Wed May 25 14:06:47 2022 +0100 Initial commit diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e835b62 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.10) +project(MiniFFS C) + +set(CMAKE_C_STANDARD 99) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external/cmake ${CMAKE_MODULE_PATH}) + +# Generate version from Git Tag +include(GetGitRevisionDescription) +git_describe(VERSION --tags --dirty=-dirty) + +#parse the version information into pieces. +string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION}") +string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION}") +string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_MICRO "${VERSION}") +string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+-(.*)" "\\1" VERSION_SHA1 "${VERSION}") +message("-- Building version ${VERSION}") +add_compile_options(-DV_MAJOR=${VERSION_MAJOR}) +add_compile_options(-DV_MINOR=${VERSION_MINOR}) +add_compile_options(-DV_MICRO=${VERSION_MICRO}) +add_compile_options(-DV_TEXT="${VERSION_SHA1}") + + +set(VALID_BUILD_PLATFORM MEMORY FILE) +set(BUILD_PLATFORM MEMORY CACHE STRING "Platform to build for") +set_property(CACHE BUILD_PLATFORM PROPERTY STRINGS ${VALID_BUILD_PLATFORM}) + +option(BUILD_HOST_TOOLS "Build offline tools" ON) + +string(TOLOWER ${BUILD_PLATFORM} PLATFORM_FILE) + +add_library(miniffs) +target_sources(miniffs PRIVATE platform/${PLATFORM_FILE}.c miniffs.c) +target_include_directories(miniffs PUBLIC includes/) + +if (BUILD_HOST_TOOLS) + # Offline tools use the file backend so we have to include the lib by hand. + add_executable(mffs) + target_sources(mffs PRIVATE platform/file.c miniffs.c mffs.c) + target_include_directories(mffs PRIVATE includes/) +endif() diff --git a/external/cmake/GetGitRevisionDescription.cmake b/external/cmake/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..0a6cb5f --- /dev/null +++ b/external/cmake/GetGitRevisionDescription.cmake @@ -0,0 +1,168 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +# get_git_head_revision( [ ...]) +# +# Returns the refspec and sha hash of the current head revision +# +# git_describe( [ ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +# git_get_exact_tag( [ ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# git_local_changes() +# +# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. +# Uses the return code of "git diff-index --quiet HEAD --". +# Does not regard untracked files. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) + return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) + set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories + set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") + get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) + if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) + # We have reached the root directory, we are not in git + set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) + return() + endif() + set(GIT_DIR "${GIT_PARENT_DIR}/.git") + endwhile() + # check if this is a submodule + if(NOT IS_DIRECTORY ${GIT_DIR}) + file(READ ${GIT_DIR} submodule) + string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) + get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) + get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) + endif() + set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") + if(NOT EXISTS "${GIT_DATA}") + file(MAKE_DIRECTORY "${GIT_DATA}") + endif() + + if(NOT EXISTS "${GIT_DIR}/HEAD") + return() + endif() + set(HEAD_FILE "${GIT_DATA}/HEAD") + configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + + configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" + "${GIT_DATA}/grabRef.cmake" + @ONLY) + include("${GIT_DATA}/grabRef.cmake") + + set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) + set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + # TODO sanitize + #if((${ARGN}" MATCHES "&&") OR + # (ARGN MATCHES "||") OR + # (ARGN MATCHES "\\;")) + # message("Please report the following error to the project!") + # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") + #endif() + + #message(STATUS "Arguments to execute_process: ${ARGN}") + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + describe + #${hash} + ${ARGN} + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(NOT res EQUAL 0) + set(out "${out}-${res}-NOTFOUND") + endif() + + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) + git_describe(out --exact-match ${ARGN}) + set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_local_changes _var) + if(NOT GIT_FOUND) + find_package(Git QUIET) + endif() + get_git_head_revision(refspec hash) + if(NOT GIT_FOUND) + set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) + return() + endif() + if(NOT hash) + set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) + return() + endif() + + execute_process(COMMAND + "${GIT_EXECUTABLE}" + diff-index --quiet HEAD -- + WORKING_DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE + res + OUTPUT_VARIABLE + out + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(res EQUAL 0) + set(${_var} "CLEAN" PARENT_SCOPE) + else() + set(${_var} "DIRTY" PARENT_SCOPE) + endif() +endfunction() diff --git a/external/cmake/GetGitRevisionDescription.cmake.in b/external/cmake/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..d6011cd --- /dev/null +++ b/external/cmake/GetGitRevisionDescription.cmake.in @@ -0,0 +1,41 @@ +# +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") + # named branch + string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") + if(EXISTS "@GIT_DIR@/${HEAD_REF}") + configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) + else() + configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) + file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_HASH "${CMAKE_MATCH_1}") + endif() + endif() +else() + # detached HEAD + configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) + file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) + string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() \ No newline at end of file diff --git a/includes/miniffs.h b/includes/miniffs.h new file mode 100644 index 0000000..1cbce75 --- /dev/null +++ b/includes/miniffs.h @@ -0,0 +1,98 @@ +/****************************************************************************** + * 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 + +#if BUILD_TARGET == MEMORY +#include +#elif BUILD_TARGET == FILE +#include +#else +#error Unknown build target +#endif + +/* + * 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[8]; + char ext[3]; + uint32_t size; + uint32_t offset; +} fileentry_t; + +typedef struct miniffs_header_t +{ + uint32_t magic; + uint32_t entry_count; + fileentry_t fent[]; +} miniffs_header_t; + +#pragma pack() + +typedef struct miniffs_t miniffs_t; + +/* 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; + +#define MAKE4(_a, _b, _c, _d) ((_a & 0xFF) << 21) | ((_b & 0xFF) << 16) | ((_c & 0xFF) << 8) | (_d & 0xFF) + +#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_t *miniffs_openfs(void *address); /***< Open a MiniFFS filesystem */ + +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(void *ptr, size_t size, size_t nmemb, file_t *file); /***< Read bytes 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_FILE_NOT_FOUND, + //MINIFFS_, +} miniffs_error_t; + +miniffs_error_t miniffs_geterror(); /***< Return last error */ + +#ifdef BUILDING_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 /* BUILDING_HOST_TOOLS */ + +#endif /* MINIFFS_H */ diff --git a/includes/platform/file.h b/includes/platform/file.h new file mode 100644 index 0000000..d4fb2bc --- /dev/null +++ b/includes/platform/file.h @@ -0,0 +1,8 @@ +// +// Created by Manoel.Trapier on 25/05/2022. +// + +#ifndef MINIFFS_FILE_H +#define MINIFFS_FILE_H + +#endif //MINIFFS_FILE_H diff --git a/includes/platform/memory.h b/includes/platform/memory.h new file mode 100644 index 0000000..8cebf86 --- /dev/null +++ b/includes/platform/memory.h @@ -0,0 +1,8 @@ +// +// Created by Manoel.Trapier on 25/05/2022. +// + +#ifndef MINIFFS_PLATFORM_MEMORY_H +#define MINIFFS_PLATFORM_MEMORY_H + +#endif /* MINIFFS_PLATFORM_MEMORY_H */ diff --git a/mffs.c b/mffs.c new file mode 100644 index 0000000..16b56e4 --- /dev/null +++ b/mffs.c @@ -0,0 +1,11 @@ +#include +#include + +#include + + + +int main() { + printf("Hello, World!\n"); + return 0; +} diff --git a/miniffs.c b/miniffs.c new file mode 100644 index 0000000..7f10fc0 --- /dev/null +++ b/miniffs.c @@ -0,0 +1,7 @@ +/****************************************************************************** + * MiniFFS : Mini Flat File System + * miniffs.c: Shared code for all platforms. + * + * Copyright (c) 2008-2022 986-Studio. All rights reserved. + * + ******************************************************************************/ diff --git a/miniffs_tools.c b/miniffs_tools.c new file mode 100644 index 0000000..a3e24ff --- /dev/null +++ b/miniffs_tools.c @@ -0,0 +1,8 @@ +/****************************************************************************** + * MiniFFS : Mini Flat File System + * miniffs_tools.c: Contain all the funciton needed for offline tools + * + * Copyright (c) 2008-2022 986-Studio. All rights reserved. + * + ******************************************************************************/ + diff --git a/platform/file.c b/platform/file.c new file mode 100644 index 0000000..eb05145 --- /dev/null +++ b/platform/file.c @@ -0,0 +1,7 @@ +/****************************************************************************** + * MiniFFS : Mini Flat File System + * file.c: This is the file based implementation of the MiniFFS + * + * Copyright (c) 2008-2022 986-Studio. All rights reserved. + * + ******************************************************************************/ diff --git a/platform/memory.c b/platform/memory.c new file mode 100644 index 0000000..4c86a79 --- /dev/null +++ b/platform/memory.c @@ -0,0 +1,7 @@ +/****************************************************************************** + * MiniFFS : Mini Flat File System + * memory.c: This is the pure memory implementation of the MiniFFS + * + * Copyright (c) 2008-2022 986-Studio. All rights reserved. + * + ******************************************************************************/