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:
Sat Feb 13 01:53:11 2016 +0000
Revision:
0:3f9dbf1e2cb0
Child:
3:a56553e46a9a
first commit

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 0:3f9dbf1e2cb0 36 #define MSGPACK_ZBUFFER_INIT_SIZE 8192
hideakitai 0:3f9dbf1e2cb0 37 #endif
hideakitai 0:3f9dbf1e2cb0 38
hideakitai 0:3f9dbf1e2cb0 39 static inline bool msgpack_zbuffer_init(
hideakitai 0:3f9dbf1e2cb0 40 msgpack_zbuffer* zbuf, int level, size_t init_size);
hideakitai 0:3f9dbf1e2cb0 41 static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 42
hideakitai 0:3f9dbf1e2cb0 43 static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size);
hideakitai 0:3f9dbf1e2cb0 44 static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 45
hideakitai 0:3f9dbf1e2cb0 46 static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 47
hideakitai 0:3f9dbf1e2cb0 48 static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 49 static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 50
hideakitai 0:3f9dbf1e2cb0 51 static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 52 static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 53 static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 54
hideakitai 0:3f9dbf1e2cb0 55
hideakitai 0:3f9dbf1e2cb0 56 #ifndef MSGPACK_ZBUFFER_RESERVE_SIZE
hideakitai 0:3f9dbf1e2cb0 57 #define MSGPACK_ZBUFFER_RESERVE_SIZE 512
hideakitai 0:3f9dbf1e2cb0 58 #endif
hideakitai 0:3f9dbf1e2cb0 59
hideakitai 0:3f9dbf1e2cb0 60 static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len);
hideakitai 0:3f9dbf1e2cb0 61
hideakitai 0:3f9dbf1e2cb0 62 static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf);
hideakitai 0:3f9dbf1e2cb0 63
hideakitai 0:3f9dbf1e2cb0 64
hideakitai 0:3f9dbf1e2cb0 65 static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
hideakitai 0:3f9dbf1e2cb0 66 int level, size_t init_size)
hideakitai 0:3f9dbf1e2cb0 67 {
hideakitai 0:3f9dbf1e2cb0 68 memset(zbuf, 0, sizeof(msgpack_zbuffer));
hideakitai 0:3f9dbf1e2cb0 69 zbuf->init_size = init_size;
hideakitai 0:3f9dbf1e2cb0 70 if(deflateInit(&zbuf->stream, level) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 71 free(zbuf->data);
hideakitai 0:3f9dbf1e2cb0 72 return false;
hideakitai 0:3f9dbf1e2cb0 73 }
hideakitai 0:3f9dbf1e2cb0 74 return true;
hideakitai 0:3f9dbf1e2cb0 75 }
hideakitai 0:3f9dbf1e2cb0 76
hideakitai 0:3f9dbf1e2cb0 77 static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 78 {
hideakitai 0:3f9dbf1e2cb0 79 deflateEnd(&zbuf->stream);
hideakitai 0:3f9dbf1e2cb0 80 free(zbuf->data);
hideakitai 0:3f9dbf1e2cb0 81 }
hideakitai 0:3f9dbf1e2cb0 82
hideakitai 0:3f9dbf1e2cb0 83 static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
hideakitai 0:3f9dbf1e2cb0 84 {
hideakitai 0:3f9dbf1e2cb0 85 msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer));
hideakitai 0:3f9dbf1e2cb0 86 if (zbuf == NULL) return NULL;
hideakitai 0:3f9dbf1e2cb0 87 if(!msgpack_zbuffer_init(zbuf, level, init_size)) {
hideakitai 0:3f9dbf1e2cb0 88 free(zbuf);
hideakitai 0:3f9dbf1e2cb0 89 return NULL;
hideakitai 0:3f9dbf1e2cb0 90 }
hideakitai 0:3f9dbf1e2cb0 91 return zbuf;
hideakitai 0:3f9dbf1e2cb0 92 }
hideakitai 0:3f9dbf1e2cb0 93
hideakitai 0:3f9dbf1e2cb0 94 static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 95 {
hideakitai 0:3f9dbf1e2cb0 96 if(zbuf == NULL) { return; }
hideakitai 0:3f9dbf1e2cb0 97 msgpack_zbuffer_destroy(zbuf);
hideakitai 0:3f9dbf1e2cb0 98 free(zbuf);
hideakitai 0:3f9dbf1e2cb0 99 }
hideakitai 0:3f9dbf1e2cb0 100
hideakitai 0:3f9dbf1e2cb0 101 static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 102 {
hideakitai 0:3f9dbf1e2cb0 103 size_t used = (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 104 size_t csize = used + zbuf->stream.avail_out;
hideakitai 0:3f9dbf1e2cb0 105 size_t nsize = (csize == 0) ? zbuf->init_size : csize * 2;
hideakitai 0:3f9dbf1e2cb0 106
hideakitai 0:3f9dbf1e2cb0 107 char* tmp = (char*)realloc(zbuf->data, nsize);
hideakitai 0:3f9dbf1e2cb0 108 if(tmp == NULL) {
hideakitai 0:3f9dbf1e2cb0 109 return false;
hideakitai 0:3f9dbf1e2cb0 110 }
hideakitai 0:3f9dbf1e2cb0 111
hideakitai 0:3f9dbf1e2cb0 112 zbuf->data = tmp;
hideakitai 0:3f9dbf1e2cb0 113 zbuf->stream.next_out = (Bytef*)(tmp + used);
hideakitai 0:3f9dbf1e2cb0 114 zbuf->stream.avail_out = nsize - used;
hideakitai 0:3f9dbf1e2cb0 115
hideakitai 0:3f9dbf1e2cb0 116 return true;
hideakitai 0:3f9dbf1e2cb0 117 }
hideakitai 0:3f9dbf1e2cb0 118
hideakitai 0:3f9dbf1e2cb0 119 static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
hideakitai 0:3f9dbf1e2cb0 120 {
hideakitai 0:3f9dbf1e2cb0 121 msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data;
hideakitai 0:3f9dbf1e2cb0 122
hideakitai 0:3f9dbf1e2cb0 123 zbuf->stream.next_in = (Bytef*)buf;
hideakitai 0:3f9dbf1e2cb0 124 zbuf->stream.avail_in = len;
hideakitai 0:3f9dbf1e2cb0 125
hideakitai 0:3f9dbf1e2cb0 126 while(zbuf->stream.avail_in > 0) {
hideakitai 0:3f9dbf1e2cb0 127 if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
hideakitai 0:3f9dbf1e2cb0 128 if(!msgpack_zbuffer_expand(zbuf)) {
hideakitai 0:3f9dbf1e2cb0 129 return -1;
hideakitai 0:3f9dbf1e2cb0 130 }
hideakitai 0:3f9dbf1e2cb0 131 }
hideakitai 0:3f9dbf1e2cb0 132
hideakitai 0:3f9dbf1e2cb0 133 if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 134 return -1;
hideakitai 0:3f9dbf1e2cb0 135 }
hideakitai 0:3f9dbf1e2cb0 136 }
hideakitai 0:3f9dbf1e2cb0 137
hideakitai 0:3f9dbf1e2cb0 138 return 0;
hideakitai 0:3f9dbf1e2cb0 139 }
hideakitai 0:3f9dbf1e2cb0 140
hideakitai 0:3f9dbf1e2cb0 141 static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 142 {
hideakitai 0:3f9dbf1e2cb0 143 while(true) {
hideakitai 0:3f9dbf1e2cb0 144 switch(deflate(&zbuf->stream, Z_FINISH)) {
hideakitai 0:3f9dbf1e2cb0 145 case Z_STREAM_END:
hideakitai 0:3f9dbf1e2cb0 146 return zbuf->data;
hideakitai 0:3f9dbf1e2cb0 147 case Z_OK:
hideakitai 0:3f9dbf1e2cb0 148 if(!msgpack_zbuffer_expand(zbuf)) {
hideakitai 0:3f9dbf1e2cb0 149 return NULL;
hideakitai 0:3f9dbf1e2cb0 150 }
hideakitai 0:3f9dbf1e2cb0 151 break;
hideakitai 0:3f9dbf1e2cb0 152 default:
hideakitai 0:3f9dbf1e2cb0 153 return NULL;
hideakitai 0:3f9dbf1e2cb0 154 }
hideakitai 0:3f9dbf1e2cb0 155 }
hideakitai 0:3f9dbf1e2cb0 156 }
hideakitai 0:3f9dbf1e2cb0 157
hideakitai 0:3f9dbf1e2cb0 158 static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 159 {
hideakitai 0:3f9dbf1e2cb0 160 return zbuf->data;
hideakitai 0:3f9dbf1e2cb0 161 }
hideakitai 0:3f9dbf1e2cb0 162
hideakitai 0:3f9dbf1e2cb0 163 static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 164 {
hideakitai 0:3f9dbf1e2cb0 165 return (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 166 }
hideakitai 0:3f9dbf1e2cb0 167
hideakitai 0:3f9dbf1e2cb0 168 static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 169 {
hideakitai 0:3f9dbf1e2cb0 170 zbuf->stream.avail_out += (char*)zbuf->stream.next_out - zbuf->data;
hideakitai 0:3f9dbf1e2cb0 171 zbuf->stream.next_out = (Bytef*)zbuf->data;
hideakitai 0:3f9dbf1e2cb0 172 }
hideakitai 0:3f9dbf1e2cb0 173
hideakitai 0:3f9dbf1e2cb0 174 static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 175 {
hideakitai 0:3f9dbf1e2cb0 176 if(deflateReset(&zbuf->stream) != Z_OK) {
hideakitai 0:3f9dbf1e2cb0 177 return false;
hideakitai 0:3f9dbf1e2cb0 178 }
hideakitai 0:3f9dbf1e2cb0 179 msgpack_zbuffer_reset_buffer(zbuf);
hideakitai 0:3f9dbf1e2cb0 180 return true;
hideakitai 0:3f9dbf1e2cb0 181 }
hideakitai 0:3f9dbf1e2cb0 182
hideakitai 0:3f9dbf1e2cb0 183 static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
hideakitai 0:3f9dbf1e2cb0 184 {
hideakitai 0:3f9dbf1e2cb0 185 char* tmp = zbuf->data;
hideakitai 0:3f9dbf1e2cb0 186 zbuf->data = NULL;
hideakitai 0:3f9dbf1e2cb0 187 zbuf->stream.next_out = NULL;
hideakitai 0:3f9dbf1e2cb0 188 zbuf->stream.avail_out = 0;
hideakitai 0:3f9dbf1e2cb0 189 return tmp;
hideakitai 0:3f9dbf1e2cb0 190 }
hideakitai 0:3f9dbf1e2cb0 191
hideakitai 0:3f9dbf1e2cb0 192 /** @} */
hideakitai 0:3f9dbf1e2cb0 193
hideakitai 0:3f9dbf1e2cb0 194
hideakitai 0:3f9dbf1e2cb0 195 #ifdef __cplusplus
hideakitai 0:3f9dbf1e2cb0 196 }
hideakitai 0:3f9dbf1e2cb0 197 #endif
hideakitai 0:3f9dbf1e2cb0 198
hideakitai 0:3f9dbf1e2cb0 199 #endif /* msgpack/zbuffer.h */
hideakitai 0:3f9dbf1e2cb0 200