summaryrefslogtreecommitdiff
path: root/msgpack/pack_template.h
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:10:00 +0000
committerfrsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>2009-02-15 09:10:00 +0000
commit8f3444c08141520a0977adce643ce0eb7f0324cd (patch)
tree65581e5ab02e6cb82b7ebc5fe94c0f43e750623a /msgpack/pack_template.h
parent15837bc3322b6f2fd6191187f4754f7d65c786a4 (diff)
downloadmsgpack-python-8f3444c08141520a0977adce643ce0eb7f0324cd.tar.gz
ruby binding: fix Fixnum serialization bug on x86_64
git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@88 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
Diffstat (limited to 'msgpack/pack_template.h')
-rw-r--r--msgpack/pack_template.h141
1 files changed, 128 insertions, 13 deletions
diff --git a/msgpack/pack_template.h b/msgpack/pack_template.h
index 1dbf6fd..04f8c98 100644
--- a/msgpack/pack_template.h
+++ b/msgpack/pack_template.h
@@ -68,15 +68,14 @@
* Integer
*/
-// wrapper
-msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
+static inline void msgpack_pack_compress_int32(msgpack_pack_user x, uint32_t d)
{
- if(d < -32) {
- if(d < -32768) {
+ if(d < -(1<<5)) {
+ if(d < -(1<<15)) {
// signed 32
const unsigned char buf[5] = {0xd2, STORE_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
- } else if(d < -128) {
+ } else if(d < -(1<<7)) {
// signed 16
const unsigned char buf[3] = {0xd1, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@@ -85,15 +84,15 @@ msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
const unsigned char buf[2] = {0xd0, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
}
- } else if(d < 128) {
+ } else if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (uint8_t*)&d, 1);
} else {
- if(d < 256) {
+ if(d < (1<<8)) {
// unsigned 8
const unsigned char buf[2] = {0xcc, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
- } else if(d < 65536) {
+ } else if(d < (1<<16)) {
// unsigned 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@@ -105,11 +104,10 @@ msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
}
}
-// wrapper
-msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
+static inline void msgpack_pack_compress_uint32(msgpack_pack_user x, uint32_t d)
{
- if(d < 256) {
- if(d < 128) {
+ if(d < (1<<8)) {
+ if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (unsigned char*)&d, 1);
} else {
@@ -118,7 +116,7 @@ msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
msgpack_pack_append_buffer(x, buf, 2);
}
} else {
- if(d < 65536) {
+ if(d < (1<<16)) {
// unsigned 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@@ -130,6 +128,123 @@ msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
}
}
+static inline void msgpack_pack_compress_int64(msgpack_pack_user x, int64_t d)
+{
+ if(d < -(1LL<<5)) {
+ if(d < -(1LL<<15)) {
+ if(d < -(1LL<<31)) {
+ // signed 64
+ const unsigned char buf[9] = {0xd3, STORE_BE64(d)};
+ msgpack_pack_append_buffer(x, buf, 9);
+ } else {
+ // signed 32
+ const unsigned char buf[5] = {0xd2, STORE_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)};
+ msgpack_pack_append_buffer(x, buf, 3);
+ } else {
+ // signed 8
+ const unsigned char buf[2] = {0xd0, (uint8_t)d};
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ }
+ } else if(d < (1<<7)) {
+ // fixnum
+ msgpack_pack_append_buffer(x, (uint8_t*)&d, 1);
+ } else {
+ if(d < (1LL<<16)) {
+ if(d < (1<<8)) {
+ // unsigned 8
+ const unsigned char buf[2] = {0xcc, (uint8_t)d};
+ msgpack_pack_append_buffer(x, buf, 2);
+ } else {
+ // unsigned 16
+ const unsigned char buf[3] = {0xcd, STORE_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)};
+ msgpack_pack_append_buffer(x, buf, 5);
+ } else {
+ // unsigned 64
+ const unsigned char buf[9] = {0xcf, STORE_BE64(d)};
+ msgpack_pack_append_buffer(x, buf, 9);
+ }
+ }
+ }
+}
+
+static inline void msgpack_pack_compress_uint64(msgpack_pack_user x, uint64_t d)
+{
+ if(d < (1ULL<<8)) {
+ if(d < (1<<7)) {
+ // fixnum
+ msgpack_pack_append_buffer(x, (unsigned char*)&d, 1);
+ } else {
+ // unsigned 8
+ const unsigned char buf[2] = {0xcc, (uint8_t)d};
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ } else {
+ if(d < (1ULL<<16)) {
+ // signed 16
+ const unsigned char buf[3] = {0xcd, STORE_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)};
+ msgpack_pack_append_buffer(x, buf, 5);
+ } else {
+ // signed 64
+ const unsigned char buf[9] = {0xcf, STORE_BE64(d)};
+ msgpack_pack_append_buffer(x, buf, 9);
+ }
+ }
+}
+
+msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
+{
+#if SIZEOF_INT == 8
+ msgpack_pack_compress_int64(x, d);
+#else
+ msgpack_pack_compress_int32(x, d);
+#endif
+}
+
+msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
+{
+#if SIZEOF_INT == 8
+ msgpack_pack_compress_uint64(x, d);
+#else
+ msgpack_pack_compress_uint32(x, d);
+#endif
+}
+
+msgpack_pack_inline_func(long)(msgpack_pack_user x, long d)
+{
+#if SIZEOF_LONG == 8
+ msgpack_pack_compress_int64(x, d);
+#else
+ msgpack_pack_compress_int32(x, d);
+#endif
+}
+
+msgpack_pack_inline_func(unsigned_long)(msgpack_pack_user x, unsigned long d)
+{
+#if SIZEOF_LONG == 8
+ msgpack_pack_compress_uint64(x, d);
+#else
+ msgpack_pack_compress_uint32(x, d);
+#endif
+}
+
+
msgpack_pack_inline_func(uint8)(msgpack_pack_user x, uint8_t d)
{
if(d < 128) {