mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 17:10:50 +00:00
code to iterate over a ziplist
This commit is contained in:
parent
11ac6ff613
commit
08253bf42b
83
ziplist.c
83
ziplist.c
@ -107,6 +107,30 @@ unsigned char *ziplistPop(unsigned char *zl, sds *value, int where) {
|
|||||||
return zl;
|
return zl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns an offset to use for iterating with ziplistNext. */
|
||||||
|
unsigned char *ziplistIndex(unsigned char *zl, unsigned int index) {
|
||||||
|
unsigned char *p = zl+ZIPLIST_HEADER_SIZE;
|
||||||
|
unsigned int i = 0;
|
||||||
|
for (; i < index; i++) {
|
||||||
|
if (*p == ZIP_END) break;
|
||||||
|
p += zipRawEntryLength(p);
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store entry at current position in sds *value and return pointer
|
||||||
|
* to the next entry. */
|
||||||
|
unsigned char *ziplistNext(unsigned char *p, sds *value) {
|
||||||
|
if (*p == ZIP_END) return NULL;
|
||||||
|
if (value) {
|
||||||
|
unsigned int len;
|
||||||
|
len = zipDecodeLength(p);
|
||||||
|
*value = sdsnewlen(p+zipEncodeLength(NULL,len),len);
|
||||||
|
}
|
||||||
|
p += zipRawEntryLength(p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
void ziplistRepr(unsigned char *zl) {
|
void ziplistRepr(unsigned char *zl) {
|
||||||
unsigned char *p;
|
unsigned char *p;
|
||||||
unsigned int l;
|
unsigned int l;
|
||||||
@ -125,16 +149,20 @@ void ziplistRepr(unsigned char *zl) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ZIPLIST_TEST_MAIN
|
#ifdef ZIPLIST_TEST_MAIN
|
||||||
|
|
||||||
|
unsigned char *createList() {
|
||||||
|
unsigned char *zl = ziplistNew();
|
||||||
|
zl = ziplistPush(zl, (unsigned char*)"foo", 3, ZIPLIST_TAIL);
|
||||||
|
zl = ziplistPush(zl, (unsigned char*)"quux", 4, ZIPLIST_TAIL);
|
||||||
|
zl = ziplistPush(zl, (unsigned char*)"hello", 5, ZIPLIST_HEAD);
|
||||||
|
return zl;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
unsigned char *zl;
|
unsigned char *zl, *p;
|
||||||
sds s;
|
sds s;
|
||||||
|
|
||||||
zl = ziplistNew();
|
zl = createList();
|
||||||
zl = ziplistPush(zl, (unsigned char*)"foo", 3, ZIPLIST_TAIL);
|
|
||||||
ziplistRepr(zl);
|
|
||||||
zl = ziplistPush(zl, (unsigned char*)"quux", 4, ZIPLIST_TAIL);
|
|
||||||
ziplistRepr(zl);
|
|
||||||
zl = ziplistPush(zl, (unsigned char*)"hello", 5, ZIPLIST_HEAD);
|
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
|
zl = ziplistPop(zl, &s, ZIPLIST_TAIL);
|
||||||
@ -145,6 +173,47 @@ int main(int argc, char **argv) {
|
|||||||
printf("Pop head: %s (length %ld)\n", s, sdslen(s));
|
printf("Pop head: %s (length %ld)\n", s, sdslen(s));
|
||||||
ziplistRepr(zl);
|
ziplistRepr(zl);
|
||||||
|
|
||||||
|
printf("Iterate list from 0 to end:\n");
|
||||||
|
{
|
||||||
|
zl = createList();
|
||||||
|
p = ziplistIndex(zl, 0);
|
||||||
|
while ((p = ziplistNext(p, &s)) != NULL) {
|
||||||
|
printf("Entry: %s (length %ld)\n", s, sdslen(s));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Iterate list from 1 to end:\n");
|
||||||
|
{
|
||||||
|
zl = createList();
|
||||||
|
p = ziplistIndex(zl, 1);
|
||||||
|
while ((p = ziplistNext(p, &s)) != NULL) {
|
||||||
|
printf("Entry: %s (length %ld)\n", s, sdslen(s));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Iterate list from 2 to end:\n");
|
||||||
|
{
|
||||||
|
zl = createList();
|
||||||
|
p = ziplistIndex(zl, 2);
|
||||||
|
while ((p = ziplistNext(p, &s)) != NULL) {
|
||||||
|
printf("Entry: %s (length %ld)\n", s, sdslen(s));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Iterate starting out of range:\n");
|
||||||
|
{
|
||||||
|
zl = createList();
|
||||||
|
p = ziplistIndex(zl, 3);
|
||||||
|
if (ziplistNext(p, &s) == NULL) {
|
||||||
|
printf("No entry\n");
|
||||||
|
} else {
|
||||||
|
printf("ERROR\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user