+/* Delete a single entry from the ziplist, pointed to by *p.
+ * Also update *p in place, to be able to iterate over the
+ * ziplist, while deleting entries. */
+unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p) {
+ unsigned int offset = *p-zl, tail, len;
+ len = zipRawEntryLength(*p);
+ tail = ZIPLIST_BYTES(zl)-offset-len-1;
+
+ /* Move current tail to the new tail when there *is* a tail */
+ if (tail > 0) memmove(*p,*p+len,tail);
+
+ /* Resize and update length */
+ zl = ziplistResize(zl, ZIPLIST_BYTES(zl)-len);
+ if (ZIPLIST_LENGTH(zl) < ZIP_BIGLEN) ZIPLIST_LENGTH(zl)--;
+
+ /* Store new pointer to current element in p.
+ * This needs to be done because zl can change on realloc. */
+ *p = zl+offset;
+ return zl;
+}
+