aboutsummaryrefslogtreecommitdiff
path: root/src/util/serialize.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/serialize.h')
-rw-r--r--src/util/serialize.h280
1 files changed, 135 insertions, 145 deletions
diff --git a/src/util/serialize.h b/src/util/serialize.h
index a4b5a234a..3ecc8e85b 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,7 +60,6 @@ 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
@@ -111,24 +110,20 @@ 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)
@@ -141,8 +136,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)
@@ -153,8 +148,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
@@ -197,10 +192,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
@@ -290,7 +285,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)
@@ -313,10 +308,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
@@ -381,58 +376,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);
////
@@ -471,63 +466,59 @@ 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);
@@ -535,24 +526,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)
{
@@ -574,7 +565,6 @@ public:
#undef MAKE_BUFREADER_GET_FXN
#undef MAKE_BUFREADER_GETNOEX_FXN
-
////
//// Vector-based write routines
////
@@ -594,8 +584,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)
@@ -606,8 +596,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)