/* 将p指向的结点的值和长度为slen的sstr比较,
相等:返回1,
不等:返回0
*/
unsigned char ziplistCompare(unsigned char *p, unsigned char *sstr, unsigned int slen)
{
zlentry entry;
unsigned char sencoding;
long long zval, sval;
entry = zipEntry(p); /* 获得p指向的结点信息保存在entry中 */
if (ZIP_IS_STR(entry.encoding)) { /* 根据entry结点的编码类型判断entry结点是否是字符串
如果是的话,就进行字符串的比较 */
/* 如果字符串的长度相等,进行字符串值的比较,否则直接不等 */
if (entry.len == slen) {
return memcmp(p + entry.headersize, sstr, slen) == 0;
} else {
return 0;
}
} else { /* 如果entry结点保存的值是整数,将sstr字符串保存的字符串值转换为整数,
函数zipTryEncoding功能:转换成功返回1,转换失败返回0。
转换成功,sval中保存转换后的整数(long long类型),sencoding中保存该整数的编码类型 */
if (zipTryEncoding(sstr, slen, &sval, &sencoding)) {
/* 函数zipLoadInteger功能:将第一个参数,即p + entry.headersize指向的字符串,
按照第二个参数,即entry.encoding的编码方式取出,返回一个最大字节长度的整型数
(long long类型) */
zval = zipLoadInteger(p + entry.headersize, entry.encoding);
return zval == sval; /* 返回两个整型数的比较结果 */
}
/* 如果sstr转换整数失败,说明sstr中保存的是纯粹的字符串,整数和字符串不等,返回0 */
}
return 0; /* 若函数到此没有返回,即两者不等,返回0 */
}