+static int rdbSaveLzfStringObject(FILE *fp, robj *obj) {
+ unsigned int comprlen, outlen;
+ unsigned char byte;
+ void *out;
+
+ /* We require at least four bytes compression for this to be worth it */
+ outlen = sdslen(obj->ptr)-4;
+ if (outlen <= 0) return 0;
+ if ((out = zmalloc(outlen)) == NULL) return 0;
+ comprlen = lzf_compress(obj->ptr, sdslen(obj->ptr), out, outlen);
+ if (comprlen == 0) {
+ free(out);
+ return 0;
+ }
+ /* Data compressed! Let's save it on disk */
+ byte = (REDIS_RDB_ENCVAL<<6)|REDIS_RDB_ENC_LZF;
+ if (fwrite(&byte,1,1,fp) == 0) goto writeerr;
+ if (rdbSaveLen(fp,comprlen) == -1) goto writeerr;
+ if (rdbSaveLen(fp,sdslen(obj->ptr)) == -1) goto writeerr;
+ if (fwrite(out,comprlen,1,fp) == 0) goto writeerr;
+ free(out);
+ return comprlen;
+
+writeerr:
+ free(out);
+ return -1;
+}
+