Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6
[pandora-kernel.git] / fs / jffs2 / compr_rubin.c
index e792e67..c73fa89 100644 (file)
@@ -1,23 +1,94 @@
 /*
  * JFFS2 -- Journalling Flash File System, Version 2.
  *
- * Copyright (C) 2001, 2002 Red Hat, Inc.
+ * Copyright © 2001-2007 Red Hat, Inc.
  *
  * Created by Arjan van de Ven <arjanv@redhat.com>
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: compr_rubin.c,v 1.20 2004/06/23 16:34:40 havasi Exp $
- *
  */
 
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/jffs2.h>
-#include "compr_rubin.h"
-#include "histo_mips.h"
+#include <linux/errno.h>
 #include "compr.h"
 
+
+#define RUBIN_REG_SIZE   16
+#define UPPER_BIT_RUBIN    (((long) 1)<<(RUBIN_REG_SIZE-1))
+#define LOWER_BITS_RUBIN   ((((long) 1)<<(RUBIN_REG_SIZE-1))-1)
+
+
+#define BIT_DIVIDER_MIPS 1043
+static int bits_mips[8] = { 277,249,290,267,229,341,212,241}; /* mips32 */
+
+#include <linux/errno.h>
+
+struct pushpull {
+       unsigned char *buf;
+       unsigned int buflen;
+       unsigned int ofs;
+       unsigned int reserve;
+};
+
+struct rubin_state {
+       unsigned long p;
+       unsigned long q;
+       unsigned long rec_q;
+       long bit_number;
+       struct pushpull pp;
+       int bit_divider;
+       int bits[8];
+};
+
+static inline void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve)
+{
+       pp->buf = buf;
+       pp->buflen = buflen;
+       pp->ofs = ofs;
+       pp->reserve = reserve;
+}
+
+static inline int pushbit(struct pushpull *pp, int bit, int use_reserved)
+{
+       if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) {
+               return -ENOSPC;
+       }
+
+       if (bit) {
+               pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7)));
+       }
+       else {
+               pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7)));
+       }
+       pp->ofs++;
+
+       return 0;
+}
+
+static inline int pushedbits(struct pushpull *pp)
+{
+       return pp->ofs;
+}
+
+static inline int pullbit(struct pushpull *pp)
+{
+       int bit;
+
+       bit = (pp->buf[pp->ofs >> 3] >> (7-(pp->ofs & 7))) & 1;
+
+       pp->ofs++;
+       return bit;
+}
+
+static inline int pulledbits(struct pushpull *pp)
+{
+       return pp->ofs;
+}
+
+
 static void init_rubin(struct rubin_state *rs, int div, int *bits)
 {
        int c;
@@ -313,7 +384,7 @@ static int jffs2_rubinmips_decompress(unsigned char *data_in,
                                      void *model)
 {
        rubin_do_decompress(BIT_DIVIDER_MIPS, bits_mips, data_in, cpage_out, sourcelen, dstlen);
-        return 0;
+       return 0;
 }
 
 static int jffs2_dynrubin_decompress(unsigned char *data_in,
@@ -328,7 +399,7 @@ static int jffs2_dynrubin_decompress(unsigned char *data_in,
                bits[c] = data_in[c];
 
        rubin_do_decompress(256, bits, data_in+8, cpage_out, sourcelen-8, dstlen);
-        return 0;
+       return 0;
 }
 
 static struct jffs2_compressor jffs2_rubinmips_comp = {