diff options
Diffstat (limited to 'src/util/serialize.h')
-rw-r--r-- | src/util/serialize.h | 280 |
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) |