summaryrefslogtreecommitdiff
path: root/msgpack
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2009-03-04 01:04:43 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2009-03-04 01:04:43 +0900
commit44cdc5f9763d2fd119774bbd026ba635eb04e2e5 (patch)
tree3abe21010ac6d86b4885330d9745d6eeaa8e1fc6 /msgpack
parentd58d3ed2b0447709af70310a175336a560133573 (diff)
downloadmsgpack-python-44cdc5f9763d2fd119774bbd026ba635eb04e2e5.tar.gz
fix serialization bug on BigEndian environment
Diffstat (limited to 'msgpack')
-rw-r--r--msgpack/pack_template.h179
1 files changed, 117 insertions, 62 deletions
diff --git a/msgpack/pack_template.h b/msgpack/pack_template.h
index 212c0e6..14e3292 100644
--- a/msgpack/pack_template.h
+++ b/msgpack/pack_template.h
@@ -24,29 +24,79 @@
#endif
#endif
+
#ifdef __LITTLE_ENDIAN__
-#define STORE_BE16(d) \
- ((char*)&d)[1], ((char*)&d)[0]
+#define STORE8_BE8(d) \
+ ((uint8_t*)&d)[0]
+
+
+#define STORE16_BE8(d) \
+ ((uint8_t*)&d)[0]
+
+#define STORE16_BE16(d) \
+ ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
+
+
+#define STORE32_BE8(d) \
+ ((uint8_t*)&d)[0]
+
+#define STORE32_BE16(d) \
+ ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
+
+#define STORE32_BE32(d) \
+ ((uint8_t*)&d)[3], ((uint8_t*)&d)[2], ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
+
+
+#define STORE64_BE8(d) \
+ ((uint8_t*)&d)[0]
+
+#define STORE64_BE16(d) \
+ ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
+
+#define STORE64_BE32(d) \
+ ((uint8_t*)&d)[3], ((uint8_t*)&d)[2], ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
-#define STORE_BE32(d) \
- ((char*)&d)[3], ((char*)&d)[2], ((char*)&d)[1], ((char*)&d)[0]
+#define STORE64_BE64(d) \
+ ((uint8_t*)&d)[7], ((uint8_t*)&d)[6], ((uint8_t*)&d)[5], ((uint8_t*)&d)[4], \
+ ((uint8_t*)&d)[3], ((uint8_t*)&d)[2], ((uint8_t*)&d)[1], ((uint8_t*)&d)[0]
-#define STORE_BE64(d) \
- ((char*)&d)[7], ((char*)&d)[6], ((char*)&d)[5], ((char*)&d)[4], \
- ((char*)&d)[3], ((char*)&d)[2], ((char*)&d)[1], ((char*)&d)[0]
#elif __BIG_ENDIAN__
-#define STORE_BE16(d) \
- ((char*)&d)[0], ((char*)&d)[1]
+#define STORE8_BE8(d) \
+ ((uint8_t*)&d)[0]
-#define STORE_BE32(d) \
- ((char*)&d)[0], ((char*)&d)[1], ((char*)&d)[2], ((char*)&d)[3]
-#define STORE_BE64(d) \
- ((char*)&d)[0], ((char*)&d)[1], ((char*)&d)[2], ((char*)&d)[3], \
- ((char*)&d)[4], ((char*)&d)[5], ((char*)&d)[6], ((char*)&d)[7]
+#define STORE16_BE8(d) \
+ ((uint8_t*)&d)[1]
+
+#define STORE16_BE16(d) \
+ ((uint8_t*)&d)[0], ((uint8_t*)&d)[1]
+
+
+#define STORE32_BE8(d) \
+ ((uint8_t*)&d)[3]
+
+#define STORE32_BE16(d) \
+ ((uint8_t*)&d)[2], ((uint8_t*)&d)[3]
+
+#define STORE32_BE32(d) \
+ ((uint8_t*)&d)[0], ((uint8_t*)&d)[1], ((uint8_t*)&d)[2], ((uint8_t*)&d)[3]
+
+
+#define STORE64_BE8(d) \
+ ((uint8_t*)&d)[7]
+
+#define STORE64_BE16(d) \
+ ((uint8_t*)&d)[6], ((uint8_t*)&d)[7]
+
+#define STORE64_BE32(d) \
+ ((uint8_t*)&d)[4], ((uint8_t*)&d)[5], ((uint8_t*)&d)[6], ((uint8_t*)&d)[7]
+
+#define STORE64_BE64(d) \
+ ((uint8_t*)&d)[0], ((uint8_t*)&d)[1], ((uint8_t*)&d)[2], ((uint8_t*)&d)[3], \
+ ((uint8_t*)&d)[4], ((uint8_t*)&d)[5], ((uint8_t*)&d)[6], ((uint8_t*)&d)[7]
#endif
@@ -71,10 +121,10 @@
do { \
if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE8_BE8(d), 1); \
} else { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE8_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} while(0)
@@ -83,14 +133,14 @@ do { \
do { \
if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE16_BE8(d), 1); \
} else if(d < (1<<8)) { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE16_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} else { \
/* unsigned 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE16_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} while(0)
@@ -100,20 +150,20 @@ do { \
if(d < (1<<8)) { \
if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE32_BE8(d), 1); \
} else { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE32_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} else { \
if(d < (1<<16)) { \
/* unsigned 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE32_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* unsigned 32 */ \
- const unsigned char buf[5] = {0xce, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xce, STORE32_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} \
@@ -124,24 +174,24 @@ do { \
if(d < (1ULL<<8)) { \
if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE64_BE8(d), 1); \
} else { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE64_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} else { \
if(d < (1ULL<<16)) { \
/* signed 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE64_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else if(d < (1ULL<<32)) { \
/* signed 32 */ \
- const unsigned char buf[5] = {0xce, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xce, STORE64_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} else { \
/* signed 64 */ \
- const unsigned char buf[9] = {0xcf, STORE_BE64(d)}; \
+ const unsigned char buf[9] = {0xcf, STORE64_BE64(d)}; \
msgpack_pack_append_buffer(x, buf, 9); \
} \
} \
@@ -151,11 +201,11 @@ do { \
do { \
if(d < -(1<<5)) { \
/* signed 8 */ \
- const unsigned char buf[2] = {0xd0, d}; \
+ const unsigned char buf[2] = {0xd0, STORE8_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} else { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE8_BE8(d), 1); \
} \
} while(0)
@@ -164,24 +214,24 @@ do { \
if(d < -(1<<5)) { \
if(d < -(1<<7)) { \
/* signed 16 */ \
- const unsigned char buf[3] = {0xd1, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xd1, STORE16_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
- const unsigned char buf[2] = {0xd0, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xd0, STORE16_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} else if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE16_BE8(d), 1); \
} else { \
if(d < (1<<8)) { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE16_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} else { \
/* unsigned 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE16_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} \
@@ -192,32 +242,32 @@ do { \
if(d < -(1<<5)) { \
if(d < -(1<<15)) { \
/* signed 32 */ \
- const unsigned char buf[5] = {0xd2, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xd2, STORE32_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} else if(d < -(1<<7)) { \
/* signed 16 */ \
- const unsigned char buf[3] = {0xd1, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xd1, STORE32_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
- const unsigned char buf[2] = {0xd0, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xd0, STORE32_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} else if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE32_BE8(d), 1); \
} else { \
if(d < (1<<8)) { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE32_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} else if(d < (1<<16)) { \
/* unsigned 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE32_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* unsigned 32 */ \
- const unsigned char buf[5] = {0xce, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xce, STORE32_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} \
@@ -229,46 +279,46 @@ do { \
if(d < -(1LL<<15)) { \
if(d < -(1LL<<31)) { \
/* signed 64 */ \
- const unsigned char buf[9] = {0xd3, STORE_BE64(d)}; \
+ const unsigned char buf[9] = {0xd3, STORE64_BE64(d)}; \
msgpack_pack_append_buffer(x, buf, 9); \
} else { \
/* signed 32 */ \
- const unsigned char buf[5] = {0xd2, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xd2, STORE64_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} \
} else { \
if(d < -(1<<7)) { \
/* signed 16 */ \
- const unsigned char buf[3] = {0xd1, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xd1, STORE64_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} else { \
/* signed 8 */ \
- const unsigned char buf[2] = {0xd0, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xd0, STORE64_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} \
} \
} else if(d < (1<<7)) { \
/* fixnum */ \
- msgpack_pack_append_buffer(x, (uint8_t*)&d, 1); \
+ msgpack_pack_append_buffer(x, &STORE64_BE8(d), 1); \
} else { \
if(d < (1LL<<16)) { \
if(d < (1<<8)) { \
/* unsigned 8 */ \
- const unsigned char buf[2] = {0xcc, (uint8_t)d}; \
+ const unsigned char buf[2] = {0xcc, STORE64_BE8(d)}; \
msgpack_pack_append_buffer(x, buf, 2); \
} else { \
/* unsigned 16 */ \
- const unsigned char buf[3] = {0xcd, STORE_BE16(d)}; \
+ const unsigned char buf[3] = {0xcd, STORE64_BE16(d)}; \
msgpack_pack_append_buffer(x, buf, 3); \
} \
} else { \
if(d < (1LL<<32)) { \
/* unsigned 32 */ \
- const unsigned char buf[5] = {0xce, STORE_BE32(d)}; \
+ const unsigned char buf[5] = {0xce, STORE64_BE32(d)}; \
msgpack_pack_append_buffer(x, buf, 5); \
} else { \
/* unsigned 64 */ \
- const unsigned char buf[9] = {0xcf, STORE_BE64(d)}; \
+ const unsigned char buf[9] = {0xcf, STORE64_BE64(d)}; \
msgpack_pack_append_buffer(x, buf, 9); \
} \
} \
@@ -554,7 +604,7 @@ msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d)
{
union { char buf[4]; uint32_t num; } f;
*((float*)&f.buf) = d; // FIXME
- const unsigned char buf[5] = {0xca, STORE_BE32(f.num)};
+ const unsigned char buf[5] = {0xca, STORE32_BE32(f.num)};
msgpack_pack_append_buffer(x, buf, 5);
}
@@ -562,7 +612,7 @@ msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
{
union { char buf[8]; uint64_t num; } f;
*((double*)&f.buf) = d; // FIXME
- const unsigned char buf[9] = {0xcb, STORE_BE64(f.num)};
+ const unsigned char buf[9] = {0xcb, STORE64_BE64(f.num)};
msgpack_pack_append_buffer(x, buf, 9);
}
@@ -606,11 +656,11 @@ msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n)
msgpack_pack_append_buffer(x, &d, 1);
} else if(n < 65536) {
uint16_t d = (uint16_t)n;
- unsigned char buf[3] = {0xdc, STORE_BE16(d)};
+ unsigned char buf[3] = {0xdc, STORE16_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
} else {
uint32_t d = (uint32_t)n;
- unsigned char buf[5] = {0xdd, STORE_BE32(d)};
+ unsigned char buf[5] = {0xdd, STORE32_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
}
}
@@ -627,11 +677,11 @@ msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n)
msgpack_pack_append_buffer(x, &d, 1);
} else if(n < 65536) {
uint16_t d = (uint16_t)n;
- unsigned char buf[3] = {0xde, STORE_BE16(d)};
+ unsigned char buf[3] = {0xde, STORE16_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
} else {
uint32_t d = (uint32_t)n;
- unsigned char buf[5] = {0xdf, STORE_BE32(d)};
+ unsigned char buf[5] = {0xdf, STORE32_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
}
}
@@ -648,11 +698,11 @@ msgpack_pack_inline_func(_raw)(msgpack_pack_user x, size_t l)
msgpack_pack_append_buffer(x, &d, 1);
} else if(l < 65536) {
uint16_t d = (uint16_t)l;
- unsigned char buf[3] = {0xda, STORE_BE16(d)};
+ unsigned char buf[3] = {0xda, STORE16_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
} else {
uint32_t d = (uint32_t)l;
- unsigned char buf[5] = {0xdb, STORE_BE32(d)};
+ unsigned char buf[5] = {0xdb, STORE32_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
}
}
@@ -666,9 +716,14 @@ msgpack_pack_inline_func(_raw_body)(msgpack_pack_user x, const void* b, size_t l
#undef msgpack_pack_user
#undef msgpack_pack_append_buffer
-#undef STORE_BE16
-#undef STORE_BE32
-#undef STORE_BE64
+#undef STORE16_BE16
+
+#undef STORE32_BE16
+#undef STORE32_BE32
+
+#undef STORE64_BE16
+#undef STORE64_BE32
+#undef STORE64_BE64
#undef msgpack_pack_real_uint8
#undef msgpack_pack_real_uint16