Browse Source

Initial commit

Godzil 1 year ago
commit
675808e62f

+ 41 - 0
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()

+ 168 - 0
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(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+#  git_describe(<var> [<additional arguments to 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(<var> [<additional arguments to git describe> ...])
+#
+# 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(<var>)
+#
+# 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 <rpavlik@iastate.edu> <abiryan@ryand.net>
+# 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()

+ 41 - 0
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 <rpavlik@iastate.edu> <abiryan@ryand.net>
+# 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()

+ 98 - 0
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 <stdint.h>
+
+#if BUILD_TARGET == MEMORY
+#include <miniffs/platform/memory.h>
+#elif BUILD_TARGET == FILE
+#include <miniffs/platform/file.h>
+#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 */

+ 8 - 0
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

+ 8 - 0
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 */

+ 11 - 0
mffs.c

@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include <stdint.h>
+
+#include <cJSON.h>
+
+
+
+int main() {
+    printf("Hello, World!\n");
+    return 0;
+}

+ 7 - 0
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.
+ *
+ ******************************************************************************/

+ 8 - 0
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.
+ *
+ ******************************************************************************/
+

+ 7 - 0
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.
+ *
+ ******************************************************************************/

+ 7 - 0
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.
+ *
+ ******************************************************************************/