Add endianness adapters to OxFS

This commit is contained in:
2017-04-09 08:30:21 -05:00
parent b11949b46e
commit 4c55409dc4
5 changed files with 176 additions and 25 deletions
+31 -25
View File
@@ -45,52 +45,52 @@ struct FileStoreHeader {
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
void FileStoreHeader<FsSize_t, InodeId_t>::setVersion(uint16_t version) { void FileStoreHeader<FsSize_t, InodeId_t>::setVersion(uint16_t version) {
m_version = version; m_version = std::toLittleEndian(version);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getVersion() { uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getVersion() {
return m_version; return std::nativizeLittleEndian(m_version);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
void FileStoreHeader<FsSize_t, InodeId_t>::setFsType(uint16_t fsType) { void FileStoreHeader<FsSize_t, InodeId_t>::setFsType(uint16_t fsType) {
m_fsType = fsType; m_fsType = std::toLittleEndian(fsType);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getFsType() { uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getFsType() {
return m_fsType; return std::nativizeLittleEndian(m_fsType);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
void FileStoreHeader<FsSize_t, InodeId_t>::setSize(FsSize_t size) { void FileStoreHeader<FsSize_t, InodeId_t>::setSize(FsSize_t size) {
m_size = size; m_size = std::toLittleEndian(size);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getSize() { FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getSize() {
return m_size; return std::nativizeLittleEndian(m_size);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
void FileStoreHeader<FsSize_t, InodeId_t>::setMemUsed(FsSize_t memUsed) { void FileStoreHeader<FsSize_t, InodeId_t>::setMemUsed(FsSize_t memUsed) {
m_memUsed = memUsed; m_memUsed = std::toLittleEndian(memUsed);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getMemUsed() { FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getMemUsed() {
return m_memUsed; return std::nativizeLittleEndian(m_memUsed);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
void FileStoreHeader<FsSize_t, InodeId_t>::setRootInode(FsSize_t rootInode) { void FileStoreHeader<FsSize_t, InodeId_t>::setRootInode(FsSize_t rootInode) {
m_rootInode = rootInode; m_rootInode = std::toLittleEndian(rootInode);
} }
template<typename FsSize_t, typename InodeId_t> template<typename FsSize_t, typename InodeId_t>
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getRootInode() { FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getRootInode() {
return m_rootInode; return std::nativizeLittleEndian(m_rootInode);
} }
template<typename Header> template<typename Header>
@@ -121,6 +121,7 @@ class FileStore {
public: public:
typename Header::FsSize_t size(); typename Header::FsSize_t size();
void setDataLen(typename Header::FsSize_t);
typename Header::FsSize_t getDataLen(); typename Header::FsSize_t getDataLen();
void setPrev(typename Header::FsSize_t); void setPrev(typename Header::FsSize_t);
@@ -315,78 +316,83 @@ class FileStore {
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::size() { typename Header::FsSize_t FileStore<Header>::Inode::size() {
return sizeof(Inode) + m_dataLen; return std::nativizeLittleEndian(sizeof(Inode) + getDataLen());
}
template<typename Header>
void FileStore<Header>::Inode::setDataLen(typename Header::FsSize_t dataLen) {
this->m_dataLen = std::toLittleEndian(dataLen);
} }
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::getDataLen() { typename Header::FsSize_t FileStore<Header>::Inode::getDataLen() {
return this->m_dataLen; return std::nativizeLittleEndian(this->m_dataLen);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setPrev(typename Header::FsSize_t prev) { void FileStore<Header>::Inode::setPrev(typename Header::FsSize_t prev) {
this->m_prev = prev; this->m_prev = std::toLittleEndian(prev);
} }
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::getPrev() { typename Header::FsSize_t FileStore<Header>::Inode::getPrev() {
return this->m_prev; return std::nativizeLittleEndian(this->m_prev);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setNext(typename Header::FsSize_t next) { void FileStore<Header>::Inode::setNext(typename Header::FsSize_t next) {
this->m_next = next; this->m_next = std::toLittleEndian(next);
} }
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::getNext() { typename Header::FsSize_t FileStore<Header>::Inode::getNext() {
return this->m_next; return std::nativizeLittleEndian(this->m_next);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setId(InodeId_t id) { void FileStore<Header>::Inode::setId(InodeId_t id) {
this->m_id = id; this->m_id = std::toLittleEndian(id);
} }
template<typename Header> template<typename Header>
typename Header::InodeId_t FileStore<Header>::Inode::getId() { typename Header::InodeId_t FileStore<Header>::Inode::getId() {
return this->m_id; return std::nativizeLittleEndian(this->m_id);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setFileType(uint8_t fileType) { void FileStore<Header>::Inode::setFileType(uint8_t fileType) {
this->m_fileType = fileType; this->m_fileType = std::toLittleEndian(fileType);
} }
template<typename Header> template<typename Header>
uint8_t FileStore<Header>::Inode::getFileType() { uint8_t FileStore<Header>::Inode::getFileType() {
return this->m_fileType; return std::nativizeLittleEndian(this->m_fileType);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setLeft(typename Header::FsSize_t left) { void FileStore<Header>::Inode::setLeft(typename Header::FsSize_t left) {
this->m_left = left; this->m_left = std::toLittleEndian(left);
} }
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::getLeft() { typename Header::FsSize_t FileStore<Header>::Inode::getLeft() {
return this->m_left; return std::nativizeLittleEndian(this->m_left);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setRight(typename Header::FsSize_t right) { void FileStore<Header>::Inode::setRight(typename Header::FsSize_t right) {
this->m_right = right; this->m_right = std::toLittleEndian(right);
} }
template<typename Header> template<typename Header>
typename Header::FsSize_t FileStore<Header>::Inode::getRight() { typename Header::FsSize_t FileStore<Header>::Inode::getRight() {
return this->m_right; return std::nativizeLittleEndian(this->m_right);
} }
template<typename Header> template<typename Header>
void FileStore<Header>::Inode::setData(void *data, typename Header::FsSize_t size) { void FileStore<Header>::Inode::setData(void *data, typename Header::FsSize_t size) {
ox_memcpy(this->getData(), data, size); ox_memcpy(this->getData(), data, size);
m_dataLen = size; setDataLen(size);
} }
+1
View File
@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8)
add_library( add_library(
OxStd OxStd
byteswap.cpp
memops.cpp memops.cpp
strops.cpp strops.cpp
) )
+9
View File
@@ -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"
+134
View File
@@ -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
}
}
}
+1
View File
@@ -7,6 +7,7 @@
*/ */
#pragma once #pragma once
#include "byteswap.hpp"
#include "memops.hpp" #include "memops.hpp"
#include "strops.hpp" #include "strops.hpp"
#include "types.hpp" #include "types.hpp"