From 6205b46387ef47e0fcb9bd6c9f371c9eb5cdd7e5 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Sat, 22 May 2010 19:35:40 +0200 Subject: [PATCH] add function to retrieve length of ziplist --- ziplist.c | 18 ++++++++++++++++++ ziplist.h | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ziplist.c b/ziplist.c index 4907d07b..3dd3c1e8 100644 --- a/ziplist.c +++ b/ziplist.c @@ -388,6 +388,24 @@ unsigned int ziplistCompare(unsigned char *p, unsigned char *entry, unsigned int } } +/* Return length of ziplist. */ +unsigned int ziplistLen(unsigned char *zl) { + unsigned int len = 0; + if (ZIPLIST_LENGTH(zl) < ZIP_BIGLEN) { + len = ZIPLIST_LENGTH(zl); + } else { + unsigned char *p = zl+ZIPLIST_HEADER_SIZE; + while (*p != ZIP_END) { + p += zipRawEntryLength(p); + len++; + } + + /* Re-store length if small enough */ + if (len < ZIP_BIGLEN) ZIPLIST_LENGTH(zl) = len; + } + return len; +} + void ziplistRepr(unsigned char *zl) { unsigned char *p, encoding; unsigned int l, lsize; diff --git a/ziplist.h b/ziplist.h index 4b2d1c93..cea7f5de 100644 --- a/ziplist.h +++ b/ziplist.h @@ -9,4 +9,5 @@ unsigned char *ziplistNext(unsigned char *p); unsigned int ziplistGet(unsigned char *p, unsigned char **e, unsigned int *elen, long long *v); unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p); unsigned char *ziplistDeleteRange(unsigned char *zl, unsigned int index, unsigned int num); -unsigned int ziplistCompare(unsigned char *p, unsigned char *entry, unsigned int elen); \ No newline at end of file +unsigned int ziplistCompare(unsigned char *p, unsigned char *entry, unsigned int elen); +unsigned int ziplistLen(unsigned char *zl); \ No newline at end of file -- 2.47.2