123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937 |
- /*
- * MessagePack packing routine template
- *
- * Copyright (C) 2008-2010 FURUHASHI Sadayuki
- *
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- */
- #if MSGPACK_ENDIAN_LITTLE_BYTE
- #define TAKE8_8(d) ((uint8_t*)&d)[0]
- #define TAKE8_16(d) ((uint8_t*)&d)[0]
- #define TAKE8_32(d) ((uint8_t*)&d)[0]
- #define TAKE8_64(d) ((uint8_t*)&d)[0]
- #elif MSGPACK_ENDIAN_BIG_BYTE
- #define TAKE8_8(d) ((uint8_t*)&d)[0]
- #define TAKE8_16(d) ((uint8_t*)&d)[1]
- #define TAKE8_32(d) ((uint8_t*)&d)[3]
- #define TAKE8_64(d) ((uint8_t*)&d)[7]
- #else
- #error msgpack-c supports only big endian and little endian
- #endif
- #ifndef msgpack_pack_inline_func
- #error msgpack_pack_inline_func template is not defined
- #endif
- #ifndef msgpack_pack_user
- #error msgpack_pack_user type is not defined
- #endif
- #ifndef msgpack_pack_append_buffer
- #error msgpack_pack_append_buffer callback is not defined
- #endif
- /*
- * Integer
- */
- #define msgpack_pack_real_uint8(x, d) \
- do { \
- if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
- } else { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } while(0)
- #define msgpack_pack_real_uint16(x, d) \
- do { \
- if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
- } else if(d < (1<<8)) { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } else { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } \
- } while(0)
- #define msgpack_pack_real_uint32(x, d) \
- do { \
- if(d < (1<<8)) { \
- if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
- } else { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } else { \
- if(d < (1<<16)) { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else { \
- /* unsigned 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } \
- } \
- } while(0)
- #define msgpack_pack_real_uint64(x, d) \
- do { \
- if(d < (1ULL<<8)) { \
- if(d < (1ULL<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
- } else { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } else { \
- if(d < (1ULL<<16)) { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else if(d < (1ULL<<32)) { \
- /* unsigned 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } else { \
- /* unsigned 64 */ \
- unsigned char buf[9]; \
- buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
- msgpack_pack_append_buffer(x, buf, 9); \
- } \
- } \
- } while(0)
- #define msgpack_pack_real_int8(x, d) \
- do { \
- if(d < -(1<<5)) { \
- /* signed 8 */ \
- unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } else { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
- } \
- } while(0)
- #define msgpack_pack_real_int16(x, d) \
- do { \
- if(d < -(1<<5)) { \
- if(d < -(1<<7)) { \
- /* signed 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else { \
- /* signed 8 */ \
- unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } else if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
- } else { \
- if(d < (1<<8)) { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } else { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } \
- } \
- } while(0)
- #define msgpack_pack_real_int32(x, d) \
- do { \
- if(d < -(1<<5)) { \
- if(d < -(1<<15)) { \
- /* signed 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } else if(d < -(1<<7)) { \
- /* signed 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else { \
- /* signed 8 */ \
- unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } else if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
- } else { \
- if(d < (1<<8)) { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } else if(d < (1<<16)) { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else { \
- /* unsigned 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } \
- } \
- } while(0)
- #define msgpack_pack_real_int64(x, d) \
- do { \
- if(d < -(1LL<<5)) { \
- if(d < -(1LL<<15)) { \
- if(d < -(1LL<<31)) { \
- /* signed 64 */ \
- unsigned char buf[9]; \
- buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \
- msgpack_pack_append_buffer(x, buf, 9); \
- } else { \
- /* signed 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } \
- } else { \
- if(d < -(1<<7)) { \
- /* signed 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } else { \
- /* signed 8 */ \
- unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } \
- } \
- } else if(d < (1<<7)) { \
- /* fixnum */ \
- msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
- } else { \
- if(d < (1LL<<16)) { \
- if(d < (1<<8)) { \
- /* unsigned 8 */ \
- unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
- msgpack_pack_append_buffer(x, buf, 2); \
- } else { \
- /* unsigned 16 */ \
- unsigned char buf[3]; \
- buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
- msgpack_pack_append_buffer(x, buf, 3); \
- } \
- } else { \
- if(d < (1LL<<32)) { \
- /* unsigned 32 */ \
- unsigned char buf[5]; \
- buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
- msgpack_pack_append_buffer(x, buf, 5); \
- } else { \
- /* unsigned 64 */ \
- unsigned char buf[9]; \
- buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
- msgpack_pack_append_buffer(x, buf, 9); \
- } \
- } \
- } \
- } while(0)
- #ifdef msgpack_pack_inline_func_fixint
- msgpack_pack_inline_func_fixint(_uint8)(msgpack_pack_user x, uint8_t d)
- {
- unsigned char buf[2] = {0xcc, TAKE8_8(d)};
- msgpack_pack_append_buffer(x, buf, 2);
- }
- msgpack_pack_inline_func_fixint(_uint16)(msgpack_pack_user x, uint16_t d)
- {
- unsigned char buf[3];
- buf[0] = 0xcd; _msgpack_store16(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 3);
- }
- msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d)
- {
- unsigned char buf[5];
- buf[0] = 0xce; _msgpack_store32(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d)
- {
- unsigned char buf[9];
- buf[0] = 0xcf; _msgpack_store64(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 9);
- }
- msgpack_pack_inline_func_fixint(_int8)(msgpack_pack_user x, int8_t d)
- {
- unsigned char buf[2] = {0xd0, TAKE8_8(d)};
- msgpack_pack_append_buffer(x, buf, 2);
- }
- msgpack_pack_inline_func_fixint(_int16)(msgpack_pack_user x, int16_t d)
- {
- unsigned char buf[3];
- buf[0] = 0xd1; _msgpack_store16(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 3);
- }
- msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d)
- {
- unsigned char buf[5];
- buf[0] = 0xd2; _msgpack_store32(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d)
- {
- unsigned char buf[9];
- buf[0] = 0xd3; _msgpack_store64(&buf[1], d);
- msgpack_pack_append_buffer(x, buf, 9);
- }
- #undef msgpack_pack_inline_func_fixint
- #endif
- msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d)
- {
- msgpack_pack_real_uint8(x, d);
- }
- msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d)
- {
- msgpack_pack_real_uint16(x, d);
- }
- msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d)
- {
- msgpack_pack_real_uint32(x, d);
- }
- msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d)
- {
- msgpack_pack_real_uint64(x, d);
- }
- msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d)
- {
- msgpack_pack_real_int8(x, d);
- }
- msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d)
- {
- msgpack_pack_real_int16(x, d);
- }
- msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d)
- {
- msgpack_pack_real_int32(x, d);
- }
- msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d)
- {
- msgpack_pack_real_int64(x, d);
- }
- msgpack_pack_inline_func(_char)(msgpack_pack_user x, char d)
- {
- #if defined(CHAR_MIN)
- #if CHAR_MIN < 0
- msgpack_pack_real_int8(x, d);
- #else
- msgpack_pack_real_uint8(x, d);
- #endif
- #else
- #error CHAR_MIN is not defined
- #endif
- }
- msgpack_pack_inline_func(_signed_char)(msgpack_pack_user x, signed char d)
- {
- msgpack_pack_real_int8(x, d);
- }
- msgpack_pack_inline_func(_unsigned_char)(msgpack_pack_user x, unsigned char d)
- {
- msgpack_pack_real_uint8(x, d);
- }
- #ifdef msgpack_pack_inline_func_cint
- msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d)
- {
- #if defined(SIZEOF_SHORT)
- #if SIZEOF_SHORT == 2
- msgpack_pack_real_int16(x, d);
- #elif SIZEOF_SHORT == 4
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #elif defined(SHRT_MAX)
- #if SHRT_MAX == 0x7fff
- msgpack_pack_real_int16(x, d);
- #elif SHRT_MAX == 0x7fffffff
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #else
- if(sizeof(short) == 2) {
- msgpack_pack_real_int16(x, d);
- } else if(sizeof(short) == 4) {
- msgpack_pack_real_int32(x, d);
- } else {
- msgpack_pack_real_int64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d)
- {
- #if defined(SIZEOF_INT)
- #if SIZEOF_INT == 2
- msgpack_pack_real_int16(x, d);
- #elif SIZEOF_INT == 4
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #elif defined(INT_MAX)
- #if INT_MAX == 0x7fff
- msgpack_pack_real_int16(x, d);
- #elif INT_MAX == 0x7fffffff
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #else
- if(sizeof(int) == 2) {
- msgpack_pack_real_int16(x, d);
- } else if(sizeof(int) == 4) {
- msgpack_pack_real_int32(x, d);
- } else {
- msgpack_pack_real_int64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d)
- {
- #if defined(SIZEOF_LONG)
- #if SIZEOF_LONG == 2
- msgpack_pack_real_int16(x, d);
- #elif SIZEOF_LONG == 4
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #elif defined(LONG_MAX)
- #if LONG_MAX == 0x7fffL
- msgpack_pack_real_int16(x, d);
- #elif LONG_MAX == 0x7fffffffL
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #else
- if(sizeof(long) == 2) {
- msgpack_pack_real_int16(x, d);
- } else if(sizeof(long) == 4) {
- msgpack_pack_real_int32(x, d);
- } else {
- msgpack_pack_real_int64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d)
- {
- #if defined(SIZEOF_LONG_LONG)
- #if SIZEOF_LONG_LONG == 2
- msgpack_pack_real_int16(x, d);
- #elif SIZEOF_LONG_LONG == 4
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #elif defined(LLONG_MAX)
- #if LLONG_MAX == 0x7fffL
- msgpack_pack_real_int16(x, d);
- #elif LLONG_MAX == 0x7fffffffL
- msgpack_pack_real_int32(x, d);
- #else
- msgpack_pack_real_int64(x, d);
- #endif
- #else
- if(sizeof(long long) == 2) {
- msgpack_pack_real_int16(x, d);
- } else if(sizeof(long long) == 4) {
- msgpack_pack_real_int32(x, d);
- } else {
- msgpack_pack_real_int64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d)
- {
- #if defined(SIZEOF_SHORT)
- #if SIZEOF_SHORT == 2
- msgpack_pack_real_uint16(x, d);
- #elif SIZEOF_SHORT == 4
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #elif defined(USHRT_MAX)
- #if USHRT_MAX == 0xffffU
- msgpack_pack_real_uint16(x, d);
- #elif USHRT_MAX == 0xffffffffU
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #else
- if(sizeof(unsigned short) == 2) {
- msgpack_pack_real_uint16(x, d);
- } else if(sizeof(unsigned short) == 4) {
- msgpack_pack_real_uint32(x, d);
- } else {
- msgpack_pack_real_uint64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d)
- {
- #if defined(SIZEOF_INT)
- #if SIZEOF_INT == 2
- msgpack_pack_real_uint16(x, d);
- #elif SIZEOF_INT == 4
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #elif defined(UINT_MAX)
- #if UINT_MAX == 0xffffU
- msgpack_pack_real_uint16(x, d);
- #elif UINT_MAX == 0xffffffffU
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #else
- if(sizeof(unsigned int) == 2) {
- msgpack_pack_real_uint16(x, d);
- } else if(sizeof(unsigned int) == 4) {
- msgpack_pack_real_uint32(x, d);
- } else {
- msgpack_pack_real_uint64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d)
- {
- #if defined(SIZEOF_LONG)
- #if SIZEOF_LONG == 2
- msgpack_pack_real_uint16(x, d);
- #elif SIZEOF_LONG == 4
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #elif defined(ULONG_MAX)
- #if ULONG_MAX == 0xffffUL
- msgpack_pack_real_uint16(x, d);
- #elif ULONG_MAX == 0xffffffffUL
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #else
- if(sizeof(unsigned long) == 2) {
- msgpack_pack_real_uint16(x, d);
- } else if(sizeof(unsigned long) == 4) {
- msgpack_pack_real_uint32(x, d);
- } else {
- msgpack_pack_real_uint64(x, d);
- }
- #endif
- }
- msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d)
- {
- #if defined(SIZEOF_LONG_LONG)
- #if SIZEOF_LONG_LONG == 2
- msgpack_pack_real_uint16(x, d);
- #elif SIZEOF_LONG_LONG == 4
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #elif defined(ULLONG_MAX)
- #if ULLONG_MAX == 0xffffUL
- msgpack_pack_real_uint16(x, d);
- #elif ULLONG_MAX == 0xffffffffUL
- msgpack_pack_real_uint32(x, d);
- #else
- msgpack_pack_real_uint64(x, d);
- #endif
- #else
- if(sizeof(unsigned long long) == 2) {
- msgpack_pack_real_uint16(x, d);
- } else if(sizeof(unsigned long long) == 4) {
- msgpack_pack_real_uint32(x, d);
- } else {
- msgpack_pack_real_uint64(x, d);
- }
- #endif
- }
- #undef msgpack_pack_inline_func_cint
- #endif
- /*
- * Float
- */
- msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d)
- {
- unsigned char buf[5];
- union { float f; uint32_t i; } mem;
- mem.f = d;
- buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
- {
- unsigned char buf[9];
- union { double f; uint64_t i; } mem;
- mem.f = d;
- buf[0] = 0xcb;
- #if defined(TARGET_OS_IPHONE)
- // ok
- #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
- // https://github.com/msgpack/msgpack-perl/pull/1
- mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
- #endif
- _msgpack_store64(&buf[1], mem.i);
- msgpack_pack_append_buffer(x, buf, 9);
- }
- /*
- * Nil
- */
- msgpack_pack_inline_func(_nil)(msgpack_pack_user x)
- {
- static const unsigned char d = 0xc0;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- /*
- * Boolean
- */
- msgpack_pack_inline_func(_true)(msgpack_pack_user x)
- {
- static const unsigned char d = 0xc3;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- msgpack_pack_inline_func(_false)(msgpack_pack_user x)
- {
- static const unsigned char d = 0xc2;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- /*
- * Array
- */
- msgpack_pack_inline_func(_array)(msgpack_pack_user x, size_t n)
- {
- if(n < 16) {
- unsigned char d = 0x90 | (uint8_t)n;
- msgpack_pack_append_buffer(x, &d, 1);
- } else if(n < 65536) {
- unsigned char buf[3];
- buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5];
- buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- /*
- * Map
- */
- msgpack_pack_inline_func(_map)(msgpack_pack_user x, size_t n)
- {
- if(n < 16) {
- unsigned char d = 0x80 | (uint8_t)n;
- msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
- } else if(n < 65536) {
- unsigned char buf[3];
- buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5];
- buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- /*
- * Str
- */
- msgpack_pack_inline_func(_str)(msgpack_pack_user x, size_t l)
- {
- if(l < 32) {
- unsigned char d = 0xa0 | (uint8_t)l;
- msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
- } else if(l < 256) {
- unsigned char buf[2];
- buf[0] = 0xd9; buf[1] = (uint8_t)l;
- msgpack_pack_append_buffer(x, buf, 2);
- } else if(l < 65536) {
- unsigned char buf[3];
- buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5];
- buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- msgpack_pack_inline_func(_str_body)(msgpack_pack_user x, const void* b, size_t l)
- {
- msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
- }
- /*
- * Raw (V4)
- */
- msgpack_pack_inline_func(_v4raw)(msgpack_pack_user x, size_t l)
- {
- if(l < 32) {
- unsigned char d = 0xa0 | (uint8_t)l;
- msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
- } else if(l < 65536) {
- unsigned char buf[3];
- buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5];
- buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- msgpack_pack_inline_func(_v4raw_body)(msgpack_pack_user x, const void* b, size_t l)
- {
- msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
- }
- /*
- * Bin
- */
- msgpack_pack_inline_func(_bin)(msgpack_pack_user x, size_t l)
- {
- if(l < 256) {
- unsigned char buf[2];
- buf[0] = 0xc4; buf[1] = (uint8_t)l;
- msgpack_pack_append_buffer(x, buf, 2);
- } else if(l < 65536) {
- unsigned char buf[3];
- buf[0] = 0xc5; _msgpack_store16(&buf[1], (uint16_t)l);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5];
- buf[0] = 0xc6; _msgpack_store32(&buf[1], (uint32_t)l);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- msgpack_pack_inline_func(_bin_body)(msgpack_pack_user x, const void* b, size_t l)
- {
- msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
- }
- /*
- * Ext
- */
- msgpack_pack_inline_func(_ext)(msgpack_pack_user x, size_t l, int8_t type)
- {
- switch(l) {
- case 1: {
- unsigned char buf[2];
- buf[0] = 0xd4;
- buf[1] = type;
- msgpack_pack_append_buffer(x, buf, 2);
- } break;
- case 2: {
- unsigned char buf[2];
- buf[0] = 0xd5;
- buf[1] = type;
- msgpack_pack_append_buffer(x, buf, 2);
- } break;
- case 4: {
- unsigned char buf[2];
- buf[0] = 0xd6;
- buf[1] = type;
- msgpack_pack_append_buffer(x, buf, 2);
- } break;
- case 8: {
- unsigned char buf[2];
- buf[0] = 0xd7;
- buf[1] = type;
- msgpack_pack_append_buffer(x, buf, 2);
- } break;
- case 16: {
- unsigned char buf[2];
- buf[0] = 0xd8;
- buf[1] = type;
- msgpack_pack_append_buffer(x, buf, 2);
- } break;
- default:
- if(l < 256) {
- unsigned char buf[3];
- buf[0] = 0xc7;
- buf[1] = (unsigned char)l;
- buf[2] = type;
- msgpack_pack_append_buffer(x, buf, 3);
- } else if(l < 65536) {
- unsigned char buf[4];
- buf[0] = 0xc8;
- _msgpack_store16(&buf[1], l);
- buf[3] = type;
- msgpack_pack_append_buffer(x, buf, 4);
- } else {
- unsigned char buf[6];
- buf[0] = 0xc9;
- _msgpack_store32(&buf[1], l);
- buf[5] = type;
- msgpack_pack_append_buffer(x, buf, 6);
- }
- break;
- }
- }
- msgpack_pack_inline_func(_ext_body)(msgpack_pack_user x, const void* b, size_t l)
- {
- msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
- }
- msgpack_pack_inline_func(_timestamp)(msgpack_pack_user x, const msgpack_timestamp* d)
- {
- if ((((int64_t)d->tv_sec) >> 34) == 0) {
- uint64_t data64 = ((uint64_t) d->tv_nsec << 34) | d->tv_sec;
- if ((data64 & 0xffffffff00000000L) == 0) {
- // timestamp 32
- char buf[4];
- uint32_t data32 = (uint32_t)data64;
- msgpack_pack_ext(x, 4, -1);
- _msgpack_store32(buf, data32);
- msgpack_pack_append_buffer(x, buf, 4);
- } else {
- // timestamp 64
- char buf[8];
- msgpack_pack_ext(x, 8, -1);
- _msgpack_store64(buf, data64);
- msgpack_pack_append_buffer(x, buf, 8);
- }
- } else {
- // timestamp 96
- char buf[12];
- _msgpack_store32(&buf[0], d->tv_nsec);
- _msgpack_store64(&buf[4], d->tv_sec);
- msgpack_pack_ext(x, 12, -1);
- msgpack_pack_append_buffer(x, buf, 12);
- }
- }
- #undef msgpack_pack_inline_func
- #undef msgpack_pack_user
- #undef msgpack_pack_append_buffer
- #undef TAKE8_8
- #undef TAKE8_16
- #undef TAKE8_32
- #undef TAKE8_64
- #undef msgpack_pack_real_uint8
- #undef msgpack_pack_real_uint16
- #undef msgpack_pack_real_uint32
- #undef msgpack_pack_real_uint64
- #undef msgpack_pack_real_int8
- #undef msgpack_pack_real_int16
- #undef msgpack_pack_real_int32
- #undef msgpack_pack_real_int64
|