Redis设计与实现书中勘误-sdstrim函数解释错误
Redis 3.0 unstable 版本中,《Redis设计与实现》作者在书中写到
使用sdstrim函数后,sds字符串变为
源码中C的实现为
sds sdstrim(sds s, const char *cset) {
struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
char *start, *end, *sp, *ep;
size_t len;
// 设置和记录指针
sp = start = s;
ep = end = s+sdslen(s)-1;
// 修剪, T = O(N^2)
while(sp <= end && strchr(cset, *sp))
sp++;
while(ep > start && strchr(cset, *ep))
ep--;
// 计算 trim 完毕之后剩余的字符串长度
len = (sp > ep) ? 0 : ((ep-sp)+1);
// 如果有需要,前移字符串内容
// T = O(N)
if (sh->buf != sp) memmove(sh->buf, sp, len);
// 添加终结符
sh->buf[len] = '\0';
// 更新属性
sh->free = sh->free+(sh->len-len);
sh->len = len;
// 返回修剪后的 sds
return s;
}
其中,trim主要使用两个指针,sp和ep(开始指针和结束指针),由两个while控制
while(sp <= end && strchr(cset, *sp))
sp++;
while(ep > start && strchr(cset, *ep))
ep--;
这两个while只是将被修剪字符串的两边进行修剪,而碰到非修剪集合的字符指针不会移动。例如:
字符串:"XXXXYYXBXXXBXXXYYY" ,修剪集合 "XY"
修剪结果 "为BXXXB", 而不是"BB"