hiredis 0.5.2 → 0.6.3

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.
data/vendor/hiredis/sds.h CHANGED
@@ -1,6 +1,8 @@
1
- /* SDSLib, A C dynamic strings library
1
+ /* SDSLib 2.0 -- A C dynamic strings library
2
2
  *
3
- * Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
3
+ * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot com>
4
+ * Copyright (c) 2015, Oran Agra
5
+ * Copyright (c) 2015, Redis Labs, Inc
4
6
  * All rights reserved.
5
7
  *
6
8
  * Redistribution and use in source and binary forms, with or without
@@ -31,39 +33,198 @@
31
33
  #ifndef __SDS_H
32
34
  #define __SDS_H
33
35
 
36
+ #define SDS_MAX_PREALLOC (1024*1024)
37
+
34
38
  #include <sys/types.h>
35
39
  #include <stdarg.h>
40
+ #include <stdint.h>
36
41
 
37
42
  typedef char *sds;
38
43
 
39
- struct sdshdr {
40
- int len;
41
- int free;
44
+ /* Note: sdshdr5 is never used, we just access the flags byte directly.
45
+ * However is here to document the layout of type 5 SDS strings. */
46
+ struct __attribute__ ((__packed__)) sdshdr5 {
47
+ unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
48
+ char buf[];
49
+ };
50
+ struct __attribute__ ((__packed__)) sdshdr8 {
51
+ uint8_t len; /* used */
52
+ uint8_t alloc; /* excluding the header and null terminator */
53
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
54
+ char buf[];
55
+ };
56
+ struct __attribute__ ((__packed__)) sdshdr16 {
57
+ uint16_t len; /* used */
58
+ uint16_t alloc; /* excluding the header and null terminator */
59
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
60
+ char buf[];
61
+ };
62
+ struct __attribute__ ((__packed__)) sdshdr32 {
63
+ uint32_t len; /* used */
64
+ uint32_t alloc; /* excluding the header and null terminator */
65
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
66
+ char buf[];
67
+ };
68
+ struct __attribute__ ((__packed__)) sdshdr64 {
69
+ uint64_t len; /* used */
70
+ uint64_t alloc; /* excluding the header and null terminator */
71
+ unsigned char flags; /* 3 lsb of type, 5 unused bits */
42
72
  char buf[];
43
73
  };
44
74
 
75
+ #define SDS_TYPE_5 0
76
+ #define SDS_TYPE_8 1
77
+ #define SDS_TYPE_16 2
78
+ #define SDS_TYPE_32 3
79
+ #define SDS_TYPE_64 4
80
+ #define SDS_TYPE_MASK 7
81
+ #define SDS_TYPE_BITS 3
82
+ #define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)));
83
+ #define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
84
+ #define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS)
85
+
45
86
  static inline size_t sdslen(const sds s) {
46
- struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
47
- return sh->len;
87
+ unsigned char flags = s[-1];
88
+ switch(flags&SDS_TYPE_MASK) {
89
+ case SDS_TYPE_5:
90
+ return SDS_TYPE_5_LEN(flags);
91
+ case SDS_TYPE_8:
92
+ return SDS_HDR(8,s)->len;
93
+ case SDS_TYPE_16:
94
+ return SDS_HDR(16,s)->len;
95
+ case SDS_TYPE_32:
96
+ return SDS_HDR(32,s)->len;
97
+ case SDS_TYPE_64:
98
+ return SDS_HDR(64,s)->len;
99
+ }
100
+ return 0;
48
101
  }
49
102
 
