MessagePack for C
include
msgpack
sbuffer.h
Go to the documentation of this file.
1
/*
2
* MessagePack for C simple buffer implementation
3
*
4
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
5
*
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)
9
*/
10
#ifndef MSGPACK_SBUFFER_H
11
#define MSGPACK_SBUFFER_H
12
13
#include <stdlib.h>
14
#include <string.h>
15
16
#ifdef __cplusplus
17
extern
"C"
{
18
#endif
19
20
27
typedef
struct
msgpack_sbuffer
{
28
size_t
size
;
29
char
*
data
;
30
size_t
alloc
;
31
}
msgpack_sbuffer
;
32
33
static
inline
void
msgpack_sbuffer_init(
msgpack_sbuffer
* sbuf)
34
{
35
memset(sbuf, 0,
sizeof
(
msgpack_sbuffer
));
36
}
37
38
static
inline
void
msgpack_sbuffer_destroy(
msgpack_sbuffer
* sbuf)
39
{
40
free(sbuf->
data
);
41
}
42
43
static
inline
msgpack_sbuffer
* msgpack_sbuffer_new(
void
)
44
{
45
return
(
msgpack_sbuffer
*)calloc(1,
sizeof
(
msgpack_sbuffer
));
46
}
47
48
static
inline
void
msgpack_sbuffer_free(
msgpack_sbuffer
* sbuf)
49
{
50
if
(sbuf == NULL) {
return
; }
51
msgpack_sbuffer_destroy(sbuf);
52
free(sbuf);
53
}
54
55
#ifndef MSGPACK_SBUFFER_INIT_SIZE
56
#define MSGPACK_SBUFFER_INIT_SIZE 8192
57
#endif
58
59
static
inline
int
msgpack_sbuffer_write(
void
*
data
,
const
char
* buf,
size_t
len
)
60
{
61
msgpack_sbuffer
* sbuf = (
msgpack_sbuffer
*)
data
;
62
63
if
(sbuf->
alloc
- sbuf->
size
<
len
) {
64
void
* tmp;
65
size_t
nsize = (sbuf->
alloc
) ?
66
sbuf->
alloc
* 2 :
MSGPACK_SBUFFER_INIT_SIZE
;
67
68
while
(nsize < sbuf->size +
len
) {
69
size_t
tmp_nsize = nsize * 2;
70
if
(tmp_nsize <= nsize) {
71
nsize = sbuf->
size
+
len
;
72
break
;
73
}
74
nsize = tmp_nsize;
75
}
76
77
tmp = realloc(sbuf->
data
, nsize);
78
if
(!tmp) {
return
-1; }
79
80
sbuf->
data
= (
char
*)tmp;
81
sbuf->
alloc
= nsize;
82
}
83
84
memcpy(sbuf->
data
+ sbuf->
size
, buf,
len
);
85
sbuf->
size
+=
len
;
86
return
0;
87
}
88
89
static
inline
char
* msgpack_sbuffer_release(
msgpack_sbuffer
* sbuf)
90
{
91
char
* tmp = sbuf->
data
;
92
sbuf->
size
= 0;
93
sbuf->
data
= NULL;
94
sbuf->
alloc
= 0;
95
return
tmp;
96
}
97
98
static
inline
void
msgpack_sbuffer_clear(
msgpack_sbuffer
* sbuf)
99
{
100
sbuf->
size
= 0;
101
}
102
106
#ifdef __cplusplus
107
}
108
#endif
109
110
#endif
/* msgpack/sbuffer.h */
msgpack_sbuffer::data
char * data
Definition:
sbuffer.h:29
msgpack_sbuffer::size
size_t size
Definition:
sbuffer.h:28
msgpack_sbuffer::alloc
size_t alloc
Definition:
sbuffer.h:30
msgpack_sbuffer
Definition:
sbuffer.h:27
data
const char * data
Definition:
unpack_template.h:89
MSGPACK_SBUFFER_INIT_SIZE
#define MSGPACK_SBUFFER_INIT_SIZE
Definition:
sbuffer.h:56
msgpack_sbuffer
struct msgpack_sbuffer msgpack_sbuffer
len
const char size_t len
Definition:
unpack_template.h:89
Generated by
1.8.17