From 4c55409dc42563b150cba2a71672416ddd0f65da Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sun, 9 Apr 2017 08:30:21 -0500 Subject: [PATCH] Add endianness adapters to OxFS --- src/ox/fs/filestore.hpp | 56 +++++++++------- src/ox/std/CMakeLists.txt | 1 + src/ox/std/byteswap.cpp | 9 +++ src/ox/std/byteswap.hpp | 134 ++++++++++++++++++++++++++++++++++++++ src/ox/std/std.hpp | 1 + 5 files changed, 176 insertions(+), 25 deletions(-) create mode 100644 src/ox/std/byteswap.cpp create mode 100644 src/ox/std/byteswap.hpp diff --git a/src/ox/fs/filestore.hpp b/src/ox/fs/filestore.hpp index 5a8402325..b971c0a4c 100644 --- a/src/ox/fs/filestore.hpp +++ b/src/ox/fs/filestore.hpp @@ -45,52 +45,52 @@ struct FileStoreHeader { template void FileStoreHeader::setVersion(uint16_t version) { - m_version = version; + m_version = std::toLittleEndian(version); } template uint16_t FileStoreHeader::getVersion() { - return m_version; + return std::nativizeLittleEndian(m_version); } template void FileStoreHeader::setFsType(uint16_t fsType) { - m_fsType = fsType; + m_fsType = std::toLittleEndian(fsType); } template uint16_t FileStoreHeader::getFsType() { - return m_fsType; + return std::nativizeLittleEndian(m_fsType); } template void FileStoreHeader::setSize(FsSize_t size) { - m_size = size; + m_size = std::toLittleEndian(size); } template FsSize_t FileStoreHeader::getSize() { - return m_size; + return std::nativizeLittleEndian(m_size); } template void FileStoreHeader::setMemUsed(FsSize_t memUsed) { - m_memUsed = memUsed; + m_memUsed = std::toLittleEndian(memUsed); } template FsSize_t FileStoreHeader::getMemUsed() { - return m_memUsed; + return std::nativizeLittleEndian(m_memUsed); } template void FileStoreHeader::setRootInode(FsSize_t rootInode) { - m_rootInode = rootInode; + m_rootInode = std::toLittleEndian(rootInode); } template FsSize_t FileStoreHeader::getRootInode() { - return m_rootInode; + return std::nativizeLittleEndian(m_rootInode); } template @@ -121,6 +121,7 @@ class FileStore { public: typename Header::FsSize_t size(); + void setDataLen(typename Header::FsSize_t); typename Header::FsSize_t getDataLen(); void setPrev(typename Header::FsSize_t); @@ -315,78 +316,83 @@ class FileStore { template typename Header::FsSize_t FileStore
::Inode::size() { - return sizeof(Inode) + m_dataLen; + return std::nativizeLittleEndian(sizeof(Inode) + getDataLen()); +} + +template +void FileStore
::Inode::setDataLen(typename Header::FsSize_t dataLen) { + this->m_dataLen = std::toLittleEndian(dataLen); } template typename Header::FsSize_t FileStore
::Inode::getDataLen() { - return this->m_dataLen; + return std::nativizeLittleEndian(this->m_dataLen); } template void FileStore
::Inode::setPrev(typename Header::FsSize_t prev) { - this->m_prev = prev; + this->m_prev = std::toLittleEndian(prev); } template typename Header::FsSize_t FileStore
::Inode::getPrev() { - return this->m_prev; + return std::nativizeLittleEndian(this->m_prev); } template void FileStore
::Inode::setNext(typename Header::FsSize_t next) { - this->m_next = next; + this->m_next = std::toLittleEndian(next); } template typename Header::FsSize_t FileStore
::Inode::getNext() { - return this->m_next; + return std::nativizeLittleEndian(this->m_next); } template void FileStore
::Inode::setId(InodeId_t id) { - this->m_id = id; + this->m_id = std::toLittleEndian(id); } template typename Header::InodeId_t FileStore
::Inode::getId() { - return this->m_id; + return std::nativizeLittleEndian(this->m_id); } template void FileStore
::Inode::setFileType(uint8_t fileType) { - this->m_fileType = fileType; + this->m_fileType = std::toLittleEndian(fileType); } template uint8_t FileStore
::Inode::getFileType() { - return this->m_fileType; + return std::nativizeLittleEndian(this->m_fileType); } template void FileStore
::Inode::setLeft(typename Header::FsSize_t left) { - this->m_left = left; + this->m_left = std::toLittleEndian(left); } template typename Header::FsSize_t FileStore
::Inode::getLeft() { - return this->m_left; + return std::nativizeLittleEndian(this->m_left); } template void FileStore
::Inode::setRight(typename Header::FsSize_t right) { - this->m_right = right; + this->m_right = std::toLittleEndian(right); } template typename Header::FsSize_t FileStore
::Inode::getRight() { - return this->m_right; + return std::nativizeLittleEndian(this->m_right); } template void FileStore
::Inode::setData(void *data, typename Header::FsSize_t size) { ox_memcpy(this->getData(), data, size); - m_dataLen = size; + setDataLen(size); } diff --git a/src/ox/std/CMakeLists.txt b/src/ox/std/CMakeLists.txt index f24ef2fdf..6c28d48a1 100644 --- a/src/ox/std/CMakeLists.txt +++ b/src/ox/std/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8) add_library( OxStd + byteswap.cpp memops.cpp strops.cpp ) diff --git a/src/ox/std/byteswap.cpp b/src/ox/std/byteswap.cpp new file mode 100644 index 000000000..68801f3d6 --- /dev/null +++ b/src/ox/std/byteswap.cpp @@ -0,0 +1,9 @@ +/* + * Copyright 2015 - 2017 gtalent2@gmail.com + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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 "byteswap.hpp" diff --git a/src/ox/std/byteswap.hpp b/src/ox/std/byteswap.hpp new file mode 100644 index 000000000..7d247e7a4 --- /dev/null +++ b/src/ox/std/byteswap.hpp @@ -0,0 +1,134 @@ +/* + * Copyright 2015 - 2017 gtalent2@gmail.com + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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/. + */ + +#pragma once + +#include "types.hpp" + +namespace ox { +namespace std { + +inline uint16_t byteSwap(uint16_t i) { + return (i << 8) | (i >> 8); +} + +inline uint32_t byteSwap(uint32_t i) { + return ((i >> 24) & 0x000000ff) | + ((i >> 8) & 0x0000ff00) | + ((i << 8) & 0x00ff0000) | + ((i << 24) & 0xff000000); +} + +inline uint64_t byteSwap(uint64_t i) { + return ((i >> 56) & 0x00000000000000ff) | + ((i >> 40) & 0x000000000000ff00) | + ((i >> 24) & 0x0000000000ff0000) | + ((i >> 8) & 0x00000000ff000000) | + ((i << 8) & 0x000000ff00000000) | + ((i << 24) & 0x0000ff0000000000) | + ((i << 40) & 0x00ff000000000000) | + ((i << 56) & 0xff00000000000000); +} + + +/** + * Takes a little endian int and byte swaps if the platform is big endian. + */ +inline uint8_t nativizeLittleEndian(uint8_t i) { + return i; +} + +/** + * Takes a little endian int and byte swaps if the platform is big endian. + */ +inline uint16_t nativizeLittleEndian(uint16_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +/** + * Takes a little endian int and byte swaps if the platform is big endian. + */ +inline uint32_t nativizeLittleEndian(uint32_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +/** + * Takes a little endian int and byte swaps if the platform is big endian. + */ +inline uint64_t nativizeLittleEndian(uint64_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + + +inline uint8_t toLittleEndian(uint8_t i) { + return i; +} + +inline uint16_t toLittleEndian(uint16_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +inline uint32_t toLittleEndian(uint32_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +inline uint64_t toLittleEndian(uint64_t i) { +#ifdef __BIG_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + + +inline uint16_t toBigEndian(uint16_t i) { +#ifdef __LITTLE_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +inline uint32_t toBigEndian(uint32_t i) { +#ifdef __LITTLE_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +inline uint64_t toBigEndian(uint64_t i) { +#ifdef __LITTLE_ENDIAN__ + return byteSwap(i); +#else + return i; +#endif +} + +} +} diff --git a/src/ox/std/std.hpp b/src/ox/std/std.hpp index 7e7f1c9ca..823b00943 100644 --- a/src/ox/std/std.hpp +++ b/src/ox/std/std.hpp @@ -7,6 +7,7 @@ */ #pragma once +#include "byteswap.hpp" #include "memops.hpp" #include "strops.hpp" #include "types.hpp"