storages: fix "portable" storage on big endian
This commit is contained in:
parent
32c3834948
commit
516f7b9de0
|
@ -129,9 +129,12 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin
|
||||||
return remainder;
|
return remainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define IDENT16(x) ((uint16_t) (x))
|
||||||
#define IDENT32(x) ((uint32_t) (x))
|
#define IDENT32(x) ((uint32_t) (x))
|
||||||
#define IDENT64(x) ((uint64_t) (x))
|
#define IDENT64(x) ((uint64_t) (x))
|
||||||
|
|
||||||
|
#define SWAP16(x) ((((uint16_t) (x) & 0x00ff) << 8) | \
|
||||||
|
(((uint16_t) (x) & 0xff00) >> 8))
|
||||||
#define SWAP32(x) ((((uint32_t) (x) & 0x000000ff) << 24) | \
|
#define SWAP32(x) ((((uint32_t) (x) & 0x000000ff) << 24) | \
|
||||||
(((uint32_t) (x) & 0x0000ff00) << 8) | \
|
(((uint32_t) (x) & 0x0000ff00) << 8) | \
|
||||||
(((uint32_t) (x) & 0x00ff0000) >> 8) | \
|
(((uint32_t) (x) & 0x00ff0000) >> 8) | \
|
||||||
|
@ -145,10 +148,18 @@ static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uin
|
||||||
(((uint64_t) (x) & 0x00ff000000000000) >> 40) | \
|
(((uint64_t) (x) & 0x00ff000000000000) >> 40) | \
|
||||||
(((uint64_t) (x) & 0xff00000000000000) >> 56))
|
(((uint64_t) (x) & 0xff00000000000000) >> 56))
|
||||||
|
|
||||||
|
static inline uint16_t ident16(uint16_t x) { return x; }
|
||||||
static inline uint32_t ident32(uint32_t x) { return x; }
|
static inline uint32_t ident32(uint32_t x) { return x; }
|
||||||
static inline uint64_t ident64(uint64_t x) { return x; }
|
static inline uint64_t ident64(uint64_t x) { return x; }
|
||||||
|
|
||||||
#ifndef __OpenBSD__
|
#ifndef __OpenBSD__
|
||||||
|
# if defined(__ANDROID__) && defined(__swap16) && !defined(swap16)
|
||||||
|
# define swap16 __swap16
|
||||||
|
# elif !defined(swap16)
|
||||||
|
static inline uint16_t swap16(uint16_t x) {
|
||||||
|
return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
|
||||||
|
}
|
||||||
|
# endif
|
||||||
# if defined(__ANDROID__) && defined(__swap32) && !defined(swap32)
|
# if defined(__ANDROID__) && defined(__swap32) && !defined(swap32)
|
||||||
# define swap32 __swap32
|
# define swap32 __swap32
|
||||||
# elif !defined(swap32)
|
# elif !defined(swap32)
|
||||||
|
@ -176,6 +187,12 @@ static inline uint64_t swap64(uint64_t x) {
|
||||||
static inline void mem_inplace_ident(void *mem UNUSED, size_t n UNUSED) { }
|
static inline void mem_inplace_ident(void *mem UNUSED, size_t n UNUSED) { }
|
||||||
#undef UNUSED
|
#undef UNUSED
|
||||||
|
|
||||||
|
static inline void mem_inplace_swap16(void *mem, size_t n) {
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
((uint16_t *) mem)[i] = swap16(((const uint16_t *) mem)[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
static inline void mem_inplace_swap32(void *mem, size_t n) {
|
static inline void mem_inplace_swap32(void *mem, size_t n) {
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
@ -189,6 +206,9 @@ static inline void mem_inplace_swap64(void *mem, size_t n) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void memcpy_ident16(void *dst, const void *src, size_t n) {
|
||||||
|
memcpy(dst, src, 2 * n);
|
||||||
|
}
|
||||||
static inline void memcpy_ident32(void *dst, const void *src, size_t n) {
|
static inline void memcpy_ident32(void *dst, const void *src, size_t n) {
|
||||||
memcpy(dst, src, 4 * n);
|
memcpy(dst, src, 4 * n);
|
||||||
}
|
}
|
||||||
|
@ -196,6 +216,12 @@ static inline void memcpy_ident64(void *dst, const void *src, size_t n) {
|
||||||
memcpy(dst, src, 8 * n);
|
memcpy(dst, src, 8 * n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void memcpy_swap16(void *dst, const void *src, size_t n) {
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
((uint16_t *) dst)[i] = swap16(((const uint16_t *) src)[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
static inline void memcpy_swap32(void *dst, const void *src, size_t n) {
|
static inline void memcpy_swap32(void *dst, const void *src, size_t n) {
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
|
@ -220,6 +246,14 @@ static_assert(false, "BYTE_ORDER is undefined. Perhaps, GNU extensions are not e
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
|
#define SWAP16LE IDENT16
|
||||||
|
#define SWAP16BE SWAP16
|
||||||
|
#define swap16le ident16
|
||||||
|
#define swap16be swap16
|
||||||
|
#define mem_inplace_swap16le mem_inplace_ident
|
||||||
|
#define mem_inplace_swap16be mem_inplace_swap16
|
||||||
|
#define memcpy_swap16le memcpy_ident16
|
||||||
|
#define memcpy_swap16be memcpy_swap16
|
||||||
#define SWAP32LE IDENT32
|
#define SWAP32LE IDENT32
|
||||||
#define SWAP32BE SWAP32
|
#define SWAP32BE SWAP32
|
||||||
#define swap32le ident32
|
#define swap32le ident32
|
||||||
|
@ -239,6 +273,14 @@ static_assert(false, "BYTE_ORDER is undefined. Perhaps, GNU extensions are not e
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if BYTE_ORDER == BIG_ENDIAN
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
#define SWAP16BE IDENT16
|
||||||
|
#define SWAP16LE SWAP16
|
||||||
|
#define swap16be ident16
|
||||||
|
#define swap16le swap16
|
||||||
|
#define mem_inplace_swap16be mem_inplace_ident
|
||||||
|
#define mem_inplace_swap16le mem_inplace_swap16
|
||||||
|
#define memcpy_swap16be memcpy_ident16
|
||||||
|
#define memcpy_swap16le memcpy_swap16
|
||||||
#define SWAP32BE IDENT32
|
#define SWAP32BE IDENT32
|
||||||
#define SWAP32LE SWAP32
|
#define SWAP32LE SWAP32
|
||||||
#define swap32be ident32
|
#define swap32be ident32
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
// Copyright (c) 2019, The Monero Project
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification, are
|
||||||
|
// permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||||
|
// conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||||
|
// of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
// materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its contributors may be
|
||||||
|
// used to endorse or promote products derived from this software without specific
|
||||||
|
// prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "int-util.h"
|
||||||
|
|
||||||
|
template<typename T> T convert_swapper(T t) { return t; }
|
||||||
|
template<> inline uint16_t convert_swapper(uint16_t t) { return SWAP16LE(t); }
|
||||||
|
template<> inline int16_t convert_swapper(int16_t t) { return SWAP16LE((uint16_t&)t); }
|
||||||
|
template<> inline uint32_t convert_swapper(uint32_t t) { return SWAP32LE(t); }
|
||||||
|
template<> inline int32_t convert_swapper(int32_t t) { return SWAP32LE((uint32_t&)t); }
|
||||||
|
template<> inline uint64_t convert_swapper(uint64_t t) { return SWAP64LE(t); }
|
||||||
|
template<> inline int64_t convert_swapper(int64_t t) { return SWAP64LE((uint64_t&)t); }
|
||||||
|
template<> inline double convert_swapper(double t) { union { uint64_t u; double d; } u; u.d = t; u.u = SWAP64LE(u.u); return u.d; }
|
||||||
|
|
||||||
|
#if BYTE_ORDER == BIG_ENDIAN
|
||||||
|
#define CONVERT_POD(x) convert_swapper(x)
|
||||||
|
#else
|
||||||
|
#define CONVERT_POD(x) (x)
|
||||||
|
#endif
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include "misc_language.h"
|
#include "misc_language.h"
|
||||||
#include "portable_storage_base.h"
|
#include "portable_storage_base.h"
|
||||||
|
#include "portable_storage_bin_utils.h"
|
||||||
|
|
||||||
#ifdef EPEE_PORTABLE_STORAGE_RECURSION_LIMIT
|
#ifdef EPEE_PORTABLE_STORAGE_RECURSION_LIMIT
|
||||||
#define EPEE_PORTABLE_STORAGE_RECURSION_LIMIT_INTERNAL EPEE_PORTABLE_STORAGE_RECURSION_LIMIT
|
#define EPEE_PORTABLE_STORAGE_RECURSION_LIMIT_INTERNAL EPEE_PORTABLE_STORAGE_RECURSION_LIMIT
|
||||||
|
@ -117,6 +118,7 @@ namespace epee
|
||||||
RECURSION_LIMITATION();
|
RECURSION_LIMITATION();
|
||||||
static_assert(std::is_pod<t_pod_type>::value, "POD type expected");
|
static_assert(std::is_pod<t_pod_type>::value, "POD type expected");
|
||||||
read(&pod_val, sizeof(pod_val));
|
read(&pod_val, sizeof(pod_val));
|
||||||
|
pod_val = CONVERT_POD(pod_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class t_type>
|
template<class t_type>
|
||||||
|
@ -140,7 +142,7 @@ namespace epee
|
||||||
sa.reserve(size);
|
sa.reserve(size);
|
||||||
//TODO: add some optimization here later
|
//TODO: add some optimization here later
|
||||||
while(size--)
|
while(size--)
|
||||||
sa.m_array.push_back(read<type_name>());
|
sa.m_array.push_back(read<type_name>());
|
||||||
return storage_entry(array_entry(sa));
|
return storage_entry(array_entry(sa));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "pragma_comp_defs.h"
|
#include "pragma_comp_defs.h"
|
||||||
#include "misc_language.h"
|
#include "misc_language.h"
|
||||||
#include "portable_storage_base.h"
|
#include "portable_storage_base.h"
|
||||||
|
#include "portable_storage_bin_utils.h"
|
||||||
|
|
||||||
namespace epee
|
namespace epee
|
||||||
{
|
{
|
||||||
|
@ -42,6 +43,7 @@ namespace epee
|
||||||
{
|
{
|
||||||
pack_value v = pv << 2;
|
pack_value v = pv << 2;
|
||||||
v |= type_or;
|
v |= type_or;
|
||||||
|
v = CONVERT_POD(v);
|
||||||
strm.write((const char*)&v, sizeof(pack_value));
|
strm.write((const char*)&v, sizeof(pack_value));
|
||||||
return sizeof(pack_value);
|
return sizeof(pack_value);
|
||||||
}
|
}
|
||||||
|
@ -93,8 +95,11 @@ namespace epee
|
||||||
uint8_t type = contained_type|SERIALIZE_FLAG_ARRAY;
|
uint8_t type = contained_type|SERIALIZE_FLAG_ARRAY;
|
||||||
m_strm.write((const char*)&type, 1);
|
m_strm.write((const char*)&type, 1);
|
||||||
pack_varint(m_strm, arr_pod.m_array.size());
|
pack_varint(m_strm, arr_pod.m_array.size());
|
||||||
for(const t_pod_type& x: arr_pod.m_array)
|
for(t_pod_type x: arr_pod.m_array)
|
||||||
|
{
|
||||||
|
x = CONVERT_POD(x);
|
||||||
m_strm.write((const char*)&x, sizeof(t_pod_type));
|
m_strm.write((const char*)&x, sizeof(t_pod_type));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +152,8 @@ namespace epee
|
||||||
bool pack_pod_type(uint8_t type, const pod_type& v)
|
bool pack_pod_type(uint8_t type, const pod_type& v)
|
||||||
{
|
{
|
||||||
m_strm.write((const char*)&type, 1);
|
m_strm.write((const char*)&type, 1);
|
||||||
m_strm.write((const char*)&v, sizeof(pod_type));
|
pod_type v0 = CONVERT_POD(v);
|
||||||
|
m_strm.write((const char*)&v0, sizeof(pod_type));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//section, array_entry
|
//section, array_entry
|
||||||
|
|
Loading…
Reference in New Issue