diff --git a/deps/ox/CMakeLists.txt b/deps/ox/CMakeLists.txt index 9742d7f4..0e59b294 100644 --- a/deps/ox/CMakeLists.txt +++ b/deps/ox/CMakeLists.txt @@ -41,10 +41,8 @@ if(NOT MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") endif() - if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - # forces colored output when using ninja - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color") - endif() + # forces colored output when using ninja + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color") endif() enable_testing() diff --git a/deps/ox/src/ox/CMakeLists.txt b/deps/ox/src/ox/CMakeLists.txt index 00535097..c1f436ad 100644 --- a/deps/ox/src/ox/CMakeLists.txt +++ b/deps/ox/src/ox/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 2.8) +add_subdirectory(__buildinfo) if(OX_USE_STDLIB STREQUAL "ON") add_subdirectory(clargs) endif(OX_USE_STDLIB STREQUAL "ON") diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp index a1d9bf4c..220e1a5d 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -45,7 +45,7 @@ class FileStoreTemplate: public FileStore { using Buffer = ox::fs::NodeBuffer>; struct __attribute__((packed)) FileStoreData { - ox::LittleEndian rootNode = sizeof(NodeBuffer>); + ox::LittleEndian rootNode; }; size_t m_buffSize = 0; @@ -83,7 +83,7 @@ class FileStoreTemplate: public FileStore { * Places the given Item at the given ID. If it already exists, the * existing value will be overwritten. */ - Error placeItem(ItemPtr root, ItemPtr item); + Error placeItem(ItemPtr root, ItemPtr item, int depth = 0); /** * Finds the parent an inode by its ID. @@ -93,12 +93,12 @@ class FileStoreTemplate: public FileStore { /** * Finds an inode by its ID. */ - ItemPtr find(ItemPtr ptr, size_t id); + ItemPtr find(ItemPtr item, InodeId_t id, int depth = 0); /** * Finds an inode by its ID. */ - ItemPtr find(size_t id); + ItemPtr find(InodeId_t id); /** * Gets the root inode. @@ -183,8 +183,10 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi if (fsData) { auto root = m_buffer->ptr(fsData->rootNode); if (root.valid()) { + oxTrace("ox::fs::FileStoreTemplate::write") << "Placing" << dest->id << "on" << root->id; return placeItem(root, dest); } else { + oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode."; fsData->rootNode = dest; return 0; } @@ -265,23 +267,27 @@ typename FileStoreTemplate::FileStoreData *FileStoreTemplate::fi } template -Error FileStoreTemplate::placeItem(ItemPtr root, ItemPtr item) { - if (item->id > root->id) { - auto right = m_buffer->ptr(root->right); - if (!right.valid() || right->id == item->id) { - root->right = root; - return 0; - } else { - return placeItem(right, item); - } - } else if (item->id < root->id) { - auto left = m_buffer->ptr(root->left); - if (!left.valid() || left->id == item->id) { - root->left = root; - return 0; - } else { - return placeItem(left, item); +Error FileStoreTemplate::placeItem(ItemPtr root, ItemPtr item, int depth) { + if (depth < 5000) { + if (item->id > root->id) { + auto right = m_buffer->ptr(root->right); + if (!right.valid() || right->id == item->id) { + root->right = root; + return 0; + } else { + return placeItem(right, item, depth + 1); + } + } else if (item->id < root->id) { + auto left = m_buffer->ptr(root->left); + if (!left.valid() || left->id == item->id) { + root->left = root; + return 0; + } else { + return placeItem(left, item, depth + 1); + } } + } else { + oxTrace("ox::fs::FileStoreTemplate::placeItem::fail") << "Excessive recursion depth, stopping before stack overflow."; } return 1; } @@ -311,25 +317,36 @@ typename FileStoreTemplate::ItemPtr FileStoreTemplate::findParen } template -typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(ItemPtr item, size_t id) { - if (item.valid()) { - if (id > item->id) { - return find(m_buffer->ptr(item->right), id); - } else if (id < item->id) { - return find(m_buffer->ptr(item->left), id); - } else { - return item; +typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(ItemPtr item, InodeId_t id, int depth) { + if (depth < 5000) { + if (item.valid()) { + if (id > item->id) { + return find(m_buffer->ptr(item->right), id, depth + 1); + } else if (id < item->id) { + return find(m_buffer->ptr(item->left), id, depth + 1); + } else { + return item; + } } + } else { + oxTrace("ox::fs::FileStoreTemplate::find::fail") << "Excessive recursion depth, stopping before stack overflow. Search for:" << id; } return nullptr; } template -typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(size_t id) { - auto root = m_buffer->ptr(fileStoreData()->rootNode); - if (root.valid()) { - auto item = find(root, id); - return item; +typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(InodeId_t id) { + auto fsData = fileStoreData(); + if (fsData) { + auto root = m_buffer->ptr(fsData->rootNode); + if (root.valid()) { + auto item = find(root, id); + return item; + } else { + oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No root node"; + } + } else { + oxTrace("ox::fs::FileStoreTemplate::find::fail") << "No FileStore Data"; } return nullptr; } diff --git a/deps/ox/src/ox/fs/filestore/nodebuffer.hpp b/deps/ox/src/ox/fs/filestore/nodebuffer.hpp index 7045da3e..b146f5ff 100644 --- a/deps/ox/src/ox/fs/filestore/nodebuffer.hpp +++ b/deps/ox/src/ox/fs/filestore/nodebuffer.hpp @@ -141,7 +141,7 @@ typename NodeBuffer::ItemPtr NodeBuffer::malloc(size } else { // there is no first item, so this may be the first item if (!m_header.firstItem) { - oxTrace("ox::fs::NodeBuffer::malloc") << "No first item."; + oxTrace("ox::fs::NodeBuffer::malloc") << "No first item, initializing."; m_header.firstItem = sizeof(m_header); addr = m_header.firstItem; } diff --git a/deps/ox/src/ox/fs/test/tests.cpp b/deps/ox/src/ox/fs/test/tests.cpp index eab37f5f..4aa4a3ad 100644 --- a/deps/ox/src/ox/fs/test/tests.cpp +++ b/deps/ox/src/ox/fs/test/tests.cpp @@ -350,13 +350,16 @@ map tests = { "FileStore::readWrite", [](string) { constexpr auto buffLen = 5000; - constexpr auto str = "Hello, World!"; - constexpr auto strLen = ox_strlen(str); + constexpr auto str1 = "Hello, World!"; + constexpr auto str1Len = ox_strlen(str1); + constexpr auto str2 = "Hello, World!"; + constexpr auto str2Len = ox_strlen(str2); uint8_t buff[buffLen]; auto list = new (buff) ox::fs::NodeBuffer>(buffLen); ox::fs::FileStore32 fileStore(list, buffLen); ox_assert(fileStore.format() == 0, "FileStore::format failed."); - ox_assert(fileStore.write(5, (void*) str, strLen, 1) == 0, "FileStore::write failed."); + ox_assert(fileStore.write(4, (void*) str1, str1Len, 1) == 0, "FileStore::write 1 failed."); + ox_assert(fileStore.write(5, (void*) str2, str2Len, 1) == 0, "FileStore::write 2 failed."); return 0; } }, diff --git a/deps/ox/src/ox/std/assert.hpp b/deps/ox/src/ox/std/assert.hpp index c55e0895..86d603a0 100644 --- a/deps/ox/src/ox/std/assert.hpp +++ b/deps/ox/src/ox/std/assert.hpp @@ -14,4 +14,4 @@ void oxAssert(const char *file, int line, bool pass, const char *msg); #define ox_assert(pass, msg) oxAssert(__FILE__, __LINE__, pass, msg) #else #define ox_assert(pass, msg) -#endif \ No newline at end of file +#endif diff --git a/deps/ox/src/ox/std/byteswap.hpp b/deps/ox/src/ox/std/byteswap.hpp index 966e2fdf..3b817045 100644 --- a/deps/ox/src/ox/std/byteswap.hpp +++ b/deps/ox/src/ox/std/byteswap.hpp @@ -79,7 +79,7 @@ inline T bigEndianAdapt(T i) { template -class LittleEndian { +class __attribute__((packed)) LittleEndian { private: T m_value; diff --git a/deps/ox/src/ox/std/string.hpp b/deps/ox/src/ox/std/string.hpp index fd2d5951..ffaa9056 100644 --- a/deps/ox/src/ox/std/string.hpp +++ b/deps/ox/src/ox/std/string.hpp @@ -102,7 +102,7 @@ const BString &BString::operator+=(const char *str) { } ox_memcpy(m_buff + currentLen, str, strLen); // make sure last element is a null terminator - m_buff[cap() - 1] = 0; + m_buff[currentLen + strLen] = 0; return *this; }