Simplify CRC table generation
[oweals/busybox.git] / libbb / unzip.c
index bb32891be46fec30d8c6315f5615a615dfad0961..c28ca836c2b58899a84c0aadf9cd6d2cf5afe2c7 100644 (file)
@@ -123,22 +123,16 @@ static void abort_gzip(void)
 
 static void make_crc_table(void)
 {
-       unsigned long table_entry;      /* crc shift register */
-       unsigned long poly = 0;      /* polynomial exclusive-or pattern */
-       int i;                /* counter for all possible eight bit values */
-       int k;                /* byte being shifted into crc apparatus */
-
-       /* terms of polynomial defining this crc (except x^32): */
-       static int p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+       const unsigned long poly = 0xedb88320;      /* polynomial exclusive-or pattern */
+       unsigned short i;                /* counter for all possible eight bit values */
 
        crc_table = (unsigned long *) malloc(256 * sizeof(unsigned long));
 
-       /* Make exclusive-or pattern from polynomial (0xedb88320) */
-       for (i = 0; i < sizeof(p)/sizeof(int); i++)
-               poly |= 1L << (31 - p[i]);
-
        /* Compute and print table of CRC's, five per line */
        for (i = 0; i < 256; i++) {
+               unsigned long table_entry;      /* crc shift register */
+               char k; /* byte being shifted into crc apparatus */
+
                table_entry = i;
           /* The idea to initialize the register with the byte instead of
             * zero was stolen from Haruhiko Okumura's ar002
@@ -875,6 +869,14 @@ static int inflate(void)
                }
        } while (!e);
 
+       /* Undo too much lookahead. The next read will be byte aligned so we
+        * can discard unused bits in the last meaningful byte.
+        */
+       while (bk >= 8) {
+               bk -= 8;
+               ungetc((bb << bk), in_file);
+       }
+
        /* flush out window */
        flush_window();