}
/* Return pointer to next entry in ziplist. */
-unsigned char *ziplistNext(unsigned char *p) {
+unsigned char *ziplistNext(unsigned char *zl, unsigned char *p) {
+ ((void) zl);
return (p[0] == ZIP_END) ? NULL : p+zipRawEntryLength(p);
}
/* Return pointer to previous entry in ziplist. */
-unsigned char *ziplistPrev(unsigned char *p) {
- zlentry entry = zipEntry(p);
- return (entry.prevrawlen == 0) ? NULL : p-entry.prevrawlen;
+unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p) {
+ zlentry entry;
+
+ /* Iterating backwards from ZIP_END should return the tail. When "p" is
+ * equal to the first element of the list, we're already at the head,
+ * and should return NULL. */
+ if (p[0] == ZIP_END) {
+ p = ZIPLIST_ENTRY_TAIL(zl);
+ return (p[0] == ZIP_END) ? NULL : p;
+ } else if (p == ZIPLIST_ENTRY_HEAD(zl)) {
+ return NULL;
+ } else {
+ entry = zipEntry(p);
+ return p-entry.prevrawlen;
+ }
}
/* Get entry pointer to by 'p' and store in either 'e' or 'v' depending
} else {
printf("%lld", value);
}
- p = ziplistNext(p);
+ p = ziplistNext(zl,p);
printf("\n");
}
printf("\n");
} else {
printf("%lld", value);
}
- p = ziplistNext(p);
+ p = ziplistNext(zl,p);
printf("\n");
}
printf("\n");
} else {
printf("%lld", value);
}
- p = ziplistNext(p);
+ p = ziplistNext(zl,p);
printf("\n");
}
printf("\n");
} else {
printf("%lld", value);
}
- p = ziplistPrev(p);
+ p = ziplistPrev(zl,p);
printf("\n");
}
printf("\n");
} else {
printf("%lld", value);
}
- zl = ziplistDelete(zl, &p, ZIPLIST_HEAD);
+ zl = ziplistDelete(zl,&p);
+ p = ziplistPrev(zl,p);
printf("\n");
}
printf("\n");
unsigned char *ziplistPush(unsigned char *zl, char *s, unsigned int slen, int where);
unsigned char *ziplistPop(unsigned char *zl, sds *target, int where);
unsigned char *ziplistIndex(unsigned char *zl, int index);
-unsigned char *ziplistNext(unsigned char *p);
-unsigned char *ziplistPrev(unsigned char *p);
+unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
+unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
unsigned int ziplistGet(unsigned char *p, char **sstr, unsigned int *slen, long long *sval);
unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, char *s, unsigned int slen);
unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p, int direction);