1/* 2 * MessagePack for C packing routine 3 * 4 * Copyright (C) 2008-2009 FURUHASHI Sadayuki 5 * 6 * Distributed under the Boost Software License, Version 1.0. 7 * (See accompanying file LICENSE_1_0.txt or copy at 8 * http://www.boost.org/LICENSE_1_0.txt) 9 */ 10#ifndef MSGPACK_PACK_H 11#define MSGPACK_PACK_H 12 13#include "pack_define.h" 14#include "object.h" 15#include <stdlib.h> 16 17#ifdef __cplusplus 18extern "C" { 19#endif 20 21 22/** 23 * @defgroup msgpack_buffer Buffers 24 * @ingroup msgpack 25 * @{ 26 * @} 27 */ 28 29/** 30 * @defgroup msgpack_pack Serializer 31 * @ingroup msgpack 32 * @{ 33 */ 34 35typedef int (*msgpack_packer_write)(void* data, const char* buf, size_t len); 36 37typedef struct msgpack_packer { 38 void* data; 39 msgpack_packer_write callback; 40} msgpack_packer; 41 42static void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback); 43 44static msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback); 45static void msgpack_packer_free(msgpack_packer* pk); 46 47static int msgpack_pack_char(msgpack_packer* pk, char d); 48 49static int msgpack_pack_signed_char(msgpack_packer* pk, signed char d); 50static int msgpack_pack_short(msgpack_packer* pk, short d); 51static int msgpack_pack_int(msgpack_packer* pk, int d); 52static int msgpack_pack_long(msgpack_packer* pk, long d); 53static int msgpack_pack_long_long(msgpack_packer* pk, long long d); 54static int msgpack_pack_unsigned_char(msgpack_packer* pk, unsigned char d); 55static int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d); 56static int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d); 57static int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d); 58static int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d); 59 60static int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d); 61static int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d); 62static int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d); 63static int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d); 64static int msgpack_pack_int8(msgpack_packer* pk, int8_t d); 65static int msgpack_pack_int16(msgpack_packer* pk, int16_t d); 66static int msgpack_pack_int32(msgpack_packer* pk, int32_t d); 67static int msgpack_pack_int64(msgpack_packer* pk, int64_t d); 68 69static int msgpack_pack_fix_uint8(msgpack_packer* pk, uint8_t d); 70static int msgpack_pack_fix_uint16(msgpack_packer* pk, uint16_t d); 71static int msgpack_pack_fix_uint32(msgpack_packer* pk, uint32_t d); 72static int msgpack_pack_fix_uint64(msgpack_packer* pk, uint64_t d); 73static int msgpack_pack_fix_int8(msgpack_packer* pk, int8_t d); 74static int msgpack_pack_fix_int16(msgpack_packer* pk, int16_t d); 75static int msgpack_pack_fix_int32(msgpack_packer* pk, int32_t d); 76static int msgpack_pack_fix_int64(msgpack_packer* pk, int64_t d); 77 78static int msgpack_pack_float(msgpack_packer* pk, float d); 79static int msgpack_pack_double(msgpack_packer* pk, double d); 80 81static int msgpack_pack_nil(msgpack_packer* pk); 82static int msgpack_pack_true(msgpack_packer* pk); 83static int msgpack_pack_false(msgpack_packer* pk); 84 85static int msgpack_pack_array(msgpack_packer* pk, size_t n); 86 87static int msgpack_pack_map(msgpack_packer* pk, size_t n); 88 89static int msgpack_pack_str(msgpack_packer* pk, size_t l); 90static int msgpack_pack_str_body(msgpack_packer* pk, const void* b, size_t l); 91 92static int msgpack_pack_v4raw(msgpack_packer* pk, size_t l); 93static int msgpack_pack_v4raw_body(msgpack_packer* pk, const void* b, size_t l); 94 95static int msgpack_pack_bin(msgpack_packer* pk, size_t l); 96static int msgpack_pack_bin_body(msgpack_packer* pk, const void* b, size_t l); 97 98static int msgpack_pack_ext(msgpack_packer* pk, size_t l, int8_t type); 99static int msgpack_pack_ext_body(msgpack_packer* pk, const void* b, size_t l); 100 101int msgpack_pack_object(msgpack_packer* pk, msgpack_object d); 102 103 104/** @} */ 105 106 107#define msgpack_pack_inline_func(name) \ 108 inline int msgpack_pack ## name 109 110#define msgpack_pack_inline_func_cint(name) \ 111 inline int msgpack_pack ## name 112 113#define msgpack_pack_inline_func_fixint(name) \ 114 inline int msgpack_pack_fix ## name 115 116#define msgpack_pack_user msgpack_packer* 117 118#define msgpack_pack_append_buffer(user, buf, len) \ 119 return (*(user)->callback)((user)->data, (const char*)buf, len) 120 121#include "pack_template.h" 122 123inline void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback) 124{ 125 pk->data = data; 126 pk->callback = callback; 127} 128 129inline msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback) 130{ 131 msgpack_packer* pk = (msgpack_packer*)calloc(1, sizeof(msgpack_packer)); 132 if(!pk) { return NULL; } 133 msgpack_packer_init(pk, data, callback); 134 return pk; 135} 136 137inline void msgpack_packer_free(msgpack_packer* pk) 138{ 139 free(pk); 140} 141 142 143#ifdef __cplusplus 144} 145#endif 146 147#endif /* msgpack/pack.h */ 148