lib/lzo: separate lzo-rle from lzo
[linux-2.6-block.git] / lib / lzo / lzo1x_compress.c
index 89cd561201ff8bc4373016461e34107b538068c5..4525fb09484427297853ca5819dcfaffee9265f1 100644 (file)
@@ -20,7 +20,8 @@
 static noinline size_t
 lzo1x_1_do_compress(const unsigned char *in, size_t in_len,
                    unsigned char *out, size_t *out_len,
-                   size_t ti, void *wrkmem, signed char *state_offset)
+                   size_t ti, void *wrkmem, signed char *state_offset,
+                   const unsigned char bitstream_version)
 {
        const unsigned char *ip;
        unsigned char *op;
@@ -46,7 +47,7 @@ next:
                        break;
                dv = get_unaligned_le32(ip);
 
-               if (dv == 0) {
+               if (dv == 0 && bitstream_version) {
                        const unsigned char *ir = ip + 4;
                        const unsigned char *limit = ip_end
                                < (ip + MAX_ZERO_RUN_LENGTH + 1)
@@ -284,30 +285,36 @@ finished_writing_instruction:
        return in_end - (ii - ti);
 }
 
-int lzo1x_1_compress(const unsigned char *in, size_t in_len,
+int lzogeneric1x_1_compress(const unsigned char *in, size_t in_len,
                     unsigned char *out, size_t *out_len,
-                    void *wrkmem)
+                    void *wrkmem, const unsigned char bitstream_version)
 {
        const unsigned char *ip = in;
        unsigned char *op = out;
        size_t l = in_len;
        size_t t = 0;
        signed char state_offset = -2;
+       unsigned int m4_max_offset;
 
        // LZO v0 will never write 17 as first byte,
        // so this is used to version the bitstream
-       *op++ = 17;
-       *op++ = LZO_VERSION;
+       if (bitstream_version > 0) {
+               *op++ = 17;
+               *op++ = bitstream_version;
+               m4_max_offset = M4_MAX_OFFSET_V1;
+       } else {
+               m4_max_offset = M4_MAX_OFFSET_V0;
+       }
 
        while (l > 20) {
-               size_t ll = l <= (M4_MAX_OFFSET + 1) ? l : (M4_MAX_OFFSET + 1);
+               size_t ll = l <= (m4_max_offset + 1) ? l : (m4_max_offset + 1);
                uintptr_t ll_end = (uintptr_t) ip + ll;
                if ((ll_end + ((t + ll) >> 5)) <= ll_end)
                        break;
                BUILD_BUG_ON(D_SIZE * sizeof(lzo_dict_t) > LZO1X_1_MEM_COMPRESS);
                memset(wrkmem, 0, D_SIZE * sizeof(lzo_dict_t));
-               t = lzo1x_1_do_compress(ip, ll, op, out_len,
-                                       t, wrkmem, &state_offset);
+               t = lzo1x_1_do_compress(ip, ll, op, out_len, t, wrkmem,
+                                       &state_offset, bitstream_version);
                ip += ll;
                op += *out_len;
                l  -= ll;
@@ -351,7 +358,24 @@ int lzo1x_1_compress(const unsigned char *in, size_t in_len,
        *out_len = op - out;
        return LZO_E_OK;
 }
+
+int lzo1x_1_compress(const unsigned char *in, size_t in_len,
+                    unsigned char *out, size_t *out_len,
+                    void *wrkmem)
+{
+       return lzogeneric1x_1_compress(in, in_len, out, out_len, wrkmem, 0);
+}
+
+int lzorle1x_1_compress(const unsigned char *in, size_t in_len,
+                    unsigned char *out, size_t *out_len,
+                    void *wrkmem)
+{
+       return lzogeneric1x_1_compress(in, in_len, out, out_len,
+                                      wrkmem, LZO_VERSION);
+}
+
 EXPORT_SYMBOL_GPL(lzo1x_1_compress);
+EXPORT_SYMBOL_GPL(lzorle1x_1_compress);
 
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("LZO1X-1 Compressor");