123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785 |
- /*
- * MessagePack packing routine template
- *
- * Copyright (C) 2008-2010 FURUHASHI Sadayuki
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #if defined(__LITTLE_ENDIAN__)
- #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 defined(__BIG_ENDIAN__)
- #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]
- #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)
- static inline int msgpack_pack_uint8(msgpack_packer* x, uint8_t d)
- {
- msgpack_pack_real_uint8(x, d);
- }
- static inline int msgpack_pack_uint16(msgpack_packer* x, uint16_t d)
- {
- msgpack_pack_real_uint16(x, d);
- }
- static inline int msgpack_pack_uint32(msgpack_packer* x, uint32_t d)
- {
- msgpack_pack_real_uint32(x, d);
- }
- static inline int msgpack_pack_uint64(msgpack_packer* x, uint64_t d)
- {
- msgpack_pack_real_uint64(x, d);
- }
- static inline int msgpack_pack_int8(msgpack_packer* x, int8_t d)
- {
- msgpack_pack_real_int8(x, d);
- }
- static inline int msgpack_pack_int16(msgpack_packer* x, int16_t d)
- {
- msgpack_pack_real_int16(x, d);
- }
- static inline int msgpack_pack_int32(msgpack_packer* x, int32_t d)
- {
- msgpack_pack_real_int32(x, d);
- }
- static inline int msgpack_pack_int64(msgpack_packer* x, int64_t d)
- {
- msgpack_pack_real_int64(x, d);
- }
- //#ifdef msgpack_pack_inline_func_cint
- static inline int msgpack_pack_short(msgpack_packer* 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
- }
- static inline int msgpack_pack_int(msgpack_packer* 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
- }
- static inline int msgpack_pack_long(msgpack_packer* 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
- }
- static inline int msgpack_pack_long_long(msgpack_packer* 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
- }
- static inline int msgpack_pack_unsigned_short(msgpack_packer* 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
- }
- static inline int msgpack_pack_unsigned_int(msgpack_packer* 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
- }
- static inline int msgpack_pack_unsigned_long(msgpack_packer* 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
- }
- static inline int msgpack_pack_unsigned_long_long(msgpack_packer* 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
- */
- static inline int msgpack_pack_float(msgpack_packer* x, float d)
- {
- union { float f; uint32_t i; } mem;
- mem.f = d;
- unsigned char buf[5];
- buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- static inline int msgpack_pack_double(msgpack_packer* x, double d)
- {
- union { double f; uint64_t i; } mem;
- mem.f = d;
- unsigned char buf[9];
- buf[0] = 0xcb;
- #if 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
- */
- static inline int msgpack_pack_nil(msgpack_packer* x)
- {
- static const unsigned char d = 0xc0;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- /*
- * Boolean
- */
- static inline int msgpack_pack_true(msgpack_packer* x)
- {
- static const unsigned char d = 0xc3;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- static inline int msgpack_pack_false(msgpack_packer* x)
- {
- static const unsigned char d = 0xc2;
- msgpack_pack_append_buffer(x, &d, 1);
- }
- /*
- * Array
- */
- static inline int msgpack_pack_array(msgpack_packer* x, unsigned int n)
- {
- if(n < 16) {
- unsigned char d = 0x90 | 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
- */
- static inline int msgpack_pack_map(msgpack_packer* x, unsigned int n)
- {
- if(n < 16) {
- unsigned char d = 0x80 | 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);
- }
- }
- /*
- * Raw
- */
- static inline int msgpack_pack_raw(msgpack_packer* 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 (x->use_bin_type && l < 256) { // str8 is new format introduced with bin.
- unsigned char buf[2] = {0xd9, (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);
- }
- }
- /*
- * bin
- */
- static inline int msgpack_pack_bin(msgpack_packer *x, size_t l)
- {
- if (!x->use_bin_type) {
- return msgpack_pack_raw(x, l);
- }
- if (l < 256) {
- unsigned char buf[2] = {0xc4, (unsigned char)l};
- msgpack_pack_append_buffer(x, buf, 2);
- } else if (l < 65536) {
- unsigned char buf[3] = {0xc5};
- _msgpack_store16(&buf[1], (uint16_t)l);
- msgpack_pack_append_buffer(x, buf, 3);
- } else {
- unsigned char buf[5] = {0xc6};
- _msgpack_store32(&buf[1], (uint32_t)l);
- msgpack_pack_append_buffer(x, buf, 5);
- }
- }
- static inline int msgpack_pack_raw_body(msgpack_packer* x, const void* b, size_t l)
- {
- if (l > 0) msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
- return 0;
- }
- /*
- * Ext
- */
- static inline int msgpack_pack_ext(msgpack_packer* x, int8_t typecode, size_t l)
- {
- if (l == 1) {
- unsigned char buf[2];
- buf[0] = 0xd4;
- buf[1] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 2);
- }
- else if(l == 2) {
- unsigned char buf[2];
- buf[0] = 0xd5;
- buf[1] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 2);
- }
- else if(l == 4) {
- unsigned char buf[2];
- buf[0] = 0xd6;
- buf[1] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 2);
- }
- else if(l == 8) {
- unsigned char buf[2];
- buf[0] = 0xd7;
- buf[1] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 2);
- }
- else if(l == 16) {
- unsigned char buf[2];
- buf[0] = 0xd8;
- buf[1] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 2);
- }
- else if(l < 256) {
- unsigned char buf[3];
- buf[0] = 0xc7;
- buf[1] = l;
- buf[2] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 3);
- } else if(l < 65536) {
- unsigned char buf[4];
- buf[0] = 0xc8;
- _msgpack_store16(&buf[1], (uint16_t)l);
- buf[3] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 4);
- } else {
- unsigned char buf[6];
- buf[0] = 0xc9;
- _msgpack_store32(&buf[1], (uint32_t)l);
- buf[5] = (unsigned char)typecode;
- msgpack_pack_append_buffer(x, buf, 6);
- }
- }
- #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
|