SDS是redis最基本的数据类型,/src/sds.h和/src/sds.c
源码如下,过几天传到git上
/* SDSLib, A C dynamic strings library
*
* Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __SDS_H
#define __SDS_H
#define SDS_MAX_PREALLOC (1024*1024)
#include <sys/types.h>
#include <stdarg.h>
typedef char *sds;
struct sdshdr {
int len; //buf已占用的长度,即当前字符串长度值
int free; //buf空余可用的长度,append时使用
char buf[]; //实际保存字符串数据
};
/* 常量时间内获取长度,直接返回sds的len字段 */
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->len;
}
/* sds中可用的长度,直接返回sds中free字段 */
static inline size_t sdsavail(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->free;
}
/* 根据新长度创建SDS;
@init:C字符串
@initlen:C字符串长度
*/
sds sdsnewlen(const void *init, size_t initlen);
/* 创建SDS;
若传入参数不为空,在其中调用sdsnewlen
*/
sds sdsnew(const char *init);
/* 创建空SDS;
*/
sds sdsempty(void);
/* 常量时间内获取长度,直接返回sds的len字段;
*/
size_t sdslen(const sds s);
/* 字符串复制;
*/
sds sdsdup(const sds s);
/* 释放SDS;
*/
void sdsfree(sds s);
/* 常量时间内获取sds可用长度,直接返回sds的free字段;
*/
size_t sdsavail(const sds s);
/* 将给定的sds扩展到指定长度,剩余用'\0'补
*/
sds sdsgrowzero(sds s, size_t len);
/* 将给定sds扩展到指定长度,将t追加到末尾
*/
sds sdscatlen(sds s, const void *t, size_t len);
/* 调用sdscatlen,将t追加到末尾
*/
sds sdscat(sds s, const char *t);
/* 调用sdscatlen,将sds追加到末尾
*/
sds sdscatsds(sds s, const sds t);
/* 将t复制到s上,先判断长度是否足够,不够先扩容在复制
*/
sds sdscpylen(sds s, const char *t, size_t len);
/* 调用sdscpylen,将t复制到s上
*/
sds sdscpy(sds s, const char *t);