redis sds sdscatvprintf()函数详解
这个函数的作用是把ap里的数据格式化后拼接到s参数的后面。下面我们具体分析函数每一行代码的意义。
/* Like sdscatprintf() but gets va_list instead of being variadic. */
sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
va_list cpy; //定义一个可变参数cpy
char staticbuf[1024], *buf = staticbuf, *t; //定义以下要用到的变量
size_t buflen = strlen(fmt)*2; //先将buf的长度定义成格式化字符串(fmt是格式化字符串如:"%s,%d,%d,%c")的2倍
//如果buf的长度大于上面定义好的staticbuf那么staticbuf将不使用,
//重新分配一个新的内存给buf
if (buflen > sizeof(staticbuf)) { //buf的长度大于事先给定的staticbuf数组的长度
buf = s_malloc(buflen); //buf原来指向staticbuf,现在重新分配不再指向staticbuf。
if (buf == NULL) return NULL; //分配失败返回NULL
} else {
buflen = sizeof(staticbuf); //buf的长度不大于staticbuf,那么buf还是指向staticbuf,buflen的值由原来的strlen(fmt)*2改为staticbuf的长度也就是1024字节。
}
/* Try with buffers two times bigger every time we fail to
* fit the string in the