50
103
  static inline size_t sdsavail(const sds s) {
51
- struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
52
- return sh->free;
104
+ unsigned char flags = s[-1];
105
+ switch(flags&SDS_TYPE_MASK) {
106
+ case SDS_TYPE_5: {
107
+ return 0;
108
+ }
109
+ case SDS_TYPE_8: {
110
+ SDS_HDR_VAR(8,s);
111
+ return sh->alloc - sh->len;
112
+ }
113
+ case SDS_TYPE_16: {
114
+ SDS_HDR_VAR(16,s);
115
+ return sh->alloc - sh->len;
116
+ }
117
+ case SDS_TYPE_32: {
118
+ SDS_HDR_VAR(32,s);
119
+ return sh->alloc - sh->len;
120
+ }
121
+ case SDS_TYPE_64: {
122
+ SDS_HDR_VAR(64,s);
123
+ return sh->alloc - sh->len;
124
+ }
125
+ }
126
+ return 0;
127
+ }
128
+
129
+ static inline void sdssetlen(sds s, size_t newlen) {
130
+ unsigned char flags = s[-1];
131
+ switch(flags&SDS_TYPE_MASK) {
132
+ case SDS_TYPE_5:
133
+ {
134
+ unsigned char *fp = ((unsigned char*)s)-1;
135
+ *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
136
+ }
137
+ break;
138
+ case SDS_TYPE_8:
139
+ SDS_HDR(8,s)->len = newlen;
140
+ break;
141
+ case SDS_TYPE_16:
142
+ SDS_HDR(16,s)->len = newlen;
143
+ break;
144
+ case SDS_TYPE_32:
145
+ SDS_HDR(32,s)->len = newlen;
146
+ break;
147
+ case SDS_TYPE_64:
148
+ SDS_HDR(64,s)->len = newlen;
149
+ break;
150
+ }
151
+ }
152
+
153
+ static inline void sdsinclen(sds s, size_t inc) {
154
+ unsigned char flags = s[-1];
155
+ switch(flags&SDS_TYPE_MASK) {
156
+ case SDS_TYPE_5:
157
+ {
158
+ unsigned char *fp = ((unsigned char*)s)-1;
159
+ unsigned char newlen = SDS_TYPE_5_LEN(flags)+inc;
160
+ *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);
161
+ }
162
+ break;
163
+ case SDS_TYPE_8:
164
+ SDS_HDR(8,s)->len += inc;
165
+ break;
166
+ case SDS_TYPE_16:
167
+ SDS_HDR(16,s)->len += inc;
168
+ break;
169
+ case SDS_TYPE_32:
170
+ SDS_HDR(32,s)->len += inc;
171
+ break;
172
+ case SDS_TYPE_64:
173
+ SDS_HDR(64,s)->len += inc;
174
+ break;
175
+ }
176
+ }
177
+
178
+ /* sdsalloc() = sdsavail() + sdslen() */
179
+ static inline size_t sdsalloc(const sds s) {
180
+ unsigned char flags = s[-1];
181
+ switch(flags&SDS_TYPE_MASK) {
182
+ case SDS_TYPE_5:
183
+ return SDS_TYPE_5_LEN(flags);
184
+ case SDS_TYPE_8:
185
+ return SDS_HDR(8,s)->alloc;
186
+ case SDS_TYPE_16:
187
+ return SDS_HDR(16,s)->alloc;
188
+ case SDS_TYPE_32:
189
+ return SDS_HDR(32,s)->alloc;
190
+ case SDS_TYPE_64:
191
+ return SDS_HDR(64,s)->alloc;
192
+ }
193
+ return 0;
194
+ }
195
+
196
+ static inline void sdssetalloc(sds s, size_t newlen) {
197
+ unsigned char flags = s[-1];
198
+ switch(flags&SDS_TYPE_MASK) {
199
+ case SDS_TYPE_5:
200
+ /* Nothing to do, this type has no total allocation info. */
201
+ break;
202
+ case SDS_TYPE_8:
203
+ SDS_HDR(8,s)->alloc = newlen;
204
+ break;
205
+ case SDS_TYPE_16:
206
+ SDS_HDR(16,s)->alloc = newlen;
207
+ break;
208
+ case SDS_TYPE_32:
209
+ SDS_HDR(32,s)->alloc = newlen;
210
+ break;
211
+ case SDS_TYPE_64:
212
+ SDS_HDR(64,s)->alloc = newlen;
213
+ break;
214
+ }
53
215
  }
54
216
 
55
217
  sds sdsnewlen(const void *init, size_t initlen);
56
218
  sds sdsnew(const char *init);
