+/* Delete one or more entries from the ziplist. */
+unsigned char *ziplistDelete(unsigned char *zl, unsigned int index, unsigned int num) {
+ unsigned char *p, *first = ziplistIndex(zl, index);
+ unsigned int i, deleted = 0, totlen, newlen;
+ for (p = first, i = 0; *p != ZIP_END && i < num; i++) {
+ p += zipRawEntryLength(p);
+ deleted++;
+ }
+
+ totlen = p-first;
+ if (totlen > 0) {
+ /* Move current tail to the new tail when there *is* a tail */
+ if (*p != ZIP_END) memmove(first,p,ZIPLIST_BYTES(zl)-(p-zl)-1);
+
+ /* Resize and update length */
+ zl = ziplistResize(zl, ZIPLIST_BYTES(zl)-totlen);
+ if (ZIPLIST_LENGTH(zl) < ZIP_BIGLEN) ZIPLIST_LENGTH(zl) -= deleted;
+ }
+ return zl;
+}
+