diff --git a/.travis.yml b/.travis.yml index 71360922f..3c7d22c4b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,11 @@ language: cpp -compiler: clang -install: - - sudo apt-get install cmake +sudo: false +dist: trusty +compiler: + - clang + - gcc +addons: + apt: + packages: + - cmake script: ./scripts/cibuild diff --git a/scripts/cibuild b/scripts/cibuild index 6562daa02..87ccd5c31 100755 --- a/scripts/cibuild +++ b/scripts/cibuild @@ -1,5 +1,10 @@ -#! /usr/bin/env sh +#! /usr/bin/env bash + +set -e + ./scripts/setup_build ./scripts/setup_build_debug -make -j -C build/release all test -make -j -C build/debug all test +make -j -C build/release all +make -j -C build/release test +make -j -C build/debug all +make -j -C build/debug test diff --git a/src/ox/fs/CMakeLists.txt b/src/ox/fs/CMakeLists.txt index 2dcd8bd00..7886c83b9 100644 --- a/src/ox/fs/CMakeLists.txt +++ b/src/ox/fs/CMakeLists.txt @@ -24,8 +24,10 @@ install( include/ox/fs ) -install(TARGETS oxfstool +install(TARGETS oxfstool OxFS RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib ) if(OX_BUILD_EXEC STREQUAL "ON") diff --git a/src/ox/fs/filestore.hpp b/src/ox/fs/filestore.hpp index 84972fa6e..b21d0bb03 100644 --- a/src/ox/fs/filestore.hpp +++ b/src/ox/fs/filestore.hpp @@ -16,13 +16,13 @@ template class FileStore { public: - typedef uint16_t InodeId_t; + typedef uint16_t InodeId_t; typedef FsT FsSize_t; struct StatInfo { InodeId_t inodeId; FsSize_t size; - uint8_t fileType; + uint8_t fileType; }; private: @@ -31,13 +31,13 @@ class FileStore { FsSize_t prev, next; FsSize_t dataLen; InodeId_t id; - uint8_t refs; - uint8_t fileType; + uint8_t refs; + uint8_t fileType; FsSize_t left, right; FsSize_t size(); void setId(InodeId_t); - void setData(void *data, FsSize_t size); + void setData(void *data, FsSize_t size); void *data(); }; @@ -52,7 +52,7 @@ class FileStore { * @param data the contents of the file * @param dataLen the number of bytes data points to */ - int write(void *data, FsSize_t dataLen, uint8_t fileType = 0); + int write(void *data, FsSize_t dataLen, uint8_t fileType = 0); /** * Writes the given data to a "file" with the given id. @@ -60,7 +60,7 @@ class FileStore { * @param data the contents of the file * @param dataLen the number of bytes data points to */ - int write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0); + int write(InodeId_t id, void *data, FsSize_t dataLen, uint8_t fileType = 0); /** * Removes the inode of the given ID. @@ -92,9 +92,9 @@ class FileStore { */ FsSize_t size(); - static uint8_t version(); - - static uint8_t *format(uint8_t *buffer, FsSize_t size, uint32_t fsType = 0); + static uint8_t version(); + + static uint8_t *format(uint8_t *buffer, FsSize_t size, uint32_t fsType = 0); private: /** @@ -166,11 +166,11 @@ class FileStore { */ void updateInodeAddress(InodeId_t id, FsSize_t addr); - uint8_t *begin() { - return (uint8_t*) this; + uint8_t *begin() { + return (uint8_t*) this; } - uint8_t *end() { + uint8_t *end() { return begin() + this->m_size; } @@ -411,10 +411,10 @@ FsSize_t FileStore::nextInodeAddr() { template void *FileStore::alloc(FsSize_t size) { FsSize_t next = nextInodeAddr(); - if ((next + size) > (uint64_t) end()) { + if ((next + size) > (uint64_t) end()) { compress(firstInode()); next = nextInodeAddr(); - if ((next + size) > (uint64_t) end()) { + if ((next + size) > (uint64_t) end()) { return nullptr; } } @@ -480,7 +480,7 @@ FsSize_t FileStore::ptr(void *ptr) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif - return ((uint8_t*) ptr) - begin(); + return ((uint8_t*) ptr) - begin(); #ifdef _MSC_VER #pragma warning(default:4244) #endif @@ -512,7 +512,7 @@ uint8_t *FileStore::format(uint8_t *buffer, FsSize_t size, uint32_t fs ((Inode*) (fs + 1))->prev = fs->firstInode(); fs->lastInode()->next = sizeof(FileStore); - return (uint8_t*) buffer; + return (uint8_t*) buffer; } typedef FileStore FileStore16; diff --git a/src/ox/fs/filesystem.cpp b/src/ox/fs/filesystem.cpp index d4405c97b..7f488656b 100644 --- a/src/ox/fs/filesystem.cpp +++ b/src/ox/fs/filesystem.cpp @@ -29,12 +29,5 @@ FileSystem *createFileSystem(void *buff) { return fs; } -template<> -FsType FileSystemTemplate::FS_TYPE = OxFS_16; -template<> -FsType FileSystemTemplate::FS_TYPE = OxFS_32; -template<> -FsType FileSystemTemplate::FS_TYPE = OxFS_64; - } } diff --git a/src/ox/fs/filesystem.hpp b/src/ox/fs/filesystem.hpp index 12db462dc..1579022a4 100644 --- a/src/ox/fs/filesystem.hpp +++ b/src/ox/fs/filesystem.hpp @@ -36,9 +36,9 @@ class FileSystem { public: virtual ~FileSystem() {}; - virtual int read(uint64_t inode, void *buffer, uint64_t size) = 0; + virtual int read(uint64_t inode, void *buffer, size_t size) = 0; - virtual uint8_t *read(uint64_t inode, uint64_t *size) = 0; + virtual uint8_t *read(uint64_t inode, size_t *size) = 0; virtual int remove(uint64_t inode) = 0; @@ -49,7 +49,7 @@ class FileSystem { FileSystem *createFileSystem(void *buff); -template +template class FileSystemTemplate: public FileSystem { private: @@ -82,8 +82,6 @@ class FileSystemTemplate: public FileSystem { // static members static typename FileStore::InodeId_t INODE_ROOT_DIR; - static FsType FS_TYPE; - FileStore *store = nullptr; public: @@ -93,9 +91,9 @@ class FileSystemTemplate: public FileSystem { int read(const char *path, void *buffer); - uint8_t *read(uint64_t inode, uint64_t *size) override; + uint8_t *read(uint64_t inode, size_t *size) override; - int read(uint64_t inode, void *buffer, uint64_t size) override; + int read(uint64_t inode, void *buffer, size_t size) override; int remove(uint64_t inode) override; @@ -108,21 +106,21 @@ class FileSystemTemplate: public FileSystem { static uint8_t *format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories); }; -template -FileSystemTemplate::FileSystemTemplate(void *buff) { +template +FileSystemTemplate::FileSystemTemplate(void *buff) { store = (FileStore*) buff; } -template -typename FileStore::InodeId_t FileSystemTemplate::INODE_ROOT_DIR = 2; +template +typename FileStore::InodeId_t FileSystemTemplate::INODE_ROOT_DIR = 2; -template -int FileSystemTemplate::mkdir(const char *path) { +template +int FileSystemTemplate::mkdir(const char *path) { return 0; } -template -FileStat FileSystemTemplate::stat(const char *path) { +template +FileStat FileSystemTemplate::stat(const char *path) { FileStat stat; return stat; } @@ -130,8 +128,8 @@ FileStat FileSystemTemplate::stat(const char *path) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -FileStat FileSystemTemplate::stat(uint64_t inode) { +template +FileStat FileSystemTemplate::stat(uint64_t inode) { FileStat stat; auto s = store->stat(inode); stat.size = s.size; @@ -146,8 +144,8 @@ FileStat FileSystemTemplate::stat(uint64_t inode) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -int FileSystemTemplate::read(uint64_t inode, void *buffer, uint64_t size) { +template +int FileSystemTemplate::read(uint64_t inode, void *buffer, size_t size) { auto err = 1; auto s = store->stat(inode); if (size == s.size) { @@ -162,8 +160,8 @@ int FileSystemTemplate::read(uint64_t inode, void *buffer, uint64_t s #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -uint8_t *FileSystemTemplate::read(uint64_t inode, uint64_t *size) { +template +uint8_t *FileSystemTemplate::read(uint64_t inode, size_t *size) { auto s = store->stat(inode); auto buff = new uint8_t[s.size]; if (size) { @@ -182,8 +180,8 @@ uint8_t *FileSystemTemplate::read(uint64_t inode, uint64_t *size) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -int FileSystemTemplate::remove(uint64_t inode) { +template +int FileSystemTemplate::remove(uint64_t inode) { return store->remove(inode); } #ifdef _MSC_VER @@ -193,8 +191,8 @@ int FileSystemTemplate::remove(uint64_t inode) { #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -int FileSystemTemplate::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { +template +int FileSystemTemplate::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) { return store->write(inode, buffer, size, fileType); } #ifdef _MSC_VER @@ -204,16 +202,16 @@ int FileSystemTemplate::write(uint64_t inode, void *buffer, uint64_t #ifdef _MSC_VER #pragma warning(disable:4244) #endif -template -uint8_t *FileSystemTemplate::format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories) { - buffer = FileStore::format((uint8_t*) buffer, size, (uint32_t) FileSystemTemplate::FS_TYPE); - auto fs = createFileSystem(buffer); +template +uint8_t *FileSystemTemplate::format(void *buffer, typename FileStore::FsSize_t size, bool useDirectories) { + buffer = FileStore::format((uint8_t*) buffer, size, (uint32_t) FS_TYPE); + FileSystemTemplate fs(buffer); if (buffer && useDirectories) { char dirBuff[sizeof(Directory) + sizeof(DirectoryEntry) + 2]; auto *dir = (Directory*) dirBuff; dir->files(); - fs->write(INODE_ROOT_DIR, dirBuff, useDirectories); + fs.write(INODE_ROOT_DIR, dirBuff, useDirectories, FileType::Directory); } return (uint8_t*) buffer; @@ -222,9 +220,9 @@ uint8_t *FileSystemTemplate::format(void *buffer, typename FileStore: #pragma warning(default:4244) #endif -typedef FileSystemTemplate FileSystem16; -typedef FileSystemTemplate FileSystem32; -typedef FileSystemTemplate FileSystem64; +typedef FileSystemTemplate FileSystem16; +typedef FileSystemTemplate FileSystem32; +typedef FileSystemTemplate FileSystem64; } } diff --git a/src/ox/fs/oxfstool.cpp b/src/ox/fs/oxfstool.cpp index c99592c01..5a420f037 100644 --- a/src/ox/fs/oxfstool.cpp +++ b/src/ox/fs/oxfstool.cpp @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include #include #include #include @@ -17,6 +18,7 @@ #endif using namespace ox::fs; +using namespace std; const static auto oxfstoolVersion = "1.0.0"; const static auto usage = "usage:\n" @@ -44,7 +46,7 @@ char *loadFileBuff(const char *path, ::size_t *sizeOut = nullptr) { } } -uint64_t bytes(const char *str) { +size_t bytes(const char *str) { auto size = ::ox_strlen(str); const auto lastChar = str[size-1]; auto multiplier = 1; @@ -69,7 +71,7 @@ uint64_t bytes(const char *str) { multiplier = -1; } } - const auto retval = ((uint64_t) ::ox_atoi(copy)) * multiplier; + const auto retval = ((size_t) ox_atoi(copy)) * multiplier; delete []copy; return retval; } @@ -79,16 +81,17 @@ int format(int argc, char **args) { auto err = 0; if (argc >= 5) { auto type = ox_atoi(args[2]); + cout << args[3] << endl; auto size = bytes(args[3]); auto path = args[4]; auto buff = (uint8_t*) malloc(size); - printf("Size: %llu bytes\n", size); - printf("Type: %d\n", type); + cout << "Size: " << size << " bytes\n"; + cout << "Type: " << type << endl; if (size < sizeof(FileStore64)) { err = 1; - fprintf(stderr, "File system size %llu too small, must be at least %llu\n", (uint64_t) size, (uint64_t) sizeof(FileStore64)); + cerr << "File system size " << size << " too small, must be at least " << sizeof(FileStore64) << endl; } if (!err) { @@ -136,8 +139,8 @@ int read(int argc, char **args) { if (argc >= 4) { auto fsPath = args[2]; auto inode = ox_atoi(args[3]); - ::size_t fsSize; - uint64_t fileSize; + size_t fsSize; + size_t fileSize; auto fsBuff = loadFileBuff(fsPath, &fsSize); diff --git a/src/ox/std/memops.cpp b/src/ox/std/memops.cpp index fc91a3664..b58713f37 100644 --- a/src/ox/std/memops.cpp +++ b/src/ox/std/memops.cpp @@ -7,18 +7,18 @@ */ #include "memops.hpp" -void *ox_memcpy(void *dest, const void *src, size_t size) { +void *ox_memcpy(void *dest, const void *src, int64_t size) { char *srcBuf = (char*) src; char *dstBuf = (char*) dest; - for (size_t i = 0; i < size; i++) { + for (int64_t i = 0; i < size; i++) { dstBuf[i] = (char) srcBuf[i]; } return dest; } -void *ox_memset(void *ptr, int val, size_t size) { +void *ox_memset(void *ptr, int val, int64_t size) { char *buf = (char*) ptr; - for (size_t i = 0; i < size; i++) { + for (int64_t i = 0; i < size; i++) { buf[i] = val; } return ptr; diff --git a/src/ox/std/memops.hpp b/src/ox/std/memops.hpp index 490c2c3cb..d6b1dc9e1 100644 --- a/src/ox/std/memops.hpp +++ b/src/ox/std/memops.hpp @@ -9,6 +9,6 @@ #include "types.hpp" -void *ox_memcpy(void *src, const void *dest, size_t size); +void *ox_memcpy(void *src, const void *dest, int64_t size); -void *ox_memset(void *ptr, int val, size_t size); +void *ox_memset(void *ptr, int val, int64_t size); diff --git a/src/ox/std/strops.cpp b/src/ox/std/strops.cpp index 1332ccc11..76c8d5c53 100644 --- a/src/ox/std/strops.cpp +++ b/src/ox/std/strops.cpp @@ -24,7 +24,7 @@ int ox_strcmp(const char *str1, const char *str2) { return retval; } -size_t ox_strlen(const char *str1) { +int ox_strlen(const char *str1) { int len; for (len = 0; str1[len]; len++); return len; @@ -34,7 +34,7 @@ int ox_atoi(const char *str) { int total = 0; int multiplier = 1; - for (auto i = ox_strlen(str) - 1; i != 0; i--) { + for (auto i = ox_strlen(str) - 1; i != -1; i--) { total += (str[i] - '0') * multiplier; multiplier *= 10; } diff --git a/src/ox/std/strops.hpp b/src/ox/std/strops.hpp index b67eaff39..1aa2bb095 100644 --- a/src/ox/std/strops.hpp +++ b/src/ox/std/strops.hpp @@ -11,6 +11,6 @@ int ox_strcmp(const char *str1, const char *str2); -size_t ox_strlen(const char *str1); +int ox_strlen(const char *str1); int ox_atoi(const char *str); diff --git a/src/ox/std/types.hpp b/src/ox/std/types.hpp index 1c16af4ec..bc4a2607e 100644 --- a/src/ox/std/types.hpp +++ b/src/ox/std/types.hpp @@ -14,8 +14,13 @@ typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned int uint32_t; typedef unsigned uint_t; -typedef long int64_t; +#if defined(_MSC_VER) || defined(__APPLE__) +typedef long long int64_t; typedef unsigned long long uint64_t; +#else +typedef long int64_t; +typedef unsigned long uint64_t; +#endif namespace ox { namespace std {