Simplify CRC table generation
[oweals/busybox.git] / libbb / unzip.c
index ee746216d018ff0ba761bd8504da77886e706742..c28ca836c2b58899a84c0aadf9cd6d2cf5afe2c7 100644 (file)
@@ -115,30 +115,24 @@ static const unsigned short mask_bits[] = {
  * Signal and error handler.
  */
  
-static void abort_gzip()
+static void abort_gzip(void)
 {
        error_msg("gzip aborted\n");
        exit(ERROR);
 }
 
-static void make_crc_table()
+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
@@ -853,7 +847,7 @@ static int inflate_block(int *e)
  *
  * GLOBAL VARIABLES: outcnt, bk, bb, hufts, inptr
  */
-static int inflate()
+static int inflate(void)
 {
        int e;                          /* last block flag */
        int r;                          /* result code */
@@ -875,6 +869,14 @@ static int inflate()
                }
        } 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();