Add changes from the Linux-2.6 tree.
[linux-2.6.git] / fs / jffs2 / compr_rtime.c
index a72ce67..2eb1b74 100644 (file)
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: compr_rtime.c,v 1.11 2003/10/04 08:33:06 dwmw2 Exp $
+ * $Id: compr_rtime.c,v 1.14 2004/06/23 16:34:40 havasi Exp $
  *
  *
  * Very simple lz77-ish encoder.
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/errno.h>
-#include <linux/string.h> 
+#include <linux/string.h>
+#include <linux/jffs2.h>
+#include "compr.h"
 
 /* _compress returns the compressed size, -1 if bigger */
-int jffs2_rtime_compress(unsigned char *data_in, unsigned char *cpage_out, 
-                  uint32_t *sourcelen, uint32_t *dstlen)
+static int jffs2_rtime_compress(unsigned char *data_in,
+                               unsigned char *cpage_out,
+                               uint32_t *sourcelen, uint32_t *dstlen,
+                               void *model)
 {
        short positions[256];
        int outpos = 0;
        int pos=0;
 
-       memset(positions,0,sizeof(positions)); 
-       
+       memset(positions,0,sizeof(positions));
+
        while (pos < (*sourcelen) && outpos <= (*dstlen)-2) {
                int backpos, runlen=0;
                unsigned char value;
-               
+
                value = data_in[pos];
 
                cpage_out[outpos++] = data_in[pos++];
-               
+
                backpos = positions[value];
                positions[value]=pos;
-               
+
                while ((backpos < pos) && (pos < (*sourcelen)) &&
                       (data_in[pos]==data_in[backpos++]) && (runlen<255)) {
                        pos++;
@@ -59,33 +63,35 @@ int jffs2_rtime_compress(unsigned char *data_in, unsigned char *cpage_out,
                /* We failed */
                return -1;
        }
-       
+
        /* Tell the caller how much we managed to compress, and how much space it took */
        *sourcelen = pos;
        *dstlen = outpos;
        return 0;
-}                 
+}
 
 
-void jffs2_rtime_decompress(unsigned char *data_in, unsigned char *cpage_out,
-                     uint32_t srclen, uint32_t destlen)
+static int jffs2_rtime_decompress(unsigned char *data_in,
+                                 unsigned char *cpage_out,
+                                 uint32_t srclen, uint32_t destlen,
+                                 void *model)
 {
        short positions[256];
        int outpos = 0;
        int pos=0;
-       
-       memset(positions,0,sizeof(positions)); 
-       
+
+       memset(positions,0,sizeof(positions));
+
        while (outpos<destlen) {
                unsigned char value;
                int backoffs;
                int repeat;
-               
+
                value = data_in[pos++];
                cpage_out[outpos++] = value; /* first the verbatim copied byte */
                repeat = data_in[pos++];
                backoffs = positions[value];
-               
+
                positions[value]=outpos;
                if (repeat) {
                        if (backoffs + repeat >= outpos) {
@@ -95,10 +101,32 @@ void jffs2_rtime_decompress(unsigned char *data_in, unsigned char *cpage_out,
                                }
                        } else {
                                memcpy(&cpage_out[outpos],&cpage_out[backoffs],repeat);
-                               outpos+=repeat;         
+                               outpos+=repeat;
                        }
                }
-       }               
-}                 
+       }
+        return 0;
+}
 
+static struct jffs2_compressor jffs2_rtime_comp = {
+    .priority = JFFS2_RTIME_PRIORITY,
+    .name = "rtime",
+    .compr = JFFS2_COMPR_RTIME,
+    .compress = &jffs2_rtime_compress,
+    .decompress = &jffs2_rtime_decompress,
+#ifdef JFFS2_RTIME_DISABLED
+    .disabled = 1,
+#else
+    .disabled = 0,
+#endif
+};
 
+int jffs2_rtime_init(void)
+{
+    return jffs2_register_compressor(&jffs2_rtime_comp);
+}
+
+void jffs2_rtime_exit(void)
+{
+    jffs2_unregister_compressor(&jffs2_rtime_comp);
+}