/* 返回p指向的结点的前置结点
如果p指向的压缩表是空表,返回NULL,
如果p指向压缩表的表头结点,返回NULL */
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p) {
zlentry entry;
/*p指向压缩表的表尾,则p的前置结点就是压缩表的最后一个结点 */
if (p[0] == ZIP_END) {
p = ZIPLIST_ENTRY_TAIL(zl); /* 获得压缩表的最后一个结点*/
/* 如果获得的最后一个结点指向压缩表的表尾,说明压缩表为空,返回NULL,否则返回p */
return (p[0] == ZIP_END) ? NULL : p;
} else if (p == ZIPLIST_ENTRY_HEAD(zl)) { /* 如果p指向压缩表的第一个结点,则前置结点为空 */
return NULL;
} else {
entry = zipEntry(p); /* 获得p指向的结点信息 */
assert(entry.prevrawlen > 0); /* p的前置结点的长度大于0,即p有前置结点,程序继续,否则程序中断 */
return p - entry.prevrawlen; /* 返回p指向的前置结点的指针 */
}
}