/* 返回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指向的前置結點的指針 */
}
}