2 * MessagePack for C unpacking routine
4 * Copyright (C) 2008-2009 FURUHASHI Sadayuki
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)
10 #ifndef MSGPACK_UNPACKER_H
11 #define MSGPACK_UNPACKER_H
23 * @defgroup msgpack_unpack Deserializer
28 typedef struct msgpack_unpacked
{
34 MSGPACK_UNPACK_SUCCESS
= 2,
35 MSGPACK_UNPACK_EXTRA_BYTES
= 1,
36 MSGPACK_UNPACK_CONTINUE
= 0,
37 MSGPACK_UNPACK_PARSE_ERROR
= -1,
38 MSGPACK_UNPACK_NOMEM_ERROR
= -2
39 } msgpack_unpack_return
;
44 msgpack_unpack_next(msgpack_unpacked
* result
,
45 const char* data
, size_t len
, size_t* off
);
51 * @defgroup msgpack_unpacker Streaming deserializer
56 typedef struct msgpack_unpacker
{
63 size_t initial_buffer_size
;
68 #ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
69 #define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
73 * Initializes a streaming deserializer.
74 * The initialized deserializer must be destroyed by msgpack_unpacker_destroy(msgpack_unpacker*).
77 bool msgpack_unpacker_init(msgpack_unpacker
* mpac
, size_t initial_buffer_size
);
80 * Destroys a streaming deserializer initialized by msgpack_unpacker_init(msgpack_unpacker*, size_t).
83 void msgpack_unpacker_destroy(msgpack_unpacker
* mpac
);
87 * Creates a streaming deserializer.
88 * The created deserializer must be destroyed by msgpack_unpacker_free(msgpack_unpacker*).
91 msgpack_unpacker
* msgpack_unpacker_new(size_t initial_buffer_size
);
94 * Frees a streaming deserializer created by msgpack_unpacker_new(size_t).
97 void msgpack_unpacker_free(msgpack_unpacker
* mpac
);
100 #ifndef MSGPACK_UNPACKER_RESERVE_SIZE
101 #define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
105 * Reserves free space of the internal buffer.
106 * Use this function to fill the internal buffer with
107 * msgpack_unpacker_buffer(msgpack_unpacker*),
108 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
109 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
111 static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker
* mpac
, size_t size
);
114 * Gets pointer to the free space of the internal buffer.
115 * Use this function to fill the internal buffer with
116 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
117 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
118 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
120 static inline char* msgpack_unpacker_buffer(msgpack_unpacker
* mpac
);
123 * Gets size of the free space of the internal buffer.
124 * Use this function to fill the internal buffer with
125 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
126 * msgpack_unpacker_buffer(const msgpack_unpacker*) and
127 * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
129 static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker
* mpac
);
132 * Notifies the deserializer that the internal buffer filled.
133 * Use this function to fill the internal buffer with
134 * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
135 * msgpack_unpacker_buffer(msgpack_unpacker*) and
136 * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*).
138 static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker
* mpac
, size_t size
);
142 * Deserializes one object.
143 * Returns true if it successes. Otherwise false is returned.
144 * @param pac pointer to an initialized msgpack_unpacked object.
147 msgpack_unpack_return
msgpack_unpacker_next(msgpack_unpacker
* mpac
, msgpack_unpacked
* pac
);
150 * Deserializes one object and set the number of parsed bytes involved.
151 * Returns true if it successes. Otherwise false is returned.
152 * @param mpac pointer to an initialized msgpack_unpacker object.
153 * @param result pointer to an initialized msgpack_unpacked object.
154 * @param p_bytes pointer to variable that will be set with the number of parsed bytes.
157 msgpack_unpack_return
msgpack_unpacker_next_with_size(msgpack_unpacker
* mpac
,
158 msgpack_unpacked
* result
,
162 * Initializes a msgpack_unpacked object.
163 * The initialized object must be destroyed by msgpack_unpacked_destroy(msgpack_unpacker*).
164 * Use the object with msgpack_unpacker_next(msgpack_unpacker*, msgpack_unpacked*) or
165 * msgpack_unpack_next(msgpack_unpacked*, const char*, size_t, size_t*).
167 static inline void msgpack_unpacked_init(msgpack_unpacked
* result
);
170 * Destroys a streaming deserializer initialized by msgpack_unpacked().
172 static inline void msgpack_unpacked_destroy(msgpack_unpacked
* result
);
175 * Releases the memory zone from msgpack_unpacked object.
176 * The released zone must be freed by msgpack_zone_free(msgpack_zone*).
178 static inline msgpack_zone
* msgpack_unpacked_release_zone(msgpack_unpacked
* result
);
182 int msgpack_unpacker_execute(msgpack_unpacker
* mpac
);
185 msgpack_object
msgpack_unpacker_data(msgpack_unpacker
* mpac
);
188 msgpack_zone
* msgpack_unpacker_release_zone(msgpack_unpacker
* mpac
);
191 void msgpack_unpacker_reset_zone(msgpack_unpacker
* mpac
);
194 void msgpack_unpacker_reset(msgpack_unpacker
* mpac
);
196 static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker
* mpac
);
204 msgpack_unpack_return
205 msgpack_unpack(const char* data
, size_t len
, size_t* off
,
206 msgpack_zone
* result_zone
, msgpack_object
* result
);
211 static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker
* mpac
);
214 bool msgpack_unpacker_flush_zone(msgpack_unpacker
* mpac
);
217 bool msgpack_unpacker_expand_buffer(msgpack_unpacker
* mpac
, size_t size
);
219 static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker
* mpac
, size_t size
)
221 if(mpac
->free
>= size
) { return true; }
222 return msgpack_unpacker_expand_buffer(mpac
, size
);
225 static inline char* msgpack_unpacker_buffer(msgpack_unpacker
* mpac
)
227 return mpac
->buffer
+ mpac
->used
;
230 static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker
* mpac
)
235 static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker
* mpac
, size_t size
)
241 static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker
* mpac
)
243 return mpac
->parsed
- mpac
->off
+ mpac
->used
;
246 static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker
* mpac
)
252 static inline void msgpack_unpacked_init(msgpack_unpacked
* result
)
254 memset(result
, 0, sizeof(msgpack_unpacked
));
257 static inline void msgpack_unpacked_destroy(msgpack_unpacked
* result
)
259 if(result
->zone
!= NULL
) {
260 msgpack_zone_free(result
->zone
);
262 memset(&result
->data
, 0, sizeof(msgpack_object
));
266 static inline msgpack_zone
* msgpack_unpacked_release_zone(msgpack_unpacked
* result
)
268 if(result
->zone
!= NULL
) {
269 msgpack_zone
* z
= result
->zone
;
281 #endif /* msgpack/unpack.h */