X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/b7d3bf51575525c0475a13941d8eb44f4800b9cd..4c8bd905a0751c19279c98d2dbd681a08297e38e:/src/ziplist.c diff --git a/src/ziplist.c b/src/ziplist.c index 37c2c18f..639e4b61 100644 --- a/src/ziplist.c +++ b/src/ziplist.c @@ -67,11 +67,10 @@ #include #include #include "zmalloc.h" +#include "util.h" #include "ziplist.h" #include "endian.h" -int ll2string(char *s, size_t len, long long value); - #define ZIP_END 255 #define ZIP_BIGLEN 254 @@ -252,22 +251,9 @@ static int zipPrevLenByteDiff(unsigned char *p, unsigned int len) { * Stores the integer value in 'v' and its encoding in 'encoding'. */ static int zipTryEncoding(unsigned char *entry, unsigned int entrylen, long long *v, unsigned char *encoding) { long long value; - char *eptr; - char buf[32]; if (entrylen >= 32 || entrylen == 0) return 0; - if (entry[0] == '-' || (entry[0] >= '0' && entry[0] <= '9')) { - int slen; - - /* Perform a back-and-forth conversion to make sure that - * the string turned into an integer is not losing any info. */ - memcpy(buf,entry,entrylen); - buf[entrylen] = '\0'; - value = strtoll(buf,&eptr,10); - if (eptr[0] != '\0') return 0; - slen = ll2string(buf,32,value); - if (entrylen != (unsigned)slen || memcmp(buf,entry,slen)) return 0; - + if (string2ll((char*)entry,entrylen,&value)) { /* Great, the string can be encoded. Check what's the smallest * of our encoding types that can hold this value. */ if (value >= INT16_MIN && value <= INT16_MAX) { @@ -503,7 +489,9 @@ static unsigned char *__ziplistInsert(unsigned char *zl, unsigned char *p, unsig size_t offset; int nextdiff = 0; unsigned char encoding = 0; - long long value; + long long value = 123456789; /* initialized to avoid warning. Using a value + that is easy to see if for some reason + we use it uninitialized. */ zlentry entry, tail; /* Find out prevlen for the entry that is inserted. */