libcouchbase 0.3.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/libcouchbase/CMakeLists.txt +6 -8
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
- data/ext/libcouchbase/cmake/defs.mk.in +0 -2
- data/ext/libcouchbase/cmake/source_files.cmake +21 -5
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
- data/ext/libcouchbase/example/users/README +48 -0
- data/ext/libcouchbase/example/users/users.c +147 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
- data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
- data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
- data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
- data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
- data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
- data/ext/libcouchbase/src/README.md +0 -2
- data/ext/libcouchbase/src/auth-priv.h +23 -4
- data/ext/libcouchbase/src/auth.cc +51 -43
- data/ext/libcouchbase/src/bootstrap.cc +244 -0
- data/ext/libcouchbase/src/bootstrap.h +58 -38
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
- data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
- data/ext/libcouchbase/src/cbft.cc +22 -27
- data/ext/libcouchbase/src/cntl.cc +56 -22
- data/ext/libcouchbase/src/connspec.cc +47 -6
- data/ext/libcouchbase/src/connspec.h +27 -0
- data/ext/libcouchbase/src/dns-srv.cc +147 -0
- data/ext/libcouchbase/src/dump.cc +3 -3
- data/ext/libcouchbase/src/errmap.cc +173 -0
- data/ext/libcouchbase/src/errmap.h +198 -0
- data/ext/libcouchbase/src/getconfig.cc +7 -33
- data/ext/libcouchbase/src/handler.cc +118 -7
- data/ext/libcouchbase/src/hostlist.cc +0 -36
- data/ext/libcouchbase/src/hostlist.h +44 -62
- data/ext/libcouchbase/src/http/http-priv.h +125 -112
- data/ext/libcouchbase/src/http/http.cc +27 -35
- data/ext/libcouchbase/src/http/http.h +1 -34
- data/ext/libcouchbase/src/http/http_io.cc +28 -36
- data/ext/libcouchbase/src/instance.cc +131 -34
- data/ext/libcouchbase/src/internal.h +58 -26
- data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
- data/ext/libcouchbase/src/jsparse/parser.h +84 -98
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
- data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
- data/ext/libcouchbase/src/lcbio/connect.h +16 -7
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
- data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
- data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
- data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
- data/ext/libcouchbase/src/lcbio/manager.h +133 -96
- data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/mc/mcreq.c +11 -2
- data/ext/libcouchbase/src/mc/mcreq.h +9 -2
- data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
- data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
- data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
- data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
- data/ext/libcouchbase/src/mctx-helper.h +51 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
- data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
- data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
- data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +6 -26
- data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
- data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
- data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
- data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
- data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +3 -8
- data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
- data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
- data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
- data/ext/libcouchbase/src/packetutils.h +30 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/rdb/rope.c +1 -1
- data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
- data/ext/libcouchbase/src/retryq.cc +52 -14
- data/ext/libcouchbase/src/retryq.h +3 -3
- data/ext/libcouchbase/src/settings.c +5 -0
- data/ext/libcouchbase/src/settings.h +11 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
- data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
- data/ext/libcouchbase/src/views/docreq.h +24 -30
- data/ext/libcouchbase/src/views/viewreq.cc +318 -0
- data/ext/libcouchbase/src/views/viewreq.h +43 -13
- data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
- data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
- data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
- data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
- data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
- data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
- data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
- data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
- data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
- data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
- data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
- data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
- data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
- data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
- data/ext/libcouchbase/tools/cbc.cc +143 -10
- data/ext/libcouchbase/tools/docgen/loc.h +1 -1
- data/lib/libcouchbase/connection.rb +4 -3
- data/lib/libcouchbase/version.rb +1 -1
- metadata +37 -28
- data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
- data/ext/libcouchbase/src/bootstrap.c +0 -269
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
- data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
- data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
- data/ext/libcouchbase/src/lcbio/connect.c +0 -557
- data/ext/libcouchbase/src/lcbio/manager.c +0 -584
- data/ext/libcouchbase/src/packetutils.c +0 -37
- data/ext/libcouchbase/src/simplestring.c +0 -211
- data/ext/libcouchbase/src/simplestring.h +0 -228
- data/ext/libcouchbase/src/ssobuf.h +0 -82
- data/ext/libcouchbase/src/views/viewreq.c +0 -358
- data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -1,37 +0,0 @@
|
|
1
|
-
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
-
/*
|
3
|
-
* Copyright 2014 Couchbase, Inc.
|
4
|
-
*
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
* you may not use this file except in compliance with the License.
|
7
|
-
* You may obtain a copy of the License at
|
8
|
-
*
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
*
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
* See the License for the specific language governing permissions and
|
15
|
-
* limitations under the License.
|
16
|
-
*/
|
17
|
-
|
18
|
-
#include "packetutils.h"
|
19
|
-
#include "rdb/rope.h"
|
20
|
-
|
21
|
-
#ifndef _WIN32 /* for win32 this is inside winsock, included in sysdefs.h */
|
22
|
-
#include <arpa/inet.h>
|
23
|
-
#endif
|
24
|
-
|
25
|
-
int
|
26
|
-
lcb_pktinfo_ior_get(packet_info *info, rdb_IOROPE *ior, unsigned *required)
|
27
|
-
{
|
28
|
-
}
|
29
|
-
|
30
|
-
void
|
31
|
-
lcb_pktinfo_ior_done(packet_info *info, rdb_IOROPE *ior)
|
32
|
-
{
|
33
|
-
if (!PACKET_NBODY(info)) {
|
34
|
-
return;
|
35
|
-
}
|
36
|
-
rdb_consumed(ior, PACKET_NBODY(info));
|
37
|
-
}
|
@@ -1,211 +0,0 @@
|
|
1
|
-
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
-
/*
|
3
|
-
* Copyright 2014 Couchbase, Inc.
|
4
|
-
*
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
* you may not use this file except in compliance with the License.
|
7
|
-
* You may obtain a copy of the License at
|
8
|
-
*
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
*
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
* See the License for the specific language governing permissions and
|
15
|
-
* limitations under the License.
|
16
|
-
*/
|
17
|
-
|
18
|
-
#include "simplestring.h"
|
19
|
-
#include "assert.h"
|
20
|
-
|
21
|
-
static void ensure_cstr(lcb_string *str);
|
22
|
-
|
23
|
-
int lcb_string_init(lcb_string *str)
|
24
|
-
{
|
25
|
-
str->base = NULL;
|
26
|
-
str->nalloc = 0;
|
27
|
-
str->nused = 0;
|
28
|
-
return 0;
|
29
|
-
}
|
30
|
-
|
31
|
-
void lcb_string_release(lcb_string *str)
|
32
|
-
{
|
33
|
-
if (str->base == NULL) {
|
34
|
-
return;
|
35
|
-
}
|
36
|
-
free(str->base);
|
37
|
-
memset(str, 0, sizeof(*str));
|
38
|
-
}
|
39
|
-
|
40
|
-
void lcb_string_clear(lcb_string *str)
|
41
|
-
{
|
42
|
-
str->nused = 0;
|
43
|
-
if (str->nalloc) {
|
44
|
-
ensure_cstr(str);
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
void lcb_string_added(lcb_string *str, lcb_size_t nused)
|
49
|
-
{
|
50
|
-
str->nused += nused;
|
51
|
-
lcb_assert(str->nused <= str->nalloc);
|
52
|
-
ensure_cstr(str);
|
53
|
-
}
|
54
|
-
|
55
|
-
int lcb_string_reserve(lcb_string *str, lcb_size_t size)
|
56
|
-
{
|
57
|
-
lcb_size_t newalloc;
|
58
|
-
char *newbuf;
|
59
|
-
|
60
|
-
/** Set size to one greater, for the terminating NUL */
|
61
|
-
size++;
|
62
|
-
if (!size) {
|
63
|
-
return -1;
|
64
|
-
}
|
65
|
-
|
66
|
-
if (str->nalloc - str->nused >= size) {
|
67
|
-
return 0;
|
68
|
-
}
|
69
|
-
|
70
|
-
newalloc = str->nalloc;
|
71
|
-
if (!newalloc) {
|
72
|
-
newalloc = 1;
|
73
|
-
}
|
74
|
-
|
75
|
-
while (newalloc - str->nused < size) {
|
76
|
-
if (newalloc * 2 < newalloc) {
|
77
|
-
return -1;
|
78
|
-
}
|
79
|
-
|
80
|
-
newalloc *= 2;
|
81
|
-
}
|
82
|
-
|
83
|
-
newbuf = realloc(str->base, newalloc);
|
84
|
-
if (newbuf == NULL) {
|
85
|
-
return -1;
|
86
|
-
}
|
87
|
-
|
88
|
-
str->base = newbuf;
|
89
|
-
str->nalloc = newalloc;
|
90
|
-
return 0;
|
91
|
-
}
|
92
|
-
|
93
|
-
static void ensure_cstr(lcb_string *str)
|
94
|
-
{
|
95
|
-
str->base[str->nused] = '\0';
|
96
|
-
}
|
97
|
-
|
98
|
-
int lcb_string_append(lcb_string *str, const void *data, lcb_size_t size)
|
99
|
-
{
|
100
|
-
if (lcb_string_reserve(str, size)) {
|
101
|
-
return -1;
|
102
|
-
}
|
103
|
-
|
104
|
-
memcpy(str->base + str->nused, data, size);
|
105
|
-
str->nused += size;
|
106
|
-
ensure_cstr(str);
|
107
|
-
return 0;
|
108
|
-
}
|
109
|
-
|
110
|
-
int lcb_string_appendz(lcb_string *str, const char *s)
|
111
|
-
{
|
112
|
-
return lcb_string_append(str, s, strlen(s));
|
113
|
-
}
|
114
|
-
|
115
|
-
int lcb_string_appendv(lcb_string *str, ...)
|
116
|
-
{
|
117
|
-
va_list ap;
|
118
|
-
va_start(ap, str);
|
119
|
-
|
120
|
-
while (1) {
|
121
|
-
size_t len;
|
122
|
-
int rc;
|
123
|
-
const char *ptr;
|
124
|
-
|
125
|
-
if ((ptr = va_arg(ap, const char *)) == NULL) {
|
126
|
-
return 0;
|
127
|
-
}
|
128
|
-
|
129
|
-
len = va_arg(ap, size_t);
|
130
|
-
if (len == (size_t)-1) {
|
131
|
-
len = strlen(ptr);
|
132
|
-
}
|
133
|
-
|
134
|
-
rc = lcb_string_append(str, ptr, len);
|
135
|
-
if (rc != 0) {
|
136
|
-
return -1;
|
137
|
-
}
|
138
|
-
}
|
139
|
-
return 0;
|
140
|
-
}
|
141
|
-
|
142
|
-
int lcb_string_rbappend(lcb_string *str, ringbuffer_t *rb, int rbadvance)
|
143
|
-
{
|
144
|
-
lcb_size_t expected, nw;
|
145
|
-
expected = rb->nbytes;
|
146
|
-
if (!expected) {
|
147
|
-
return 0;
|
148
|
-
}
|
149
|
-
|
150
|
-
if (lcb_string_reserve(str, expected)) {
|
151
|
-
return -1;
|
152
|
-
}
|
153
|
-
|
154
|
-
nw = ringbuffer_peek(rb, lcb_string_tail(str), expected);
|
155
|
-
if (nw != expected) {
|
156
|
-
return -1;
|
157
|
-
}
|
158
|
-
|
159
|
-
if (rbadvance) {
|
160
|
-
ringbuffer_consumed(rb, nw);
|
161
|
-
}
|
162
|
-
|
163
|
-
lcb_string_added(str, nw);
|
164
|
-
return 0;
|
165
|
-
}
|
166
|
-
|
167
|
-
void lcb_string_erase_end(lcb_string *str, lcb_size_t to_remove)
|
168
|
-
{
|
169
|
-
lcb_assert(to_remove <= str->nused);
|
170
|
-
str->nused -= to_remove;
|
171
|
-
ensure_cstr(str);
|
172
|
-
}
|
173
|
-
|
174
|
-
void lcb_string_erase_beginning(lcb_string *str, lcb_size_t to_remove)
|
175
|
-
{
|
176
|
-
lcb_assert(to_remove <= str->nused);
|
177
|
-
if (!to_remove) {
|
178
|
-
str->nused = 0;
|
179
|
-
return;
|
180
|
-
}
|
181
|
-
|
182
|
-
memmove(str->base, str->base + to_remove, str->nused - to_remove);
|
183
|
-
str->nused -= to_remove;
|
184
|
-
ensure_cstr(str);
|
185
|
-
}
|
186
|
-
|
187
|
-
int lcb_string_insert(lcb_string *str, size_t at, const char *src, size_t nsrc)
|
188
|
-
{
|
189
|
-
if (!nsrc) {
|
190
|
-
return 0;
|
191
|
-
}
|
192
|
-
if (at == str->nused) {
|
193
|
-
return lcb_string_append(str, src, nsrc);
|
194
|
-
}
|
195
|
-
|
196
|
-
if (lcb_string_reserve(str, nsrc) != 0) {
|
197
|
-
return -1;
|
198
|
-
}
|
199
|
-
memmove(str->base + at + nsrc, str->base + at, str->nused - at);
|
200
|
-
memcpy(str->base + at, src, nsrc);
|
201
|
-
str->nused += nsrc;
|
202
|
-
ensure_cstr(str);
|
203
|
-
return 0;
|
204
|
-
}
|
205
|
-
|
206
|
-
void lcb_string_transfer(lcb_string *from, lcb_string *to)
|
207
|
-
{
|
208
|
-
lcb_assert(to->base == NULL);
|
209
|
-
*to = *from;
|
210
|
-
memset(from, 0, sizeof(*from));
|
211
|
-
}
|
@@ -1,228 +0,0 @@
|
|
1
|
-
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
2
|
-
/*
|
3
|
-
* Copyright 2013 Couchbase, Inc.
|
4
|
-
*
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
* you may not use this file except in compliance with the License.
|
7
|
-
* You may obtain a copy of the License at
|
8
|
-
*
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
*
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
* See the License for the specific language governing permissions and
|
15
|
-
* limitations under the License.
|
16
|
-
*/
|
17
|
-
|
18
|
-
#ifndef LCB_STRING_H
|
19
|
-
#define LCB_STRING_H
|
20
|
-
|
21
|
-
#include <libcouchbase/couchbase.h>
|
22
|
-
#include <stdarg.h>
|
23
|
-
|
24
|
-
#include "config.h"
|
25
|
-
#include "assert.h"
|
26
|
-
#include "ringbuffer.h"
|
27
|
-
|
28
|
-
/**
|
29
|
-
* Simple string type.
|
30
|
-
*
|
31
|
-
* This structure is designed mainly for ease of use when dealing with actual
|
32
|
-
* "string" data - i.e. data which must be null-terminated and contiguous.
|
33
|
-
*
|
34
|
-
* This won't replace the ringbuffer structure as this string's removal and
|
35
|
-
* copying operations are comparatively expensive.
|
36
|
-
*
|
37
|
-
* Note that all API functions which update the position of the buffer ALSO
|
38
|
-
* add a trailing NUL byte at the end.
|
39
|
-
*/
|
40
|
-
typedef struct lcb_string_st {
|
41
|
-
/** Buffer that's allocated */
|
42
|
-
char *base;
|
43
|
-
|
44
|
-
/** Number of bytes allocated */
|
45
|
-
lcb_size_t nalloc;
|
46
|
-
|
47
|
-
/** Number of bytes used */
|
48
|
-
lcb_size_t nused;
|
49
|
-
#ifdef __cplusplus
|
50
|
-
typedef char *iterator;
|
51
|
-
typedef const char *const_iterator;
|
52
|
-
|
53
|
-
iterator begin() { return base; };
|
54
|
-
iterator end() { return base + nused; }
|
55
|
-
const_iterator begin() const { return base; }
|
56
|
-
const_iterator end() const { return base + nused; }
|
57
|
-
size_t size() const { return nused; }
|
58
|
-
size_t capacity() const { return nalloc; }
|
59
|
-
const char *c_str() const { return base; }
|
60
|
-
|
61
|
-
inline void insert(iterator p, const char *first, const char *last);
|
62
|
-
#endif
|
63
|
-
} lcb_string;
|
64
|
-
|
65
|
-
#ifdef __cplusplus
|
66
|
-
extern "C" {
|
67
|
-
#endif
|
68
|
-
|
69
|
-
int lcb_string_init(lcb_string *str);
|
70
|
-
|
71
|
-
/**
|
72
|
-
* Free any storage associated with the string. The string's state will be
|
73
|
-
* empty as if string_init() had just been called.
|
74
|
-
*/
|
75
|
-
void lcb_string_release(lcb_string *str);
|
76
|
-
|
77
|
-
/**
|
78
|
-
* Clear the contents of the string, but don't free the underlying buffer
|
79
|
-
*/
|
80
|
-
void lcb_string_clear(lcb_string *str);
|
81
|
-
|
82
|
-
|
83
|
-
/**
|
84
|
-
* Indicate that bytes have been added to the string. This is used in conjunction
|
85
|
-
* with reserve(). As such, the number of bytes added should not exceed the
|
86
|
-
* number of bytes passed to reserver.
|
87
|
-
*
|
88
|
-
* @param str the string
|
89
|
-
* @param nbytes the number of bytes added
|
90
|
-
*/
|
91
|
-
void lcb_string_added(lcb_string *str, lcb_size_t nbytes);
|
92
|
-
|
93
|
-
/**
|
94
|
-
* Reserve an amount of free bytes within the string. When this is done,
|
95
|
-
* up to @c size bytes may be added to the string starting at @c base+str->nbytes
|
96
|
-
*/
|
97
|
-
int lcb_string_reserve(lcb_string *str, lcb_size_t size);
|
98
|
-
|
99
|
-
|
100
|
-
/**
|
101
|
-
* Adds data to the string.
|
102
|
-
* @param str the string to append to
|
103
|
-
* @param data the data to copy
|
104
|
-
* @param size the size of data to copy
|
105
|
-
*/
|
106
|
-
int lcb_string_append(lcb_string *str, const void *data, lcb_size_t size);
|
107
|
-
|
108
|
-
/**
|
109
|
-
* Adds a C-style string
|
110
|
-
* @param str the target lcb_string
|
111
|
-
* @param zstr a NUL-terminated string to add
|
112
|
-
*/
|
113
|
-
int lcb_string_appendz(lcb_string *str, const char *zstr);
|
114
|
-
|
115
|
-
|
116
|
-
/**
|
117
|
-
* Appends a list of pointer-length pairs. Useful if you need to concatenate
|
118
|
-
* many small buffers
|
119
|
-
* @param str The string to append to. This should be followed by a list of
|
120
|
-
* `pointer, size` arguments (where `size` is `size_t`). If the length is
|
121
|
-
* `-1` then `strlen(pointer)` will be called to determine the length.
|
122
|
-
*
|
123
|
-
* A terminal `NULL` should be placed at the end of the argument list
|
124
|
-
*
|
125
|
-
* @return 0 if appended, nonzero on memory error
|
126
|
-
*/
|
127
|
-
int lcb_string_appendv(lcb_string *str, ...);
|
128
|
-
|
129
|
-
/**
|
130
|
-
* Adds a string from a ringbuffer structure. This copies the contents
|
131
|
-
* of the ringbuffer into a string.
|
132
|
-
* @param str the target string
|
133
|
-
* @param rb the source ringbuffer
|
134
|
-
* @param rbadvance whether to advance the ringbuffer's read head
|
135
|
-
*/
|
136
|
-
int lcb_string_rbappend(lcb_string *str, ringbuffer_t *rb, int rbadvance);
|
137
|
-
|
138
|
-
/**
|
139
|
-
* Removes bytes from the end of the string. The resultant string will be
|
140
|
-
* NUL-terminated
|
141
|
-
* @param str the string to operate on
|
142
|
-
* @param to_remove the number of bytes to trim from the end
|
143
|
-
*/
|
144
|
-
void lcb_string_erase_end(lcb_string *str, lcb_size_t to_remove);
|
145
|
-
|
146
|
-
|
147
|
-
/**
|
148
|
-
* Removes bytes from the beginning of the string. The resultant string will
|
149
|
-
* be NUL-terminated.
|
150
|
-
* @param str the string to operate on
|
151
|
-
* @param to_remove the number of bytes to remove from the beginning of
|
152
|
-
* the string.
|
153
|
-
*/
|
154
|
-
void lcb_string_erase_beginning(lcb_string *str, lcb_size_t to_remove);
|
155
|
-
|
156
|
-
/**
|
157
|
-
* Transfers ownership of the underlying buffer contained within the structure
|
158
|
-
* 'to' to the structure 'from', as such, 'from' becomes a newly initialized
|
159
|
-
* empty string structure and 'to' contains the existing buffer.
|
160
|
-
*
|
161
|
-
* @param from the string which contains the existing buffer
|
162
|
-
* @param to a new string structure which contains no buffer. It will receive
|
163
|
-
* from's buffer
|
164
|
-
*/
|
165
|
-
void lcb_string_transfer(lcb_string *from, lcb_string *to);
|
166
|
-
|
167
|
-
/**
|
168
|
-
* Inserts a string at a given position
|
169
|
-
* @param str the string object
|
170
|
-
* @param at position at which to insert
|
171
|
-
* @param src the string to insert
|
172
|
-
* @param len length of string to insert
|
173
|
-
*/
|
174
|
-
int lcb_string_insert(lcb_string *str, size_t at, const char *src, size_t len);
|
175
|
-
|
176
|
-
#define lcb_string_tail(str) ((str)->base + (str)->nused)
|
177
|
-
|
178
|
-
#ifdef __cplusplus
|
179
|
-
}
|
180
|
-
|
181
|
-
#include <stdexcept>
|
182
|
-
#include <new>
|
183
|
-
void
|
184
|
-
lcb_string_st::insert(iterator p, const char *first, const char *last) {
|
185
|
-
size_t at = p - base;
|
186
|
-
size_t n = last - first;
|
187
|
-
if (lcb_string_insert(this, at, first, n) != 0) {
|
188
|
-
throw std::bad_alloc();
|
189
|
-
}
|
190
|
-
}
|
191
|
-
|
192
|
-
namespace lcb {
|
193
|
-
class AutoString : public lcb_string_st {
|
194
|
-
public:
|
195
|
-
AutoString() {
|
196
|
-
lcb_string_init(this);
|
197
|
-
}
|
198
|
-
~AutoString() {
|
199
|
-
lcb_string_release(this);
|
200
|
-
}
|
201
|
-
|
202
|
-
char *take(size_t& len, size_t& cap) {
|
203
|
-
char *ret = base;
|
204
|
-
len = nused;
|
205
|
-
cap = nalloc;
|
206
|
-
|
207
|
-
base = NULL;
|
208
|
-
nalloc = 0;
|
209
|
-
nused = 0;
|
210
|
-
return ret;
|
211
|
-
}
|
212
|
-
char *take(size_t& len) {
|
213
|
-
size_t dummy;
|
214
|
-
return take(len, dummy);
|
215
|
-
}
|
216
|
-
char *take() {
|
217
|
-
size_t dummy;
|
218
|
-
return take(dummy, dummy);
|
219
|
-
}
|
220
|
-
|
221
|
-
private:
|
222
|
-
AutoString(lcb_string_st&);
|
223
|
-
AutoString(const lcb_string_st&);
|
224
|
-
};
|
225
|
-
}
|
226
|
-
|
227
|
-
#endif /** __cplusplus */
|
228
|
-
#endif /* LCB_STRING_H */
|