messagepack implementation for embedded systems (mbed / arduino)

Dependents:   hello_message_pack

msgpack-c & msgpack-c++ https://github.com/msgpack/msgpack-c implementation for embedded systems (mbed / Arduino)

Committer:
hideakitai
Date:
Mon Feb 22 01:43:48 2016 +0000
Revision:
4:bd0c06dd6e92
Parent:
3:a56553e46a9a
fix throw error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hideakitai 0:3f9dbf1e2cb0 1 /*
hideakitai 0:3f9dbf1e2cb0 2 * MessagePack for C deflate buffer implementation
hideakitai 0:3f9dbf1e2cb0 3 *
hideakitai 0:3f9dbf1e2cb0 4 * Copyright (C) 2010 FURUHASHI Sadayuki
hideakitai 0:3f9dbf1e2cb0 5 *
hideakitai 0:3f9dbf1e2cb0 6 * Distributed under the Boost Software License, Version 1.0.
hideakitai 0:3f9dbf1e2cb0 7 * (See accompanying file LICENSE_1_0.txt or copy at
hideakitai 0:3f9dbf1e2cb0 8 * http://www.boost.org/LICENSE_1_0.txt)
hideakitai 0:3f9dbf1e2cb0 9 */
hideakitai 0:3f9dbf1e2cb0 10 #ifndef MSGPACK_ZBUFFER_H
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_ZBUFFER_H
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "sysdep.h"
hideakitai 0:3f9dbf1e2cb0 14 #include <stdlib.h>
hideakitai 0:3f9dbf1e2cb0 15 #include <string.h>
hideakitai 0:3f9dbf1e2cb0 16 #include <zlib.h>
hideakitai 0:3f9dbf1e2cb0 17
hideakitai 0:3f9dbf1e2cb0 18 #ifdef __cplusplus
hideakitai 0:3f9dbf1e2cb0 19 extern "C" {
hideakitai 0:3f9dbf1e2cb0 20 #endif
hideakitai 0:3f9dbf1e2cb0 21
hideakitai 0:3f9dbf1e2cb0 22
hideakitai 0:3f9dbf1e2cb0 23 /**
hideakitai 0:3f9dbf1e2cb0 24 * @defgroup msgpack_zbuffer Compressed buffer
hideakitai 0:3f9dbf1e2cb0 25 * @ingroup msgpack_buffer
hideakitai 0:3f9dbf1e2cb0 26 * @{
hideakitai 0:3f9dbf1e2cb0 27 */
hideakitai 0:3f9dbf1e2cb0 28
hideakitai 0:3f9dbf1e2cb0 29 typedef struct msgpack_zbuffer {
hideakitai 0:3f9dbf1e2cb0 30 z_stream stream;
hideakitai 0:3f9dbf1e2cb0 31 char* data;
hideakitai 0:3f9dbf1e2cb0 32 size_t init_size;
hideakitai 0:3f9dbf1e2cb0 33 } msgpack_zbuffer;
hideakitai 0:3f9dbf1e2cb0 34
hideakitai 0:3f9dbf1e2cb0 35 #ifndef MSGPACK_ZBUFFER_INIT_SIZE
hideakitai 3:a56553e46a9a 36 #if defined(__MBED__)
hideakitai 3:a56553e46a9a 37 #define MSGPACK_ZBUFFER_INIT_SIZE 512
hideakitai 3:a56553e46a9a 38 #elif defined(__AVR__)
hideakitai 3:a56553e46a9a 39 #define MSGPACK_ZBUFFER_INIT_SIZE 128
hideakitai 3:a56553e46a9a 40 #else
hideakitai 3:a56553e46a9a 41 #define MSGPACK_ZBUFFER_INIT_SIZE 8192
hideakitai 3:a56553e46a9a 42 #endif
hideakitai 0:3f9dbf1e2cb0 43 #endif
hideakitai 0:3f9dbf1e2cb0 44
hideakitai 0:3f9dbf1e2cb0 45 static inline bool msgpack_zbuffer_init(
hideakitai 0:3f9dbf1e2cb0 46 msgpack_zbuffer* zbuf, int level, size_t init_size);
hideakitai 0:3f9dbf1e2cb0 47 static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 48
hideakitai 0:3f9dbf1e2cb0 49 static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size);
hideakitai 0:3f9dbf1e2cb0 50 static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 51
hideakitai 0:3f9dbf1e2cb0 52 static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 53
hideakitai 0:3f9dbf1e2cb0 54 static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 55 static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 56
hideakitai 0:3f9dbf1e2cb0 57 static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 58 static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 59 static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 60
hideakitai 0:3f9dbf1e2cb0 61
hideakitai 0:3f9dbf1e2cb0 62 #ifndef MSGPACK_ZBUFFER_RESERVE_SIZE
hideakitai 0:3f9dbf1e2cb0 63 #define MSGPACK_ZBUFFER_RESERVE_SIZE 512
hideakitai 0:3f9dbf1e2cb0 64 #endif
hideakitai 0:3f9dbf1e2cb0 65
hideakitai 0:3f9dbf1e2cb0 66 static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len);
hideakitai 0:3f9dbf1e2cb0 67
hideakitai 0:3f9dbf1e2cb0 68 static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 69
hideakitai 0:3f9dbf1e2cb0 70
hideakitai 0:3f9dbf1e2cb0 71 static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
hideakitai 0:3f9dbf1e2cb0 72 int level, size_t init_size)
hideakitai 0:3f9dbf1e2cb0 73 {
hideakitai 0:3f9dbf1e2cb0 74 memset(zbuf, 0, sizeof(msgpack_zbuffer));
hideakitai 0:3f9dbf1e2cb0 75 zbuf->init_size = init_size;
hideakitai 0:3f9dbf1e2cb0 76 if(deflateInit(&zbuf->stream, level) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 77 free(zbuf->data);
hideakitai 0:3f9dbf1e2cb0 78 return false;
hideakitai 0:3f9dbf1e2cb0 79 }
hideakitai 0:3f9dbf1e2cb0 80 return true;
hideakitai 0:3f9dbf1e2cb0 81 }
hideakitai 0:3f9dbf1e2cb0 82
hideakitai 0:3f9dbf1e2cb0 83 static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 84 {
hideakitai 0:3f9dbf1e2cb0 85 deflateEnd(&zbuf->stream);
hideakitai 0:3f9dbf1e2cb0 86 free(zbuf->data);
hideakitai 0:3f9dbf1e2cb0 87 }
hideakitai 0:3f9dbf1e2cb0 88
hideakitai 0:3f9dbf1e2cb0 89 static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
hideakitai 0:3f9dbf1e2cb0 90 {
hideakitai 0:3f9dbf1e2cb0 91 msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer));
hideakitai 0:3f9dbf1e2cb0 92 if (zbuf == NULL) return NULL;
hideakitai 0:3f9dbf1e2cb0 93 if(!msgpack_zbuffer_init(zbuf, level, init_size)) {
hideakitai 0:3f9dbf1e2cb0 94 free(zbuf);
hideakitai 0:3f9dbf1e2cb0 95 return NULL;
hideakitai 0:3f9dbf1e2cb0 96 }
hideakitai 0:3f9dbf1e2cb0 97 return zbuf;
hideakitai 0:3f9dbf1e2cb0 98 }
hideakitai 0:3f9dbf1e2cb0 99
hideakitai 0:3f9dbf1e2cb0 100 static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 101 {
hideakitai 0:3f9dbf1e2cb0 102 if(zbuf == NULL) { return; }
hideakitai 0:3f9dbf1e2cb0 103 msgpack_zbuffer_destroy(zbuf);
hideakitai 0:3f9dbf1e2cb0 104 free(zbuf);
hideakitai 0:3f9dbf1e2cb0 105 }
hideakitai 0:3f9dbf1e2cb0 106
hideakitai 0:3f9dbf1e2cb0 107 static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 108 {
hideakitai 0:3f9dbf1e2cb0 109 size_t used = (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 110 size_t csize = used + zbuf->stream.avail_out;
hideakitai 0:3f9dbf1e2cb0 111 size_t nsize = (csize == 0) ? zbuf->init_size : csize * 2;
hideakitai 0:3f9dbf1e2cb0 112
hideakitai 0:3f9dbf1e2cb0 113 char* tmp = (char*)realloc(zbuf->data, nsize);
hideakitai 0:3f9dbf1e2cb0 114 if(tmp == NULL) {
hideakitai 0:3f9dbf1e2cb0 115 return false;
hideakitai 0:3f9dbf1e2cb0 116 }
hideakitai 0:3f9dbf1e2cb0 117
hideakitai 0:3f9dbf1e2cb0 118 zbuf->data = tmp;
hideakitai 0:3f9dbf1e2cb0 119 zbuf->stream.next_out = (Bytef*)(tmp + used);
hideakitai 0:3f9dbf1e2cb0 120 zbuf->stream.avail_out = nsize - used;
hideakitai 0:3f9dbf1e2cb0 121
hideakitai 0:3f9dbf1e2cb0 122 return true;
hideakitai 0:3f9dbf1e2cb0 123 }
hideakitai 0:3f9dbf1e2cb0 124
hideakitai 0:3f9dbf1e2cb0 125 static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
hideakitai 0:3f9dbf1e2cb0 126 {
hideakitai 0:3f9dbf1e2cb0 127 msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data;
hideakitai 0:3f9dbf1e2cb0 128
hideakitai 0:3f9dbf1e2cb0 129 zbuf->stream.next_in = (Bytef*)buf;
hideakitai 0:3f9dbf1e2cb0 130 zbuf->stream.avail_in = len;
hideakitai 0:3f9dbf1e2cb0 131
hideakitai 0:3f9dbf1e2cb0 132 while(zbuf->stream.avail_in > 0) {
hideakitai 0:3f9dbf1e2cb0 133 if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
hideakitai 0:3f9dbf1e2cb0 134 if(!msgpack_zbuffer_expand(zbuf)) {
hideakitai 0:3f9dbf1e2cb0 135 return -1;
hideakitai 0:3f9dbf1e2cb0 136 }
hideakitai 0:3f9dbf1e2cb0 137 }
hideakitai 0:3f9dbf1e2cb0 138
hideakitai 0:3f9dbf1e2cb0 139 if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 140 return -1;
hideakitai 0:3f9dbf1e2cb0 141 }
hideakitai 0:3f9dbf1e2cb0 142 }
hideakitai 0:3f9dbf1e2cb0 143
hideakitai 0:3f9dbf1e2cb0 144 return 0;
hideakitai 0:3f9dbf1e2cb0 145 }
hideakitai 0:3f9dbf1e2cb0 146
hideakitai 0:3f9dbf1e2cb0 147 static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 148 {
hideakitai 0:3f9dbf1e2cb0 149 while(true) {
hideakitai 0:3f9dbf1e2cb0 150 switch(deflate(&zbuf->stream, Z_FINISH)) {
hideakitai 0:3f9dbf1e2cb0 151 case Z_STREAM_END:
hideakitai 0:3f9dbf1e2cb0 152 return zbuf->data;
hideakitai 0:3f9dbf1e2cb0 153 case Z_OK:
hideakitai 0:3f9dbf1e2cb0 154 if(!msgpack_zbuffer_expand(zbuf)) {
hideakitai 0:3f9dbf1e2cb0 155 return NULL;
hideakitai 0:3f9dbf1e2cb0 156 }
hideakitai 0:3f9dbf1e2cb0 157 break;
hideakitai 0:3f9dbf1e2cb0 158 default:
hideakitai 0:3f9dbf1e2cb0 159 return NULL;
hideakitai 0:3f9dbf1e2cb0 160 }
hideakitai 0:3f9dbf1e2cb0 161 }
hideakitai 0:3f9dbf1e2cb0 162 }
hideakitai 0:3f9dbf1e2cb0 163
hideakitai 0:3f9dbf1e2cb0 164 static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 165 {
hideakitai 0:3f9dbf1e2cb0 166 return zbuf->data;
hideakitai 0:3f9dbf1e2cb0 167 }
hideakitai 0:3f9dbf1e2cb0 168
hideakitai 0:3f9dbf1e2cb0 169 static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 170 {
hideakitai 0:3f9dbf1e2cb0 171 return (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 172 }
hideakitai 0:3f9dbf1e2cb0 173
hideakitai 0:3f9dbf1e2cb0 174 static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 175 {
hideakitai 0:3f9dbf1e2cb0 176 zbuf->stream.avail_out += (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 177 zbuf->stream.next_out = (Bytef*)zbuf->data;
hideakitai 0:3f9dbf1e2cb0 178 }
hideakitai 0:3f9dbf1e2cb0 179
hideakitai 0:3f9dbf1e2cb0 180 static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 181 {
hideakitai 0:3f9dbf1e2cb0 182 if(deflateReset(&zbuf->stream) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 183 return false;
hideakitai 0:3f9dbf1e2cb0 184 }
hideakitai 0:3f9dbf1e2cb0 185 msgpack_zbuffer_reset_buffer(zbuf);
hideakitai 0:3f9dbf1e2cb0 186 return true;
hideakitai 0:3f9dbf1e2cb0 187 }
hideakitai 0:3f9dbf1e2cb0 188
hideakitai 0:3f9dbf1e2cb0 189 static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 190 {
hideakitai 0:3f9dbf1e2cb0 191 char* tmp = zbuf->data;
hideakitai 0:3f9dbf1e2cb0 192 zbuf->data = NULL;
hideakitai 0:3f9dbf1e2cb0 193 zbuf->stream.next_out = NULL;
hideakitai 0:3f9dbf1e2cb0 194 zbuf->stream.avail_out = 0;
hideakitai 0:3f9dbf1e2cb0 195 return tmp;
hideakitai 0:3f9dbf1e2cb0 196 }
hideakitai 0:3f9dbf1e2cb0 197
hideakitai 0:3f9dbf1e2cb0 198 /** @} */
hideakitai 0:3f9dbf1e2cb0 199
hideakitai 0:3f9dbf1e2cb0 200
hideakitai 0:3f9dbf1e2cb0 201 #ifdef __cplusplus
hideakitai 0:3f9dbf1e2cb0 202 }
hideakitai 0:3f9dbf1e2cb0 203 #endif
hideakitai 0:3f9dbf1e2cb0 204
hideakitai 0:3f9dbf1e2cb0 205 #endif /* msgpack/zbuffer.h */
hideakitai 0:3f9dbf1e2cb0 206