2 * MessagePack for C simple buffer implementation
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_SBUFFER_H
11 #define MSGPACK_SBUFFER_H
23 * @defgroup msgpack_sbuffer Simple buffer
24 * @ingroup msgpack_buffer
28 typedef struct msgpack_sbuffer
{
34 static inline void msgpack_sbuffer_init(msgpack_sbuffer
* sbuf
)
36 memset(sbuf
, 0, sizeof(msgpack_sbuffer
));
39 static inline void msgpack_sbuffer_destroy(msgpack_sbuffer
* sbuf
)
44 static inline msgpack_sbuffer
* msgpack_sbuffer_new(void)
46 return (msgpack_sbuffer
*)calloc(1, sizeof(msgpack_sbuffer
));
49 static inline void msgpack_sbuffer_free(msgpack_sbuffer
* sbuf
)
51 if(sbuf
== NULL
) { return; }
52 msgpack_sbuffer_destroy(sbuf
);
56 #ifndef MSGPACK_SBUFFER_INIT_SIZE
57 #define MSGPACK_SBUFFER_INIT_SIZE 8192
60 static inline int msgpack_sbuffer_write(void* data
, const char* buf
, size_t len
)
62 msgpack_sbuffer
* sbuf
= (msgpack_sbuffer
*)data
;
64 assert(buf
|| len
== 0);
67 if(sbuf
->alloc
- sbuf
->size
< len
) {
69 size_t nsize
= (sbuf
->alloc
) ?
70 sbuf
->alloc
* 2 : MSGPACK_SBUFFER_INIT_SIZE
;
72 while(nsize
< sbuf
->size
+ len
) {
73 size_t tmp_nsize
= nsize
* 2;
74 if (tmp_nsize
<= nsize
) {
75 nsize
= sbuf
->size
+ len
;
81 tmp
= realloc(sbuf
->data
, nsize
);
82 if(!tmp
) { return -1; }
84 sbuf
->data
= (char*)tmp
;
88 memcpy(sbuf
->data
+ sbuf
->size
, buf
, len
);
94 static inline char* msgpack_sbuffer_release(msgpack_sbuffer
* sbuf
)
96 char* tmp
= sbuf
->data
;
103 static inline void msgpack_sbuffer_clear(msgpack_sbuffer
* sbuf
)
115 #endif /* msgpack/sbuffer.h */