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:
0:3f9dbf1e2cb0
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 unpacking routine
hideakitai 0:3f9dbf1e2cb0 3 *
hideakitai 0:3f9dbf1e2cb0 4 * Copyright (C) 2008-2009 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_UNPACKER_H
hideakitai 0:3f9dbf1e2cb0 11 #define MSGPACK_UNPACKER_H
hideakitai 0:3f9dbf1e2cb0 12
hideakitai 0:3f9dbf1e2cb0 13 #include "zone.h"
hideakitai 0:3f9dbf1e2cb0 14 #include "object.h"
hideakitai 0:3f9dbf1e2cb0 15 #include <string.h>
hideakitai 0:3f9dbf1e2cb0 16
hideakitai 0:3f9dbf1e2cb0 17 #ifdef __cplusplus
hideakitai 0:3f9dbf1e2cb0 18 extern "C" {
hideakitai 0:3f9dbf1e2cb0 19 #endif
hideakitai 0:3f9dbf1e2cb0 20
hideakitai 0:3f9dbf1e2cb0 21
hideakitai 0:3f9dbf1e2cb0 22 /**
hideakitai 0:3f9dbf1e2cb0 23 * @defgroup msgpack_unpack Deserializer
hideakitai 0:3f9dbf1e2cb0 24 * @ingroup msgpack
hideakitai 0:3f9dbf1e2cb0 25 * @{
hideakitai 0:3f9dbf1e2cb0 26 */
hideakitai 0:3f9dbf1e2cb0 27
hideakitai 0:3f9dbf1e2cb0 28 typedef struct msgpack_unpacked {
hideakitai 0:3f9dbf1e2cb0 29 msgpack_zone* zone;
hideakitai 0:3f9dbf1e2cb0 30 msgpack_object data;
hideakitai 0:3f9dbf1e2cb0 31 } msgpack_unpacked;
hideakitai 0:3f9dbf1e2cb0 32
hideakitai 0:3f9dbf1e2cb0 33 typedef enum {
hideakitai 0:3f9dbf1e2cb0 34 MSGPACK_UNPACK_SUCCESS = 2,
hideakitai 0:3f9dbf1e2cb0 35 MSGPACK_UNPACK_EXTRA_BYTES = 1,
hideakitai 0:3f9dbf1e2cb0 36 MSGPACK_UNPACK_CONTINUE = 0,
hideakitai 0:3f9dbf1e2cb0 37 MSGPACK_UNPACK_PARSE_ERROR = -1,
hideakitai 0:3f9dbf1e2cb0 38 MSGPACK_UNPACK_NOMEM_ERROR = -2
hideakitai 0:3f9dbf1e2cb0 39 } msgpack_unpack_return;
hideakitai 0:3f9dbf1e2cb0 40
hideakitai 0:3f9dbf1e2cb0 41
hideakitai 0:3f9dbf1e2cb0 42 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 43 msgpack_unpack_return
hideakitai 0:3f9dbf1e2cb0 44 msgpack_unpack_next(msgpack_unpacked* result,
hideakitai 0:3f9dbf1e2cb0 45 const char* data, size_t len, size_t* off);
hideakitai 0:3f9dbf1e2cb0 46
hideakitai 0:3f9dbf1e2cb0 47 /** @} */
hideakitai 0:3f9dbf1e2cb0 48
hideakitai 0:3f9dbf1e2cb0 49
hideakitai 0:3f9dbf1e2cb0 50 /**
hideakitai 0:3f9dbf1e2cb0 51 * @defgroup msgpack_unpacker Streaming deserializer
hideakitai 0:3f9dbf1e2cb0 52 * @ingroup msgpack
hideakitai 0:3f9dbf1e2cb0 53 * @{
hideakitai 0:3f9dbf1e2cb0 54 */
hideakitai 0:3f9dbf1e2cb0 55
hideakitai 0:3f9dbf1e2cb0 56 typedef struct msgpack_unpacker {
hideakitai 0:3f9dbf1e2cb0 57 char* buffer;
hideakitai 0:3f9dbf1e2cb0 58 size_t used;
hideakitai 0:3f9dbf1e2cb0 59 size_t free;
hideakitai 0:3f9dbf1e2cb0 60 size_t off;
hideakitai 0:3f9dbf1e2cb0 61 size_t parsed;
hideakitai 0:3f9dbf1e2cb0 62 msgpack_zone* z;
hideakitai 0:3f9dbf1e2cb0 63 size_t initial_buffer_size;
hideakitai 0:3f9dbf1e2cb0 64 void* ctx;
hideakitai 0:3f9dbf1e2cb0 65 } msgpack_unpacker;
hideakitai 0:3f9dbf1e2cb0 66
hideakitai 0:3f9dbf1e2cb0 67
hideakitai 0:3f9dbf1e2cb0 68 #ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
hideakitai 0:3f9dbf1e2cb0 69 #define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
hideakitai 0:3f9dbf1e2cb0 70 #endif
hideakitai 0:3f9dbf1e2cb0 71
hideakitai 0:3f9dbf1e2cb0 72 /**
hideakitai 0:3f9dbf1e2cb0 73 * Initializes a streaming deserializer.
hideakitai 0:3f9dbf1e2cb0 74 * The initialized deserializer must be destroyed by msgpack_unpacker_destroy(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 75 */
hideakitai 0:3f9dbf1e2cb0 76 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 77 bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size);
hideakitai 0:3f9dbf1e2cb0 78
hideakitai 0:3f9dbf1e2cb0 79 /**
hideakitai 0:3f9dbf1e2cb0 80 * Destroys a streaming deserializer initialized by msgpack_unpacker_init(msgpack_unpacker*, size_t).
hideakitai 0:3f9dbf1e2cb0 81 */
hideakitai 0:3f9dbf1e2cb0 82 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 83 void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 84
hideakitai 0:3f9dbf1e2cb0 85
hideakitai 0:3f9dbf1e2cb0 86 /**
hideakitai 0:3f9dbf1e2cb0 87 * Creates a streaming deserializer.
hideakitai 0:3f9dbf1e2cb0 88 * The created deserializer must be destroyed by msgpack_unpacker_free(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 89 */
hideakitai 0:3f9dbf1e2cb0 90 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 91 msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
hideakitai 0:3f9dbf1e2cb0 92
hideakitai 0:3f9dbf1e2cb0 93 /**
hideakitai 0:3f9dbf1e2cb0 94 * Frees a streaming deserializer created by msgpack_unpacker_new(size_t).
hideakitai 0:3f9dbf1e2cb0 95 */
hideakitai 0:3f9dbf1e2cb0 96 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 97 void msgpack_unpacker_free(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 98
hideakitai 0:3f9dbf1e2cb0 99
hideakitai 0:3f9dbf1e2cb0 100 #ifndef MSGPACK_UNPACKER_RESERVE_SIZE
hideakitai 0:3f9dbf1e2cb0 101 #define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
hideakitai 0:3f9dbf1e2cb0 102 #endif
hideakitai 0:3f9dbf1e2cb0 103
hideakitai 0:3f9dbf1e2cb0 104 /**
hideakitai 0:3f9dbf1e2cb0 105 * Reserves free space of the internal buffer.
hideakitai 0:3f9dbf1e2cb0 106 * Use this function to fill the internal buffer with
hideakitai 0:3f9dbf1e2cb0 107 * msgpack_unpacker_buffer(msgpack_unpacker*),
hideakitai 0:3f9dbf1e2cb0 108 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
hideakitai 0:3f9dbf1e2cb0 109 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 110 */
hideakitai 0:3f9dbf1e2cb0 111 static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
hideakitai 0:3f9dbf1e2cb0 112
hideakitai 0:3f9dbf1e2cb0 113 /**
hideakitai 0:3f9dbf1e2cb0 114 * Gets pointer to the free space of the internal buffer.
hideakitai 0:3f9dbf1e2cb0 115 * Use this function to fill the internal buffer with
hideakitai 0:3f9dbf1e2cb0 116 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
hideakitai 0:3f9dbf1e2cb0 117 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
hideakitai 0:3f9dbf1e2cb0 118 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 119 */
hideakitai 0:3f9dbf1e2cb0 120 static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 121
hideakitai 0:3f9dbf1e2cb0 122 /**
hideakitai 0:3f9dbf1e2cb0 123 * Gets size of the free space of the internal buffer.
hideakitai 0:3f9dbf1e2cb0 124 * Use this function to fill the internal buffer with
hideakitai 0:3f9dbf1e2cb0 125 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
hideakitai 0:3f9dbf1e2cb0 126 * msgpack_unpacker_buffer(const msgpack_unpacker*) and
hideakitai 0:3f9dbf1e2cb0 127 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 128 */
hideakitai 0:3f9dbf1e2cb0 129 static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 130
hideakitai 0:3f9dbf1e2cb0 131 /**
hideakitai 0:3f9dbf1e2cb0 132 * Notifies the deserializer that the internal buffer filled.
hideakitai 0:3f9dbf1e2cb0 133 * Use this function to fill the internal buffer with
hideakitai 0:3f9dbf1e2cb0 134 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
hideakitai 0:3f9dbf1e2cb0 135 * msgpack_unpacker_buffer(msgpack_unpacker*) and
hideakitai 0:3f9dbf1e2cb0 136 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 137 */
hideakitai 0:3f9dbf1e2cb0 138 static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size);
hideakitai 0:3f9dbf1e2cb0 139
hideakitai 0:3f9dbf1e2cb0 140
hideakitai 0:3f9dbf1e2cb0 141 /**
hideakitai 0:3f9dbf1e2cb0 142 * Deserializes one object.
hideakitai 0:3f9dbf1e2cb0 143 * Returns true if it successes. Otherwise false is returned.
hideakitai 0:3f9dbf1e2cb0 144 * @param pac pointer to an initialized msgpack_unpacked object.
hideakitai 0:3f9dbf1e2cb0 145 */
hideakitai 0:3f9dbf1e2cb0 146 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 147 msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* pac);
hideakitai 0:3f9dbf1e2cb0 148
hideakitai 0:3f9dbf1e2cb0 149 /**
hideakitai 0:3f9dbf1e2cb0 150 * Initializes a msgpack_unpacked object.
hideakitai 0:3f9dbf1e2cb0 151 * The initialized object must be destroyed by msgpack_unpacked_destroy(msgpack_unpacker*).
hideakitai 0:3f9dbf1e2cb0 152 * Use the object with msgpack_unpacker_next(msgpack_unpacker*, msgpack_unpacked*) or
hideakitai 0:3f9dbf1e2cb0 153 * msgpack_unpack_next(msgpack_unpacked*, const char*, size_t, size_t*).
hideakitai 0:3f9dbf1e2cb0 154 */
hideakitai 0:3f9dbf1e2cb0 155 static inline void msgpack_unpacked_init(msgpack_unpacked* result);
hideakitai 0:3f9dbf1e2cb0 156
hideakitai 0:3f9dbf1e2cb0 157 /**
hideakitai 0:3f9dbf1e2cb0 158 * Destroys a streaming deserializer initialized by msgpack_unpacked().
hideakitai 0:3f9dbf1e2cb0 159 */
hideakitai 0:3f9dbf1e2cb0 160 static inline void msgpack_unpacked_destroy(msgpack_unpacked* result);
hideakitai 0:3f9dbf1e2cb0 161
hideakitai 0:3f9dbf1e2cb0 162 /**
hideakitai 0:3f9dbf1e2cb0 163 * Releases the memory zone from msgpack_unpacked object.
hideakitai 0:3f9dbf1e2cb0 164 * The released zone must be freed by msgpack_zone_free(msgpack_zone*).
hideakitai 0:3f9dbf1e2cb0 165 */
hideakitai 0:3f9dbf1e2cb0 166 static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result);
hideakitai 0:3f9dbf1e2cb0 167
hideakitai 0:3f9dbf1e2cb0 168
hideakitai 0:3f9dbf1e2cb0 169 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 170 int msgpack_unpacker_execute(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 171
hideakitai 0:3f9dbf1e2cb0 172 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 173 msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 174
hideakitai 0:3f9dbf1e2cb0 175 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 176 msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 177
hideakitai 0:3f9dbf1e2cb0 178 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 179 void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 180
hideakitai 0:3f9dbf1e2cb0 181 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 182 void msgpack_unpacker_reset(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 183
hideakitai 0:3f9dbf1e2cb0 184 static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 185
hideakitai 0:3f9dbf1e2cb0 186
hideakitai 0:3f9dbf1e2cb0 187 /** @} */
hideakitai 0:3f9dbf1e2cb0 188
hideakitai 0:3f9dbf1e2cb0 189
hideakitai 0:3f9dbf1e2cb0 190 // obsolete
hideakitai 0:3f9dbf1e2cb0 191 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 192 msgpack_unpack_return
hideakitai 0:3f9dbf1e2cb0 193 msgpack_unpack(const char* data, size_t len, size_t* off,
hideakitai 0:3f9dbf1e2cb0 194 msgpack_zone* result_zone, msgpack_object* result);
hideakitai 0:3f9dbf1e2cb0 195
hideakitai 0:3f9dbf1e2cb0 196
hideakitai 0:3f9dbf1e2cb0 197
hideakitai 0:3f9dbf1e2cb0 198
hideakitai 0:3f9dbf1e2cb0 199 static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 200
hideakitai 0:3f9dbf1e2cb0 201 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 202 bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
hideakitai 0:3f9dbf1e2cb0 203
hideakitai 0:3f9dbf1e2cb0 204 MSGPACK_DLLEXPORT
hideakitai 0:3f9dbf1e2cb0 205 bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
hideakitai 0:3f9dbf1e2cb0 206
hideakitai 0:3f9dbf1e2cb0 207 static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
hideakitai 0:3f9dbf1e2cb0 208 {
hideakitai 0:3f9dbf1e2cb0 209 if(mpac->free >= size) { return true; }
hideakitai 0:3f9dbf1e2cb0 210 return msgpack_unpacker_expand_buffer(mpac, size);
hideakitai 0:3f9dbf1e2cb0 211 }
hideakitai 0:3f9dbf1e2cb0 212
hideakitai 0:3f9dbf1e2cb0 213 static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac)
hideakitai 0:3f9dbf1e2cb0 214 {
hideakitai 0:3f9dbf1e2cb0 215 return mpac->buffer + mpac->used;
hideakitai 0:3f9dbf1e2cb0 216 }
hideakitai 0:3f9dbf1e2cb0 217
hideakitai 0:3f9dbf1e2cb0 218 static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac)
hideakitai 0:3f9dbf1e2cb0 219 {
hideakitai 0:3f9dbf1e2cb0 220 return mpac->free;
hideakitai 0:3f9dbf1e2cb0 221 }
hideakitai 0:3f9dbf1e2cb0 222
hideakitai 0:3f9dbf1e2cb0 223 static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
hideakitai 0:3f9dbf1e2cb0 224 {
hideakitai 0:3f9dbf1e2cb0 225 mpac->used += size;
hideakitai 0:3f9dbf1e2cb0 226 mpac->free -= size;
hideakitai 0:3f9dbf1e2cb0 227 }
hideakitai 0:3f9dbf1e2cb0 228
hideakitai 0:3f9dbf1e2cb0 229 static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac)
hideakitai 0:3f9dbf1e2cb0 230 {
hideakitai 0:3f9dbf1e2cb0 231 return mpac->parsed - mpac->off + mpac->used;
hideakitai 0:3f9dbf1e2cb0 232 }
hideakitai 0:3f9dbf1e2cb0 233
hideakitai 0:3f9dbf1e2cb0 234 static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
hideakitai 0:3f9dbf1e2cb0 235 {
hideakitai 0:3f9dbf1e2cb0 236 return mpac->parsed;
hideakitai 0:3f9dbf1e2cb0 237 }
hideakitai 0:3f9dbf1e2cb0 238
hideakitai 0:3f9dbf1e2cb0 239
hideakitai 0:3f9dbf1e2cb0 240 static inline void msgpack_unpacked_init(msgpack_unpacked* result)
hideakitai 0:3f9dbf1e2cb0 241 {
hideakitai 0:3f9dbf1e2cb0 242 memset(result, 0, sizeof(msgpack_unpacked));
hideakitai 0:3f9dbf1e2cb0 243 }
hideakitai 0:3f9dbf1e2cb0 244
hideakitai 0:3f9dbf1e2cb0 245 static inline void msgpack_unpacked_destroy(msgpack_unpacked* result)
hideakitai 0:3f9dbf1e2cb0 246 {
hideakitai 0:3f9dbf1e2cb0 247 if(result->zone != NULL) {
hideakitai 0:3f9dbf1e2cb0 248 msgpack_zone_free(result->zone);
hideakitai 0:3f9dbf1e2cb0 249 result->zone = NULL;
hideakitai 0:3f9dbf1e2cb0 250 memset(&result->data, 0, sizeof(msgpack_object));
hideakitai 0:3f9dbf1e2cb0 251 }
hideakitai 0:3f9dbf1e2cb0 252 }
hideakitai 0:3f9dbf1e2cb0 253
hideakitai 0:3f9dbf1e2cb0 254 static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result)
hideakitai 0:3f9dbf1e2cb0 255 {
hideakitai 0:3f9dbf1e2cb0 256 if(result->zone != NULL) {
hideakitai 0:3f9dbf1e2cb0 257 msgpack_zone* z = result->zone;
hideakitai 0:3f9dbf1e2cb0 258 result->zone = NULL;
hideakitai 0:3f9dbf1e2cb0 259 return z;
hideakitai 0:3f9dbf1e2cb0 260 }
hideakitai 0:3f9dbf1e2cb0 261 return NULL;
hideakitai 0:3f9dbf1e2cb0 262 }
hideakitai 0:3f9dbf1e2cb0 263
hideakitai 0:3f9dbf1e2cb0 264
hideakitai 0:3f9dbf1e2cb0 265 #ifdef __cplusplus
hideakitai 0:3f9dbf1e2cb0 266 }
hideakitai 0:3f9dbf1e2cb0 267 #endif
hideakitai 0:3f9dbf1e2cb0 268
hideakitai 0:3f9dbf1e2cb0 269 #endif /* msgpack/unpack.h */