inflate: make in-core inflate share common CRC code Signed-off-by: Matt Mackall <[EMAIL PROTECTED]>
Index: 2.6.14/lib/inflate.c =================================================================== --- 2.6.14.orig/lib/inflate.c 2005-10-28 22:04:32.000000000 -0700 +++ 2.6.14/lib/inflate.c 2005-10-28 22:04:35.000000000 -0700 @@ -144,23 +144,46 @@ static void free(void *where) malloc_ptr = free_mem_ptr; } -static u8 INITDATA window[0x8000]; /* use a statically allocated window */ +static u8 window[0x8000]; /* use a statically allocated window */ + +/* simple CRC calculation */ +static u32 crc_32_tab[256]; +#define CRCPOLY_LE 0xedb88320 + +static void makecrc(void) +{ + unsigned i, j; + u32 c = 1; + + for (i = 128; i; i >>= 1) { + c = (c >> 1) ^ ((c & 1) ? CRCPOLY_LE : 0); + for (j = 0; j < 256; j += 2 * i) + crc_32_tab[i + j] = c ^ crc_32_tab[j]; + } +} + +static u32 crc32_le(u32 crc, unsigned char const *p, size_t len) +{ + while (len--) + crc = crc_32_tab[(*p++ ^ crc) & 0xff] ^ (crc >> 8); + + return crc; +} #else #include <linux/module.h> +#include <linux/crc32.h> static u8 *window; /* dynamically allocate */ #define malloc(a) kmalloc(a, GFP_KERNEL) #define free(a) kfree(a) +#define makecrc() #define INIT __init #define INITDATA __initdata #endif -static u32 crc_32_tab[256]; -#define CRCPOLY_LE 0xedb88320 - /* Huffman code lookup table entry--this entry is four bytes for machines that have 16-bit pointers (e.g. PC's in the small or medium model). Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16 @@ -205,12 +228,7 @@ static int INIT inflate(struct iostate * static void flush_output(struct iostate *io) { - int i; - - for (i = 0; i < io->opos; i++) - io->crc = crc_32_tab[(io->window[i] ^ (int)io->crc) & 0xff] - ^ (io->crc >> 8); - + io->crc = crc32_le(io->crc, io->window, io->opos); io->flush(io->window, io->opos); io->ototal += io->opos; io->opos = 0; @@ -906,24 +924,6 @@ static int INIT inflate(struct iostate * return 0; } -/********************************************************************** - * - * The following are support routines for inflate.c - * - **********************************************************************/ - -static void INIT makecrc(void) -{ - unsigned i, j; - u32 c = 1; - - for (i = 128; i; i >>= 1) { - c = (c >> 1) ^ ((c & 1) ? CRCPOLY_LE : 0); - for (j = 0; j < 256; j += 2 * i) - crc_32_tab[i + j] = c ^ crc_32_tab[j]; - } -} - /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */ #define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */