1 /* SDSLib, A C dynamic strings library 2 * 3 * Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * * Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * * Neither the name of Redis nor the names of its contributors may be used 15 * to endorse or promote products derived from this software without 16 * specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef __SDS_H 32 #define __SDS_H 33 34 #define SDS_MAX_PREALLOC (1024*1024) 35 36 #include <sys/types.h> 37 #include <stdarg.h> 38 39 typedef char *sds; 40 41 struct sdshdr { 42 unsigned int len; 43 unsigned int free; 44 char buf[]; 45 }; 46 47 static inline size_t sdslen(const sds s) { 48 struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr))); 49 return sh->len; 50 } 51 52 static inline size_t sdsavail(const sds s) { 53 struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr))); 54 return sh->free; 55 } 56 57 sds sdsnewlen(const void *init, size_t initlen); 58 sds sdsnew(const char *init); 59 sds sdsempty(void); 60 size_t sdslen(const sds s); 61 sds sdsdup(const sds s); 62 void sdsfree(sds s); 63 size_t sdsavail(const sds s); 64 sds sdsgrowzero(sds s, size_t len); 65 sds sdscatlen(sds s, const void *t, size_t len); 66 sds sdscat(sds s, const char *t); 67 sds sdscatsds(sds s, const sds t); 68 sds sdscpylen(sds s, const char *t, size_t len); 69 sds sdscpy(sds s, const char *t); 70 71 sds sdscatvprintf(sds s, const char *fmt, va_list ap); 72 #ifdef __GNUC__ 73 sds sdscatprintf(sds s, const char *fmt, ...) 74 __attribute__((format(printf, 2, 3))); 75 #else 76 sds sdscatprintf(sds s, const char *fmt, ...); 77 #endif 78 79 sds sdscatfmt(sds s, char const *fmt, ...); 80 sds sdstrim(sds s, const char *cset); 81 void sdsrange(sds s, int start, int end); 82 void sdsupdatelen(sds s); 83 void sdsclear(sds s); 84 int sdscmp(const sds s1, const sds s2); 85 sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count); 86 void sdsfreesplitres(sds *tokens, int count); 87 void sdstolower(sds s); 88 void sdstoupper(sds s); 89 sds sdsfromlonglong(long long value); 90 sds sdscatrepr(sds s, const char *p, size_t len); 91 sds *sdssplitargs(const char *line, int *argc); 92 sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen); 93 sds sdsjoin(char **argv, int argc, char *sep); 94 95 /* Low level functions exposed to the user API */ 96 sds sdsMakeRoomFor(sds s, size_t addlen); 97 void sdsIncrLen(sds s, int incr); 98 sds sdsRemoveFreeSpace(sds s); 99 size_t sdsAllocSize(sds s); 100 101 #ifdef REDIS_TEST 102 int sdsTest(int argc, char *argv[]); 103 #endif 104 105 #endif 106