SDS是一个动态字符串库,主要用于字符串操作。
SDS模块功能特性
==》支持字符串基本操作(new, free, dup, cpy, append, add, trim, cmp, range, split, join, lower, upper, map, repr)
==》支持字符串实际长度和剩余长度统计
==》支持二进制(字符串)安全操作(new, free, dup, cpy, cmp, append, range)
==》支持字符串动态扩展(性能优化)
注:这里的二进制安全操作指的是可以不是字符串,比如一个对象。
SDS模块结构体
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
};
SDS模块内部接口
sds sdsMakeRoomFor(sds s, size_t addlen);
扩充sds s字符串尾部空余字节。扩充规则是原sds s字符串两倍或者sds s长度加上SDS_MAX_PREALLOC
void sdsIncrLen(sds s, int incr);
修正sds s字符串增加incr长度后字符串末尾NULL和sds相关数据结构的操作
sds sdsRemoveFreeSpace(sds s);
缩减sds扩充的尾部空余字节,100%成功
size_t sdsAllocSize(sds s);
获取sds字符串总共占用的空间字节数
SDS代码阅读中需要理解的部分内部函数
sds sdscatvprintf(sds s, const char *fmt, va_list ap);
将格式化字符串追加到sds字符串末尾
int sdsll2str(char *s, long long value)
long long类型转化为字符串的函数,这里写死了LLSTR长度为21个字符,主要是longlong的范围最大是20位,加上一个NULL,正好是21位。
long long的最大值: 9223372036854775807 -- 19位
long long的最小值:-9223372036854775808 -- 20位
#define SDS_LLSTR_SIZE 21 /* 含NULL结尾字符串 */
SDS模块基本接口
static inline size_t sdslen(const sds s)
获取sds字符串长度
static inline size_t sdsavail(const sds s)
获取sds字符串剩余空间
sds sdsnewlen(const void *init, size_t initlen);
用init指针新建一个sds安全字符串
sds sdsnew(const char *init);
新建一个ASCII字符串初始化的sds字符串
sds sdsempty(void);
新建一个空sds字符串
sds sdsdup(const sds s);
复制一个sds字符串
void sdsfree(sds s);
释放一个sds字符串
sds sdsgrowzero(sds s, size_t len);
扩充sds字符串至len长度,剩余空间初始化为0
sds sdscatlen(sds s, const void *t, size_t len);
追加sds字符串至len长度,剩余空间追加为t所指向的len长度内容
sds sdscat(sds s, const char *t);
追加一个NULL结尾字符串到sds字符串末尾
sds sdscatsds(sds s, const sds t);
追加sds t字符串到sds s字符串末尾
sds sdscpylen(sds s, const char *t, size_t len);
将字符串t复制到sds字符串
sds sdscpy(sds s, const char *t);
将NULL结尾字符串t复制到sds字符串
sds sdscatprintf(sds s, const char *fmt, ...);
将格式化字符串追加到sds字符串末尾
sds sdscatfmt(sds s, char const *fmt, ...);
sdscatprintf性能优化版本
sds sdstrim(sds s, const char *cset);
将sds字符串左右两边属于cset字符串的字符裁剪掉
void sdsrange(sds s, int start, int end);
将sds字符串内容更新为[start, end]范围的sds字符串内容
void sdsupdatelen(sds s);
更新sds字符串内部状态数据(字符长度,剩余空间)
void sdsclear(sds s);
清空sds字符串内部数据(状态数据清理,内容尚未真正清零)
int sdscmp(const sds s1, const sds s2);
sds字符串比较函数,类似memcmp
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
字符串分割函数,返回count大小的sds字符串数组
sds *sdssplitargs(const char *line, int *argc);
参数分割函数,返回arc大小的sds字符串数组
void sdsfreesplitres(sds *tokens, int count);
释放sdssplitlen,sdssplitargs分割出来的sds字符串数组
void sdstolower(sds s);
sds字符串变更全小写
void sdstoupper(sds s);
sds字符串变更全大写
sds sdsfromlonglong(long long value);
将value转换为sds字符串
sds sdscatrepr(sds s, const char *p, size_t len);
将p指向的字符串转换为人可阅读的追加到sds后面
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
sds字符串内按照[from, to]的字符map映射进行转换
sds sdsjoin(char **argv, int argc, char *sep);
将字符串用分隔符连接(sep),返回sds字符串