aboutsummaryrefslogtreecommitdiff
path: root/src/util/serialize.h
diff options
context:
space:
mode:
authorElias Fleckenstein <54945686+EliasFleckenstein03@users.noreply.github.com>2020-11-04 16:57:47 +0100
committerGitHub <noreply@github.com>2020-11-04 16:57:47 +0100
commit3e16c3a78fff61c20e63ba730d15e94e3bb877b4 (patch)
treec070350db219f2c4241d22bc31949685c7b42fe9 /src/util/serialize.h
parent5d9ae5a91c544fc7fbd475decf47cef7e09ef8fc (diff)
parent6ccb5835ff55d85156be91473c598eca9d6cb9a6 (diff)
downloaddragonfireclient-3e16c3a78fff61c20e63ba730d15e94e3bb877b4.tar.xz
Merge branch 'master' into master
Diffstat (limited to 'src/util/serialize.h')
-rw-r--r--src/util/serialize.h280
1 files changed, 145 insertions, 135 deletions
diff --git a/src/util/serialize.h b/src/util/serialize.h
index 3ecc8e85b..a4b5a234a 100644
--- a/src/util/serialize.h
+++ b/src/util/serialize.h
@@ -21,22 +21,22 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_bloated.h"
#include "exceptions.h" // for SerializationError
-#include "debug.h" // for assert
+#include "debug.h" // for assert
#include "ieee_float.h"
#include "config.h"
#if HAVE_ENDIAN_H
-#ifdef _WIN32
-#define __BYTE_ORDER 0
-#define __LITTLE_ENDIAN 0
-#define __BIG_ENDIAN 1
-#elif defined(__MACH__) && defined(__APPLE__)
-#include <machine/endian.h>
-#elif defined(__FreeBSD__) || defined(__DragonFly__)
-#include <sys/endian.h>
-#else
-#include <endian.h>
-#endif
+ #ifdef _WIN32
+ #define __BYTE_ORDER 0
+ #define __LITTLE_ENDIAN 0
+ #define __BIG_ENDIAN 1
+ #elif defined(__MACH__) && defined(__APPLE__)
+ #include <machine/endian.h>
+ #elif defined(__FreeBSD__) || defined(__DragonFly__)
+ #include <sys/endian.h>
+ #else
+ #include <endian.h>
+ #endif
#endif
#include <cstring> // for memcpy
#include <iostream>
@@ -60,6 +60,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
// 64 MB ought to be enough for anybody - Billy G.
#define LONG_STRING_MAX_LEN (64 * 1024 * 1024)
+
extern FloatType g_serialize_f32_type;
#if HAVE_ENDIAN_H
@@ -110,20 +111,24 @@ inline void writeU64(u8 *data, u64 i)
inline u16 readU16(const u8 *data)
{
- return ((u16)data[0] << 8) | ((u16)data[1] << 0);
+ return
+ ((u16)data[0] << 8) | ((u16)data[1] << 0);
}
inline u32 readU32(const u8 *data)
{
- return ((u32)data[0] << 24) | ((u32)data[1] << 16) | ((u32)data[2] << 8) |
- ((u32)data[3] << 0);
+ return
+ ((u32)data[0] << 24) | ((u32)data[1] << 16) |
+ ((u32)data[2] << 8) | ((u32)data[3] << 0);
}
inline u64 readU64(const u8 *data)
{
- return ((u64)data[0] << 56) | ((u64)data[1] << 48) | ((u64)data[2] << 40) |
- ((u64)data[3] << 32) | ((u64)data[4] << 24) | ((u64)data[5] << 16) |
- ((u64)data[6] << 8) | ((u64)data[7] << 0);
+ return
+ ((u64)data[0] << 56) | ((u64)data[1] << 48) |
+ ((u64)data[2] << 40) | ((u64)data[3] << 32) |
+ ((u64)data[4] << 24) | ((u64)data[5] << 16) |
+ ((u64)data[6] << 8) | ((u64)data[7] << 0);
}
inline void writeU16(u8 *data, u16 i)
@@ -136,8 +141,8 @@ inline void writeU32(u8 *data, u32 i)
{
data[0] = (i >> 24) & 0xFF;
data[1] = (i >> 16) & 0xFF;
- data[2] = (i >> 8) & 0xFF;
- data[3] = (i >> 0) & 0xFF;
+ data[2] = (i >> 8) & 0xFF;
+ data[3] = (i >> 0) & 0xFF;
}
inline void writeU64(u8 *data, u64 i)
@@ -148,8 +153,8 @@ inline void writeU64(u8 *data, u64 i)
data[3] = (i >> 32) & 0xFF;
data[4] = (i >> 24) & 0xFF;
data[5] = (i >> 16) & 0xFF;
- data[6] = (i >> 8) & 0xFF;
- data[7] = (i >> 0) & 0xFF;
+ data[6] = (i >> 8) & 0xFF;
+ data[7] = (i >> 0) & 0xFF;
}
#endif // HAVE_ENDIAN_H
@@ -192,10 +197,10 @@ inline f32 readF32(const u8 *data)
switch (g_serialize_f32_type) {
case FLOATTYPE_SYSTEM: {
- f32 f;
- memcpy(&f, &u, 4);
- return f;
- }
+ f32 f;
+ memcpy(&f, &u, 4);
+ return f;
+ }
case FLOATTYPE_SLOW:
return u32Tof32Slow(u);
case FLOATTYPE_UNKNOWN: // First initialization
@@ -285,7 +290,7 @@ inline void writeS8(u8 *data, s8 i)
inline void writeS16(u8 *data, s16 i)
{
- writeU16(data, (u16)i);
+ writeU16(data, (u16)i);
}
inline void writeS32(u8 *data, s32 i)
@@ -308,10 +313,10 @@ inline void writeF32(u8 *data, f32 i)
{
switch (g_serialize_f32_type) {
case FLOATTYPE_SYSTEM: {
- u32 u;
- memcpy(&u, &i, 4);
- return writeU32(data, u);
- }
+ u32 u;
+ memcpy(&u, &i, 4);
+ return writeU32(data, u);
+ }
case FLOATTYPE_SLOW:
return writeU32(data, f32Tou32Slow(i));
case FLOATTYPE_UNKNOWN: // First initialization
@@ -376,58 +381,58 @@ inline void writeV3F32(u8 *data, v3f p)
//// Iostream wrapper for data read/write
////
-#define MAKE_STREAM_READ_FXN(T, N, S) \
- inline T read##N(std::istream &is) \
- { \
- char buf[S] = {0}; \
- is.read(buf, sizeof(buf)); \
- return read##N((u8 *)buf); \
+#define MAKE_STREAM_READ_FXN(T, N, S) \
+ inline T read ## N(std::istream &is) \
+ { \
+ char buf[S] = {0}; \
+ is.read(buf, sizeof(buf)); \
+ return read ## N((u8 *)buf); \
}
-#define MAKE_STREAM_WRITE_FXN(T, N, S) \
- inline void write##N(std::ostream &os, T val) \
- { \
- char buf[S]; \
- write##N((u8 *)buf, val); \
- os.write(buf, sizeof(buf)); \
+#define MAKE_STREAM_WRITE_FXN(T, N, S) \
+ inline void write ## N(std::ostream &os, T val) \
+ { \
+ char buf[S]; \
+ write ## N((u8 *)buf, val); \
+ os.write(buf, sizeof(buf)); \
}
-MAKE_STREAM_READ_FXN(u8, U8, 1);
-MAKE_STREAM_READ_FXN(u16, U16, 2);
-MAKE_STREAM_READ_FXN(u32, U32, 4);
-MAKE_STREAM_READ_FXN(u64, U64, 8);
-MAKE_STREAM_READ_FXN(s8, S8, 1);
-MAKE_STREAM_READ_FXN(s16, S16, 2);
-MAKE_STREAM_READ_FXN(s32, S32, 4);
-MAKE_STREAM_READ_FXN(s64, S64, 8);
-MAKE_STREAM_READ_FXN(f32, F1000, 4);
-MAKE_STREAM_READ_FXN(f32, F32, 4);
-MAKE_STREAM_READ_FXN(v2s16, V2S16, 4);
-MAKE_STREAM_READ_FXN(v3s16, V3S16, 6);
-MAKE_STREAM_READ_FXN(v2s32, V2S32, 8);
-MAKE_STREAM_READ_FXN(v3s32, V3S32, 12);
-MAKE_STREAM_READ_FXN(v3f, V3F1000, 12);
-MAKE_STREAM_READ_FXN(v2f, V2F32, 8);
-MAKE_STREAM_READ_FXN(v3f, V3F32, 12);
+MAKE_STREAM_READ_FXN(u8, U8, 1);
+MAKE_STREAM_READ_FXN(u16, U16, 2);
+MAKE_STREAM_READ_FXN(u32, U32, 4);
+MAKE_STREAM_READ_FXN(u64, U64, 8);
+MAKE_STREAM_READ_FXN(s8, S8, 1);
+MAKE_STREAM_READ_FXN(s16, S16, 2);
+MAKE_STREAM_READ_FXN(s32, S32, 4);
+MAKE_STREAM_READ_FXN(s64, S64, 8);
+MAKE_STREAM_READ_FXN(f32, F1000, 4);
+MAKE_STREAM_READ_FXN(f32, F32, 4);
+MAKE_STREAM_READ_FXN(v2s16, V2S16, 4);
+MAKE_STREAM_READ_FXN(v3s16, V3S16, 6);
+MAKE_STREAM_READ_FXN(v2s32, V2S32, 8);
+MAKE_STREAM_READ_FXN(v3s32, V3S32, 12);
+MAKE_STREAM_READ_FXN(v3f, V3F1000, 12);
+MAKE_STREAM_READ_FXN(v2f, V2F32, 8);
+MAKE_STREAM_READ_FXN(v3f, V3F32, 12);
MAKE_STREAM_READ_FXN(video::SColor, ARGB8, 4);
-MAKE_STREAM_WRITE_FXN(u8, U8, 1);
-MAKE_STREAM_WRITE_FXN(u16, U16, 2);
-MAKE_STREAM_WRITE_FXN(u32, U32, 4);
-MAKE_STREAM_WRITE_FXN(u64, U64, 8);
-MAKE_STREAM_WRITE_FXN(s8, S8, 1);
-MAKE_STREAM_WRITE_FXN(s16, S16, 2);
-MAKE_STREAM_WRITE_FXN(s32, S32, 4);
-MAKE_STREAM_WRITE_FXN(s64, S64, 8);
-MAKE_STREAM_WRITE_FXN(f32, F1000, 4);
-MAKE_STREAM_WRITE_FXN(f32, F32, 4);
-MAKE_STREAM_WRITE_FXN(v2s16, V2S16, 4);
-MAKE_STREAM_WRITE_FXN(v3s16, V3S16, 6);
-MAKE_STREAM_WRITE_FXN(v2s32, V2S32, 8);
-MAKE_STREAM_WRITE_FXN(v3s32, V3S32, 12);
-MAKE_STREAM_WRITE_FXN(v3f, V3F1000, 12);
-MAKE_STREAM_WRITE_FXN(v2f, V2F32, 8);
-MAKE_STREAM_WRITE_FXN(v3f, V3F32, 12);
+MAKE_STREAM_WRITE_FXN(u8, U8, 1);
+MAKE_STREAM_WRITE_FXN(u16, U16, 2);
+MAKE_STREAM_WRITE_FXN(u32, U32, 4);
+MAKE_STREAM_WRITE_FXN(u64, U64, 8);
+MAKE_STREAM_WRITE_FXN(s8, S8, 1);
+MAKE_STREAM_WRITE_FXN(s16, S16, 2);
+MAKE_STREAM_WRITE_FXN(s32, S32, 4);
+MAKE_STREAM_WRITE_FXN(s64, S64, 8);
+MAKE_STREAM_WRITE_FXN(f32, F1000, 4);
+MAKE_STREAM_WRITE_FXN(f32, F32, 4);
+MAKE_STREAM_WRITE_FXN(v2s16, V2S16, 4);
+MAKE_STREAM_WRITE_FXN(v3s16, V3S16, 6);
+MAKE_STREAM_WRITE_FXN(v2s32, V2S32, 8);
+MAKE_STREAM_WRITE_FXN(v3s32, V3S32, 12);
+MAKE_STREAM_WRITE_FXN(v3f, V3F1000, 12);
+MAKE_STREAM_WRITE_FXN(v2f, V2F32, 8);
+MAKE_STREAM_WRITE_FXN(v3f, V3F32, 12);
MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4);
////
@@ -466,59 +471,63 @@ std::string serializeJsonStringIfNeeded(const std::string &s);
std::string deSerializeJsonStringIfNeeded(std::istream &is);
// Creates a string consisting of the hexadecimal representation of `data`
-std::string serializeHexString(const std::string &data, bool insert_spaces = false);
+std::string serializeHexString(const std::string &data, bool insert_spaces=false);
// Creates a string containing comma delimited values of a struct whose layout is
// described by the parameter format
-bool serializeStructToString(std::string *out, std::string format, void *value);
+bool serializeStructToString(std::string *out,
+ std::string format, void *value);
// Reads a comma delimited string of values into a struct whose layout is
// decribed by the parameter format
-bool deSerializeStringToStruct(
- std::string valstr, std::string format, void *out, size_t olen);
+bool deSerializeStringToStruct(std::string valstr,
+ std::string format, void *out, size_t olen);
////
//// BufReader
////
-#define MAKE_BUFREADER_GETNOEX_FXN(T, N, S) \
- inline bool get##N##NoEx(T *val) \
- { \
- if (pos + S > size) \
- return false; \
- *val = read##N(data + pos); \
- pos += S; \
- return true; \
+#define MAKE_BUFREADER_GETNOEX_FXN(T, N, S) \
+ inline bool get ## N ## NoEx(T *val) \
+ { \
+ if (pos + S > size) \
+ return false; \
+ *val = read ## N(data + pos); \
+ pos += S; \
+ return true; \
}
-#define MAKE_BUFREADER_GET_FXN(T, N) \
- inline T get##N() \
- { \
- T val; \
- if (!get##N##NoEx(&val)) \
- throw SerializationError("Attempted read past end of data"); \
- return val; \
+#define MAKE_BUFREADER_GET_FXN(T, N) \
+ inline T get ## N() \
+ { \
+ T val; \
+ if (!get ## N ## NoEx(&val)) \
+ throw SerializationError("Attempted read past end of data"); \
+ return val; \
}
-class BufReader
-{
+class BufReader {
public:
- BufReader(const u8 *data_, size_t size_) : data(data_), size(size_) {}
-
- MAKE_BUFREADER_GETNOEX_FXN(u8, U8, 1);
- MAKE_BUFREADER_GETNOEX_FXN(u16, U16, 2);
- MAKE_BUFREADER_GETNOEX_FXN(u32, U32, 4);
- MAKE_BUFREADER_GETNOEX_FXN(u64, U64, 8);
- MAKE_BUFREADER_GETNOEX_FXN(s8, S8, 1);
- MAKE_BUFREADER_GETNOEX_FXN(s16, S16, 2);
- MAKE_BUFREADER_GETNOEX_FXN(s32, S32, 4);
- MAKE_BUFREADER_GETNOEX_FXN(s64, S64, 8);
- MAKE_BUFREADER_GETNOEX_FXN(f32, F1000, 4);
- MAKE_BUFREADER_GETNOEX_FXN(v2s16, V2S16, 4);
- MAKE_BUFREADER_GETNOEX_FXN(v3s16, V3S16, 6);
- MAKE_BUFREADER_GETNOEX_FXN(v2s32, V2S32, 8);
- MAKE_BUFREADER_GETNOEX_FXN(v3s32, V3S32, 12);
- MAKE_BUFREADER_GETNOEX_FXN(v3f, V3F1000, 12);
+ BufReader(const u8 *data_, size_t size_) :
+ data(data_),
+ size(size_)
+ {
+ }
+
+ MAKE_BUFREADER_GETNOEX_FXN(u8, U8, 1);
+ MAKE_BUFREADER_GETNOEX_FXN(u16, U16, 2);
+ MAKE_BUFREADER_GETNOEX_FXN(u32, U32, 4);
+ MAKE_BUFREADER_GETNOEX_FXN(u64, U64, 8);
+ MAKE_BUFREADER_GETNOEX_FXN(s8, S8, 1);
+ MAKE_BUFREADER_GETNOEX_FXN(s16, S16, 2);
+ MAKE_BUFREADER_GETNOEX_FXN(s32, S32, 4);
+ MAKE_BUFREADER_GETNOEX_FXN(s64, S64, 8);
+ MAKE_BUFREADER_GETNOEX_FXN(f32, F1000, 4);
+ MAKE_BUFREADER_GETNOEX_FXN(v2s16, V2S16, 4);
+ MAKE_BUFREADER_GETNOEX_FXN(v3s16, V3S16, 6);
+ MAKE_BUFREADER_GETNOEX_FXN(v2s32, V2S32, 8);
+ MAKE_BUFREADER_GETNOEX_FXN(v3s32, V3S32, 12);
+ MAKE_BUFREADER_GETNOEX_FXN(v3f, V3F1000, 12);
MAKE_BUFREADER_GETNOEX_FXN(video::SColor, ARGB8, 4);
bool getStringNoEx(std::string *val);
@@ -526,24 +535,24 @@ public:
bool getLongStringNoEx(std::string *val);
bool getRawDataNoEx(void *data, size_t len);
- MAKE_BUFREADER_GET_FXN(u8, U8);
- MAKE_BUFREADER_GET_FXN(u16, U16);
- MAKE_BUFREADER_GET_FXN(u32, U32);
- MAKE_BUFREADER_GET_FXN(u64, U64);
- MAKE_BUFREADER_GET_FXN(s8, S8);
- MAKE_BUFREADER_GET_FXN(s16, S16);
- MAKE_BUFREADER_GET_FXN(s32, S32);
- MAKE_BUFREADER_GET_FXN(s64, S64);
- MAKE_BUFREADER_GET_FXN(f32, F1000);
- MAKE_BUFREADER_GET_FXN(v2s16, V2S16);
- MAKE_BUFREADER_GET_FXN(v3s16, V3S16);
- MAKE_BUFREADER_GET_FXN(v2s32, V2S32);
- MAKE_BUFREADER_GET_FXN(v3s32, V3S32);
- MAKE_BUFREADER_GET_FXN(v3f, V3F1000);
+ MAKE_BUFREADER_GET_FXN(u8, U8);
+ MAKE_BUFREADER_GET_FXN(u16, U16);
+ MAKE_BUFREADER_GET_FXN(u32, U32);
+ MAKE_BUFREADER_GET_FXN(u64, U64);
+ MAKE_BUFREADER_GET_FXN(s8, S8);
+ MAKE_BUFREADER_GET_FXN(s16, S16);
+ MAKE_BUFREADER_GET_FXN(s32, S32);
+ MAKE_BUFREADER_GET_FXN(s64, S64);
+ MAKE_BUFREADER_GET_FXN(f32, F1000);
+ MAKE_BUFREADER_GET_FXN(v2s16, V2S16);
+ MAKE_BUFREADER_GET_FXN(v3s16, V3S16);
+ MAKE_BUFREADER_GET_FXN(v2s32, V2S32);
+ MAKE_BUFREADER_GET_FXN(v3s32, V3S32);
+ MAKE_BUFREADER_GET_FXN(v3f, V3F1000);
MAKE_BUFREADER_GET_FXN(video::SColor, ARGB8);
- MAKE_BUFREADER_GET_FXN(std::string, String);
- MAKE_BUFREADER_GET_FXN(std::wstring, WideString);
- MAKE_BUFREADER_GET_FXN(std::string, LongString);
+ MAKE_BUFREADER_GET_FXN(std::string, String);
+ MAKE_BUFREADER_GET_FXN(std::wstring, WideString);
+ MAKE_BUFREADER_GET_FXN(std::string, LongString);
inline void getRawData(void *val, size_t len)
{
@@ -565,6 +574,7 @@ public:
#undef MAKE_BUFREADER_GET_FXN
#undef MAKE_BUFREADER_GETNOEX_FXN
+
////
//// Vector-based write routines
////
@@ -584,8 +594,8 @@ inline void putU32(std::vector<u8> *dest, u32 val)
{
dest->push_back((val >> 24) & 0xFF);
dest->push_back((val >> 16) & 0xFF);
- dest->push_back((val >> 8) & 0xFF);
- dest->push_back((val >> 0) & 0xFF);
+ dest->push_back((val >> 8) & 0xFF);
+ dest->push_back((val >> 0) & 0xFF);
}
inline void putU64(std::vector<u8> *dest, u64 val)
@@ -596,8 +606,8 @@ inline void putU64(std::vector<u8> *dest, u64 val)
dest->push_back((val >> 32) & 0xFF);
dest->push_back((val >> 24) & 0xFF);
dest->push_back((val >> 16) & 0xFF);
- dest->push_back((val >> 8) & 0xFF);
- dest->push_back((val >> 0) & 0xFF);
+ dest->push_back((val >> 8) & 0xFF);
+ dest->push_back((val >> 0) & 0xFF);
}
inline void putS8(std::vector<u8> *dest, s8 val)