mirror of
https://github.com/fluencelabs/redis
synced 2025-06-28 16:31:33 +00:00
extracted general methods to zip.c for reuse in other zip* structures
This commit is contained in:
46
zip.c
Normal file
46
zip.c
Normal file
@ -0,0 +1,46 @@
|
||||
#define ZIP_BIGLEN 254
|
||||
#define ZIP_END 255
|
||||
|
||||
/* The following macro returns the number of bytes needed to encode the length
|
||||
* for the integer value _l, that is, 1 byte for lengths < ZIP_BIGLEN and
|
||||
* 5 bytes for all the other lengths. */
|
||||
#define ZIP_LEN_BYTES(_l) (((_l) < ZIP_BIGLEN) ? 1 : sizeof(unsigned int)+1)
|
||||
|
||||
/* Decode the encoded length pointed by 'p' */
|
||||
static unsigned int zipDecodeLength(unsigned char *p) {
|
||||
unsigned int len = *p;
|
||||
|
||||
if (len < ZIP_BIGLEN) return len;
|
||||
memcpy(&len,p+1,sizeof(unsigned int));
|
||||
return len;
|
||||
}
|
||||
|
||||
/* Encode the length 'l' writing it in 'p'. If p is NULL it just returns
|
||||
* the amount of bytes required to encode such a length. */
|
||||
static unsigned int zipEncodeLength(unsigned char *p, unsigned int len) {
|
||||
if (p == NULL) {
|
||||
return ZIP_LEN_BYTES(len);
|
||||
} else {
|
||||
if (len < ZIP_BIGLEN) {
|
||||
p[0] = len;
|
||||
return 1;
|
||||
} else {
|
||||
p[0] = ZIP_BIGLEN;
|
||||
memcpy(p+1,&len,sizeof(len));
|
||||
return 1+sizeof(len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Return the total amount used by an entry (encoded length + payload). */
|
||||
static unsigned int zipRawEntryLength(unsigned char *p) {
|
||||
unsigned int l = zipDecodeLength(p);
|
||||
return zipEncodeLength(NULL,l) + l;
|
||||
}
|
||||
|
||||
/* Resize the zip* structure. */
|
||||
static unsigned char *zipResize(unsigned char *z, unsigned int len) {
|
||||
z = zrealloc(z,len);
|
||||
z[len-1] = ZIP_END;
|
||||
return z;
|
||||
}
|
Reference in New Issue
Block a user