ffi-nats-core 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ffi-nats-core.gemspec +8 -0
- data/lib/ffi/nats/core/version.rb +1 -1
- data/vendor/cnats/CMakeLists.txt +137 -0
- data/vendor/cnats/adapters/libevent.h +220 -0
- data/vendor/cnats/adapters/libuv.h +472 -0
- data/vendor/cnats/examples/CMakeLists.txt +56 -0
- data/vendor/cnats/examples/asynctimeout.c +83 -0
- data/vendor/cnats/examples/examples.h +322 -0
- data/vendor/cnats/examples/libevent-pub.c +136 -0
- data/vendor/cnats/examples/libevent-sub.c +104 -0
- data/vendor/cnats/examples/libuv-pub.c +120 -0
- data/vendor/cnats/examples/libuv-sub.c +114 -0
- data/vendor/cnats/examples/publisher.c +62 -0
- data/vendor/cnats/examples/queuegroup.c +132 -0
- data/vendor/cnats/examples/replier.c +149 -0
- data/vendor/cnats/examples/requestor.c +75 -0
- data/vendor/cnats/examples/subscriber.c +133 -0
- data/vendor/cnats/src/CMakeLists.txt +31 -0
- data/vendor/cnats/src/asynccb.c +66 -0
- data/vendor/cnats/src/asynccb.h +42 -0
- data/vendor/cnats/src/buf.c +246 -0
- data/vendor/cnats/src/buf.h +116 -0
- data/vendor/cnats/src/comsock.c +474 -0
- data/vendor/cnats/src/comsock.h +81 -0
- data/vendor/cnats/src/conn.c +2725 -0
- data/vendor/cnats/src/conn.h +75 -0
- data/vendor/cnats/src/err.h +31 -0
- data/vendor/cnats/src/gc.h +27 -0
- data/vendor/cnats/src/hash.c +725 -0
- data/vendor/cnats/src/hash.h +141 -0
- data/vendor/cnats/src/include/n-unix.h +56 -0
- data/vendor/cnats/src/include/n-win.h +59 -0
- data/vendor/cnats/src/mem.h +20 -0
- data/vendor/cnats/src/msg.c +155 -0
- data/vendor/cnats/src/msg.h +43 -0
- data/vendor/cnats/src/nats.c +1734 -0
- data/vendor/cnats/src/nats.h +2024 -0
- data/vendor/cnats/src/natsp.h +518 -0
- data/vendor/cnats/src/natstime.c +79 -0
- data/vendor/cnats/src/natstime.h +27 -0
- data/vendor/cnats/src/nuid.c +265 -0
- data/vendor/cnats/src/nuid.h +21 -0
- data/vendor/cnats/src/opts.c +1030 -0
- data/vendor/cnats/src/opts.h +19 -0
- data/vendor/cnats/src/parser.c +869 -0
- data/vendor/cnats/src/parser.h +87 -0
- data/vendor/cnats/src/pub.c +293 -0
- data/vendor/cnats/src/srvpool.c +380 -0
- data/vendor/cnats/src/srvpool.h +71 -0
- data/vendor/cnats/src/stats.c +54 -0
- data/vendor/cnats/src/stats.h +21 -0
- data/vendor/cnats/src/status.c +60 -0
- data/vendor/cnats/src/status.h +95 -0
- data/vendor/cnats/src/sub.c +956 -0
- data/vendor/cnats/src/sub.h +34 -0
- data/vendor/cnats/src/timer.c +86 -0
- data/vendor/cnats/src/timer.h +57 -0
- data/vendor/cnats/src/unix/cond.c +103 -0
- data/vendor/cnats/src/unix/mutex.c +107 -0
- data/vendor/cnats/src/unix/sock.c +105 -0
- data/vendor/cnats/src/unix/thread.c +162 -0
- data/vendor/cnats/src/url.c +134 -0
- data/vendor/cnats/src/url.h +24 -0
- data/vendor/cnats/src/util.c +823 -0
- data/vendor/cnats/src/util.h +75 -0
- data/vendor/cnats/src/version.h +29 -0
- data/vendor/cnats/src/version.h.in +29 -0
- data/vendor/cnats/src/win/cond.c +86 -0
- data/vendor/cnats/src/win/mutex.c +54 -0
- data/vendor/cnats/src/win/sock.c +158 -0
- data/vendor/cnats/src/win/strings.c +108 -0
- data/vendor/cnats/src/win/thread.c +180 -0
- data/vendor/cnats/test/CMakeLists.txt +35 -0
- data/vendor/cnats/test/certs/ca.pem +38 -0
- data/vendor/cnats/test/certs/client-cert.pem +30 -0
- data/vendor/cnats/test/certs/client-key.pem +51 -0
- data/vendor/cnats/test/certs/server-cert.pem +31 -0
- data/vendor/cnats/test/certs/server-key.pem +51 -0
- data/vendor/cnats/test/dylib/CMakeLists.txt +10 -0
- data/vendor/cnats/test/dylib/nonats.c +13 -0
- data/vendor/cnats/test/list.txt +125 -0
- data/vendor/cnats/test/test.c +11655 -0
- data/vendor/cnats/test/tls.conf +15 -0
- data/vendor/cnats/test/tlsverify.conf +19 -0
- metadata +83 -1
@@ -0,0 +1,31 @@
|
|
1
|
+
#------------------------
|
2
|
+
# Add the sub-directories
|
3
|
+
#------------------------
|
4
|
+
include_directories(include)
|
5
|
+
include_directories(${NATS_PLATFORM_INCLUDE})
|
6
|
+
if(NATS_BUILD_WITH_TLS)
|
7
|
+
include_directories(${OPENSSL_INCLUDE_DIR})
|
8
|
+
set(NATS_OPENSSL_LIBS "${OPENSSL_LIBRARIES}")
|
9
|
+
endif(NATS_BUILD_WITH_TLS)
|
10
|
+
|
11
|
+
#---------------------------------------
|
12
|
+
# Grab all files in 'src' and 'src/unix'
|
13
|
+
# or 'src/win' depending on the platform
|
14
|
+
#---------------------------------------
|
15
|
+
file(GLOB SOURCES "*.c")
|
16
|
+
file(GLOB PS_SOURCES "${NATS_PLATFORM_INCLUDE}/*.c")
|
17
|
+
|
18
|
+
# --------------------------------------
|
19
|
+
# Create the shared and static libraries
|
20
|
+
# --------------------------------------
|
21
|
+
add_library(nats SHARED ${SOURCES} ${PS_SOURCES})
|
22
|
+
target_link_libraries(nats ${NATS_OPENSSL_LIBS} ${NATS_EXTRA_LIB})
|
23
|
+
add_library(nats_static STATIC ${SOURCES} ${PS_SOURCES})
|
24
|
+
target_link_libraries(nats_static ${NATS_OPENSSL_LIBS})
|
25
|
+
|
26
|
+
# --------------------------------------
|
27
|
+
# Install the libraries and header files
|
28
|
+
# --------------------------------------
|
29
|
+
install(TARGETS nats DESTINATION lib)
|
30
|
+
install(TARGETS nats_static DESTINATION lib)
|
31
|
+
install(FILES nats.h status.h version.h DESTINATION include)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include "natsp.h"
|
4
|
+
#include "mem.h"
|
5
|
+
#include "conn.h"
|
6
|
+
|
7
|
+
static void
|
8
|
+
_freeAsyncCbInfo(natsAsyncCbInfo *info)
|
9
|
+
{
|
10
|
+
NATS_FREE(info);
|
11
|
+
}
|
12
|
+
|
13
|
+
static void
|
14
|
+
_createAndPostCb(natsAsyncCbType type, natsConnection *nc, natsSubscription *sub, natsStatus err)
|
15
|
+
{
|
16
|
+
natsStatus s = NATS_OK;
|
17
|
+
natsAsyncCbInfo *cb;
|
18
|
+
|
19
|
+
cb = NATS_CALLOC(1, sizeof(natsAsyncCbInfo));
|
20
|
+
if (cb == NULL)
|
21
|
+
{
|
22
|
+
// We will ignore for now since that makes the caller handle the
|
23
|
+
// possibility of having to run the callbacks in-line...
|
24
|
+
return;
|
25
|
+
}
|
26
|
+
|
27
|
+
cb->type = type;
|
28
|
+
cb->nc = nc;
|
29
|
+
cb->sub = sub;
|
30
|
+
cb->err = err;
|
31
|
+
|
32
|
+
natsConn_retain(nc);
|
33
|
+
|
34
|
+
s = nats_postAsyncCbInfo(cb);
|
35
|
+
if (s != NATS_OK)
|
36
|
+
{
|
37
|
+
_freeAsyncCbInfo(cb);
|
38
|
+
natsConn_release(nc);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
void
|
43
|
+
natsAsyncCb_PostConnHandler(natsConnection *nc, natsAsyncCbType type)
|
44
|
+
{
|
45
|
+
_createAndPostCb(type, nc, NULL, NATS_OK);
|
46
|
+
}
|
47
|
+
|
48
|
+
void
|
49
|
+
natsAsyncCb_PostErrHandler(natsConnection *nc, natsSubscription *sub, natsStatus err)
|
50
|
+
{
|
51
|
+
_createAndPostCb(ASYNC_ERROR, nc, sub, err);
|
52
|
+
}
|
53
|
+
|
54
|
+
void
|
55
|
+
natsAsyncCb_Destroy(natsAsyncCbInfo *info)
|
56
|
+
{
|
57
|
+
natsConnection *nc;
|
58
|
+
|
59
|
+
if (info == NULL)
|
60
|
+
return;
|
61
|
+
|
62
|
+
nc = info->nc;
|
63
|
+
|
64
|
+
_freeAsyncCbInfo(info);
|
65
|
+
natsConn_release(nc);
|
66
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef ASYNCCB_H_
|
4
|
+
#define ASYNCCB_H_
|
5
|
+
|
6
|
+
#include "status.h"
|
7
|
+
|
8
|
+
typedef enum
|
9
|
+
{
|
10
|
+
ASYNC_CLOSED = 0,
|
11
|
+
ASYNC_DISCONNECTED,
|
12
|
+
ASYNC_RECONNECTED,
|
13
|
+
ASYNC_ERROR
|
14
|
+
|
15
|
+
} natsAsyncCbType;
|
16
|
+
|
17
|
+
struct __natsConnection;
|
18
|
+
struct __natsSubscription;
|
19
|
+
struct __natsAsyncCbInfo;
|
20
|
+
|
21
|
+
typedef struct __natsAsyncCbInfo
|
22
|
+
{
|
23
|
+
natsAsyncCbType type;
|
24
|
+
struct __natsConnection *nc;
|
25
|
+
struct __natsSubscription *sub;
|
26
|
+
natsStatus err;
|
27
|
+
|
28
|
+
struct __natsAsyncCbInfo *next;
|
29
|
+
|
30
|
+
} natsAsyncCbInfo;
|
31
|
+
|
32
|
+
void
|
33
|
+
natsAsyncCb_PostConnHandler(struct __natsConnection *nc, natsAsyncCbType type);
|
34
|
+
|
35
|
+
void
|
36
|
+
natsAsyncCb_PostErrHandler(struct __natsConnection *nc,
|
37
|
+
struct __natsSubscription *sub, natsStatus err);
|
38
|
+
|
39
|
+
void
|
40
|
+
natsAsyncCb_Destroy(natsAsyncCbInfo *info);
|
41
|
+
|
42
|
+
#endif /* ASYNCCB_H_ */
|
@@ -0,0 +1,246 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#include <string.h>
|
4
|
+
#include <assert.h>
|
5
|
+
|
6
|
+
#include "err.h"
|
7
|
+
#include "mem.h"
|
8
|
+
#include "buf.h"
|
9
|
+
|
10
|
+
static natsStatus
|
11
|
+
_init(natsBuffer *newBuf, char *data, int len, int capacity)
|
12
|
+
{
|
13
|
+
natsBuffer *buf = newBuf;
|
14
|
+
|
15
|
+
// Since we explicitly set all fields, no need for memset
|
16
|
+
|
17
|
+
buf->doFree = false;
|
18
|
+
|
19
|
+
if (data != NULL)
|
20
|
+
{
|
21
|
+
buf->data = data;
|
22
|
+
buf->ownData = false;
|
23
|
+
}
|
24
|
+
else
|
25
|
+
{
|
26
|
+
buf->data = (char*) NATS_MALLOC(capacity);
|
27
|
+
if (buf->data == NULL)
|
28
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
29
|
+
|
30
|
+
buf->ownData = true;
|
31
|
+
}
|
32
|
+
|
33
|
+
buf->pos = buf->data + len;
|
34
|
+
buf->len = len;
|
35
|
+
buf->capacity = capacity;
|
36
|
+
|
37
|
+
return NATS_OK;
|
38
|
+
}
|
39
|
+
|
40
|
+
natsStatus
|
41
|
+
natsBuf_InitWithBackend(natsBuffer *newBuf, char *data, int len, int capacity)
|
42
|
+
{
|
43
|
+
if (data == NULL)
|
44
|
+
return NATS_INVALID_ARG;
|
45
|
+
|
46
|
+
return _init(newBuf, data, len, capacity);
|
47
|
+
}
|
48
|
+
|
49
|
+
natsStatus
|
50
|
+
natsBuf_Init(natsBuffer *buf, int capacity)
|
51
|
+
{
|
52
|
+
return _init(buf, NULL, 0, capacity);
|
53
|
+
}
|
54
|
+
|
55
|
+
static natsStatus
|
56
|
+
_newBuf(natsBuffer **newBuf, char *data, int len, int capacity)
|
57
|
+
{
|
58
|
+
natsBuffer *buf;
|
59
|
+
|
60
|
+
buf = (natsBuffer*) NATS_MALLOC(sizeof(natsBuffer));
|
61
|
+
if (buf == NULL)
|
62
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
63
|
+
|
64
|
+
if (_init(buf, data, len, capacity) != NATS_OK)
|
65
|
+
{
|
66
|
+
NATS_FREE(buf);
|
67
|
+
return NATS_UPDATE_ERR_STACK(NATS_NO_MEMORY);
|
68
|
+
}
|
69
|
+
|
70
|
+
buf->doFree = true;
|
71
|
+
|
72
|
+
*newBuf = buf;
|
73
|
+
|
74
|
+
return NATS_OK;
|
75
|
+
}
|
76
|
+
|
77
|
+
natsStatus
|
78
|
+
natsBuf_CreateWithBackend(natsBuffer **newBuf, char *data, int len, int capacity)
|
79
|
+
{
|
80
|
+
natsStatus s;
|
81
|
+
|
82
|
+
if (data == NULL)
|
83
|
+
return nats_setDefaultError(NATS_INVALID_ARG);
|
84
|
+
|
85
|
+
s = _newBuf(newBuf, data, len, capacity);
|
86
|
+
|
87
|
+
return NATS_UPDATE_ERR_STACK(s);
|
88
|
+
}
|
89
|
+
|
90
|
+
natsStatus
|
91
|
+
natsBuf_Create(natsBuffer **newBuf, int capacity)
|
92
|
+
{
|
93
|
+
natsStatus s = _newBuf(newBuf, NULL, 0, capacity);
|
94
|
+
return NATS_UPDATE_ERR_STACK(s);
|
95
|
+
}
|
96
|
+
|
97
|
+
void
|
98
|
+
natsBuf_Reset(natsBuffer *buf)
|
99
|
+
{
|
100
|
+
buf->len = 0;
|
101
|
+
buf->pos = buf->data;
|
102
|
+
}
|
103
|
+
|
104
|
+
void
|
105
|
+
natsBuf_RewindTo(natsBuffer *buf, int newPosition)
|
106
|
+
{
|
107
|
+
assert(newPosition < buf->capacity);
|
108
|
+
|
109
|
+
buf->len = newPosition;
|
110
|
+
buf->pos = buf->data + newPosition;
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
natsStatus
|
115
|
+
natsBuf_Expand(natsBuffer *buf, int newSize)
|
116
|
+
{
|
117
|
+
int offset = (int) (buf->pos - buf->data);
|
118
|
+
char *newData = NULL;
|
119
|
+
|
120
|
+
if (newSize <= buf->capacity)
|
121
|
+
return nats_setDefaultError(NATS_INVALID_ARG);
|
122
|
+
|
123
|
+
if (buf->ownData)
|
124
|
+
{
|
125
|
+
newData = NATS_REALLOC(buf->data, newSize);
|
126
|
+
if (newData == NULL)
|
127
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
128
|
+
}
|
129
|
+
else
|
130
|
+
{
|
131
|
+
newData = NATS_MALLOC(newSize);
|
132
|
+
if (newData == NULL)
|
133
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
134
|
+
|
135
|
+
memcpy(newData, buf->data, buf->len);
|
136
|
+
buf->ownData = true;
|
137
|
+
}
|
138
|
+
|
139
|
+
if (buf->data != newData)
|
140
|
+
{
|
141
|
+
buf->data = newData;
|
142
|
+
buf->pos = (char*) (buf->data + offset);
|
143
|
+
}
|
144
|
+
|
145
|
+
buf->capacity = newSize;
|
146
|
+
|
147
|
+
return NATS_OK;
|
148
|
+
}
|
149
|
+
|
150
|
+
natsStatus
|
151
|
+
natsBuf_Append(natsBuffer *buf, const char* data, int dataLen)
|
152
|
+
{
|
153
|
+
natsStatus s = NATS_OK;
|
154
|
+
int n = buf->len + dataLen;
|
155
|
+
|
156
|
+
// We could use int64_t and check for 0x7FFFFFFF, but keeping
|
157
|
+
// all int is faster.
|
158
|
+
if (n < 0)
|
159
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
160
|
+
|
161
|
+
if (n > buf->capacity)
|
162
|
+
{
|
163
|
+
// Increase by 10%
|
164
|
+
int extra = (int) (n * 0.1);
|
165
|
+
int newSize;
|
166
|
+
|
167
|
+
// Make sure that we have at least some bytes left after adding.
|
168
|
+
newSize = (n + (extra < 64 ? 64 : extra));
|
169
|
+
|
170
|
+
// Overrun.
|
171
|
+
if (newSize < 0)
|
172
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
173
|
+
|
174
|
+
s = natsBuf_Expand(buf, newSize);
|
175
|
+
}
|
176
|
+
|
177
|
+
if (s == NATS_OK)
|
178
|
+
{
|
179
|
+
memcpy(buf->pos, data, dataLen);
|
180
|
+
buf->pos += dataLen;
|
181
|
+
buf->len += dataLen;
|
182
|
+
}
|
183
|
+
|
184
|
+
return NATS_UPDATE_ERR_STACK(s);
|
185
|
+
}
|
186
|
+
|
187
|
+
natsStatus
|
188
|
+
natsBuf_AppendByte(natsBuffer *buf, char b)
|
189
|
+
{
|
190
|
+
natsStatus s = NATS_OK;
|
191
|
+
int c = buf->capacity;
|
192
|
+
|
193
|
+
if (buf->len == c)
|
194
|
+
{
|
195
|
+
// Increase by 10%
|
196
|
+
int extra = (int) (c * 0.1);
|
197
|
+
int newSize;
|
198
|
+
|
199
|
+
// Make sure that we have at least some bytes left after adding.
|
200
|
+
newSize = (c + (extra < 64 ? 64 : extra));
|
201
|
+
|
202
|
+
// Overrun.
|
203
|
+
if (newSize < 0)
|
204
|
+
return nats_setDefaultError(NATS_NO_MEMORY);
|
205
|
+
|
206
|
+
s = natsBuf_Expand(buf, newSize);
|
207
|
+
}
|
208
|
+
|
209
|
+
if (s == NATS_OK)
|
210
|
+
{
|
211
|
+
*(buf->pos++) = b;
|
212
|
+
buf->len++;
|
213
|
+
}
|
214
|
+
|
215
|
+
return NATS_UPDATE_ERR_STACK(s);
|
216
|
+
}
|
217
|
+
|
218
|
+
void
|
219
|
+
natsBuf_Consume(natsBuffer *buf, int n)
|
220
|
+
{
|
221
|
+
int remaining;
|
222
|
+
|
223
|
+
assert(n <= buf->len);
|
224
|
+
|
225
|
+
remaining = buf->len - n;
|
226
|
+
if (remaining > 0)
|
227
|
+
memmove(buf->data, buf->data + n, remaining);
|
228
|
+
|
229
|
+
buf->len = remaining;
|
230
|
+
buf->pos = buf->data + remaining;
|
231
|
+
}
|
232
|
+
|
233
|
+
void
|
234
|
+
natsBuf_Destroy(natsBuffer *buf)
|
235
|
+
{
|
236
|
+
if (buf == NULL)
|
237
|
+
return;
|
238
|
+
|
239
|
+
if (buf->ownData)
|
240
|
+
NATS_FREE(buf->data);
|
241
|
+
|
242
|
+
if (buf->doFree)
|
243
|
+
NATS_FREE(buf);
|
244
|
+
else
|
245
|
+
memset(buf, 0, sizeof(natsBuffer));
|
246
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
// Copyright 2015 Apcera Inc. All rights reserved.
|
2
|
+
|
3
|
+
#ifndef BUF_H_
|
4
|
+
#define BUF_H_
|
5
|
+
|
6
|
+
#include <stdbool.h>
|
7
|
+
|
8
|
+
#include "status.h"
|
9
|
+
|
10
|
+
typedef struct __natsBuffer
|
11
|
+
{
|
12
|
+
char* data;
|
13
|
+
char* pos;
|
14
|
+
int len;
|
15
|
+
int capacity;
|
16
|
+
bool ownData;
|
17
|
+
bool doFree;
|
18
|
+
|
19
|
+
} natsBuffer;
|
20
|
+
|
21
|
+
#define natsBuf_Data(b) ((b)->data)
|
22
|
+
#define natsBuf_Capacity(b) ((b)->capacity)
|
23
|
+
#define natsBuf_Len(b) ((b)->len)
|
24
|
+
#define natsBuf_Available(b) ((b)->capacity - (b)->len)
|
25
|
+
|
26
|
+
|
27
|
+
// Initializes a natsBuffer using 'data' as the back-end byte array.
|
28
|
+
// The length and capacity are set based on the given parameters.
|
29
|
+
// Since the 'data' is not owned, and as long as the buffer does not need
|
30
|
+
// to be expanded, the byte buffer will not be freed when this natsBuffer
|
31
|
+
// is destroyed. Check natsBuf_Expand() for more details.
|
32
|
+
//
|
33
|
+
// One would use this call to initialize a natsBuffer without the added cost
|
34
|
+
// of allocating memory for the natsBuffer structure itself, for instance
|
35
|
+
// initializing an natsBuffer on the stack.
|
36
|
+
natsStatus
|
37
|
+
natsBuf_InitWithBackend(natsBuffer *buf, char *data, int len, int capacity);
|
38
|
+
|
39
|
+
// Initializes a natsBuffer and creates a byte buffer of 'capacity' bytes.
|
40
|
+
// The natsBuffer owns the buffer and will therefore free the memory used
|
41
|
+
// when destroyed.
|
42
|
+
//
|
43
|
+
// One would use this call to initialize a natsBuffer without the added cost
|
44
|
+
// of allocating memory for the natsBuffer structure itself, for instance
|
45
|
+
// initializing an natsBuffer on the stack.
|
46
|
+
natsStatus
|
47
|
+
natsBuf_Init(natsBuffer *buf, int capacity);
|
48
|
+
|
49
|
+
// Creates a new natsBuffer using 'data' as the back-end byte array.
|
50
|
+
// The length and capacity are set based on the given parameters.
|
51
|
+
// Since the 'data' is not owned, and as long as the buffer does not need
|
52
|
+
// to be expanded, the byte buffer will not be freed when this natsBuffer
|
53
|
+
// is destroyed. Check natsBuf_Expand() for more details.
|
54
|
+
natsStatus
|
55
|
+
natsBuf_CreateWithBackend(natsBuffer **newBuf, char *data, int len, int capacity);
|
56
|
+
|
57
|
+
// Creates a new natsBuffer and creates a byte buffer of 'capacity' bytes.
|
58
|
+
// The natsBuffer owns the buffer and will therefore free the memory used
|
59
|
+
// when destroyed.
|
60
|
+
natsStatus
|
61
|
+
natsBuf_Create(natsBuffer **newBuf, int capacity);
|
62
|
+
|
63
|
+
// Resets the length to zero, and the position to the beginning of the buffer.
|
64
|
+
void
|
65
|
+
natsBuf_Reset(natsBuffer *buf);
|
66
|
+
|
67
|
+
// Sets the size of the buffer to 'newPosition' and new data will be appended
|
68
|
+
// starting at this position.
|
69
|
+
void
|
70
|
+
natsBuf_RewindTo(natsBuffer *buf, int newPosition);
|
71
|
+
|
72
|
+
// Expands 'buf' underlying buffer to the given new size 'newSize'.
|
73
|
+
//
|
74
|
+
// If 'buf' did not own the underlying buffer, a new buffer is
|
75
|
+
// created and data copied over. The original data is now detached.
|
76
|
+
// The underlying buffer is now owned by 'buf' and will be freed when
|
77
|
+
// the natsBuffer is destroyed.
|
78
|
+
//
|
79
|
+
// When 'buf' owns the underlying buffer and it is expanded, a memory
|
80
|
+
// reallocation of the buffer occurs to satisfy the new size requirement.
|
81
|
+
//
|
82
|
+
// Note that one should not save the returned value of natsBuf_Data() and
|
83
|
+
// use it after any call to natsBuf_Expand/Append/AppendByte() since
|
84
|
+
// the memory address for the underlying byte buffer may have changed due
|
85
|
+
// to the buffer expansion.
|
86
|
+
natsStatus
|
87
|
+
natsBuf_Expand(natsBuffer *buf, int newSize);
|
88
|
+
|
89
|
+
// Appends 'dataLen' bytes from the 'data' byte array to the buffer,
|
90
|
+
// potentially expanding the buffer.
|
91
|
+
// See natsBuf_Expand for details about natsBuffer not owning the data.
|
92
|
+
natsStatus
|
93
|
+
natsBuf_Append(natsBuffer *buf, const char* data, int dataLen);
|
94
|
+
|
95
|
+
// Appends a byte to the buffer, potentially expanding the buffer.
|
96
|
+
// See natsBuf_Expand for details about natsBuffer not owning the data.
|
97
|
+
natsStatus
|
98
|
+
natsBuf_AppendByte(natsBuffer *buf, char b);
|
99
|
+
|
100
|
+
// Consume data from a buffer, overwriting the 'n' first bytes by the remaining
|
101
|
+
// of data in this buffer.
|
102
|
+
void
|
103
|
+
natsBuf_Consume(natsBuffer *buf, int n);
|
104
|
+
|
105
|
+
// Reads better when dealing with a buffer that was initialized as opposed to
|
106
|
+
// created, but calling natsBuf_Destroy() will do the right thing regardless
|
107
|
+
// of how the buffer was created.
|
108
|
+
#define natsBuf_Cleanup(b) natsBuf_Destroy((b))
|
109
|
+
|
110
|
+
// Frees the data if owned (otherwise leaves it untouched) and the structure
|
111
|
+
// if the buffer was created with one of the natsBuf_CreateX() function,
|
112
|
+
// otherwise simply 'memset' the structure.
|
113
|
+
void
|
114
|
+
natsBuf_Destroy(natsBuffer *buf);
|
115
|
+
|
116
|
+
#endif /* BUF_H_ */
|