57
219
  sds sdsempty(void);
58
- size_t sdslen(const sds s);
59
220
  sds sdsdup(const sds s);
60
221
  void sdsfree(sds s);
61
- size_t sdsavail(sds s);
62
222
  sds sdsgrowzero(sds s, size_t len);
63
223
  sds sdscatlen(sds s, const void *t, size_t len);
64
224
  sds sdscat(sds s, const char *t);
65
- sds sdscpylen(sds s, char *t, size_t len);
66
- sds sdscpy(sds s, char *t);
225
+ sds sdscatsds(sds s, const sds t);
226
+ sds sdscpylen(sds s, const char *t, size_t len);
227
+ sds sdscpy(sds s, const char *t);
67
228
 
68
229
  sds sdscatvprintf(sds s, const char *fmt, va_list ap);
69
230
  #ifdef __GNUC__
@@ -73,16 +234,40 @@ sds sdscatprintf(sds s, const char *fmt, ...)
73
234
  sds sdscatprintf(sds s, const char *fmt, ...);
74
235
  #endif
75
236
 
237
+ sds sdscatfmt(sds s, char const *fmt, ...);
76
238
  sds sdstrim(sds s, const char *cset);
77
- sds sdsrange(sds s, int start, int end);
239
+ void sdsrange(sds s, int start, int end);
78
240
  void sdsupdatelen(sds s);
79
- int sdscmp(sds s1, sds s2);
80
- sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count);
241
+ void sdsclear(sds s);
242
+ int sdscmp(const sds s1, const sds s2);
243
+ sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
81
244
  void sdsfreesplitres(sds *tokens, int count);
82
245
  void sdstolower(sds s);
83
246
  void sdstoupper(sds s);
84
247
  sds sdsfromlonglong(long long value);
85
- sds sdscatrepr(sds s, char *p, size_t len);
86
- sds *sdssplitargs(char *line, int *argc);
248
+ sds sdscatrepr(sds s, const char *p, size_t len);
249
+ sds *sdssplitargs(const char *line, int *argc);
250
+ sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
251
+ sds sdsjoin(char **argv, int argc, char *sep);
252
+ sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen);
253
+
254
+ /* Low level functions exposed to the user API */
255
+ sds sdsMakeRoomFor(sds s, size_t addlen);
256
+ void sdsIncrLen(sds s, int incr);
257
+ sds sdsRemoveFreeSpace(sds s);
258
+ size_t sdsAllocSize(sds s);
259
+ void *sdsAllocPtr(sds s);
260
+
261
+ /* Export the allocator used by SDS to the program using SDS.
262
+ * Sometimes the program SDS is linked to, may use a different set of
263
+ * allocators, but may want to allocate or free things that SDS will
264
+ * respectively free or allocate. */
265
+ void *sds_malloc(size_t size);
266
+ void *sds_realloc(void *ptr, size_t size);
267
+ void sds_free(void *ptr);
268
+
269
+ #ifdef REDIS_TEST
270
+ int sdsTest(int argc, char *argv[]);
271
+ #endif
87
272
 
88
273
  #endif
@@ -0,0 +1,42 @@
1
+ /* SDSLib 2.0 -- A C dynamic strings library
2
+ *
3
+ * Copyright (c) 2006-2015, Salvatore Sanfilippo <antirez at gmail dot com>
4
+ * Copyright (c) 2015, Oran Agra
5
+ * Copyright (c) 2015, Redis Labs, Inc
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * * Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ * * Neither the name of Redis nor the names of its contributors may be used
17
+ * to endorse or promote products derived from this software without
18
+ * specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ * POSSIBILITY OF SUCH DAMAGE.
31
+ */
32
+
33
+ /* SDS allocator selection.
34
+ *
35
+ * This file is used in order to change the SDS allocator at compile time.
36
+ * Just define the following defines to what you want to use. Also add
37
+ * the include of your alternate allocator if needed (not needed in order
38
+ * to use the default libc allocator). */
39
+
40
+ #define s_malloc malloc
41
+ #define s_realloc realloc
42
+ #define s_free free